diff --git a/crates/zclaw-pipeline/src/types.rs b/crates/zclaw-pipeline/src/types.rs index 6e774de..28e5949 100644 --- a/crates/zclaw-pipeline/src/types.rs +++ b/crates/zclaw-pipeline/src/types.rs @@ -38,6 +38,10 @@ pub struct PipelineMetadata { #[serde(default)] pub category: Option, + /// Industry classification (e.g., "internet", "finance", "healthcare") + #[serde(default)] + pub industry: Option, + /// Description of what this pipeline does #[serde(default)] pub description: Option, diff --git a/desktop/coverage/base.css b/desktop/coverage/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/desktop/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/desktop/coverage/block-navigation.js b/desktop/coverage/block-navigation.js new file mode 100644 index 0000000..530d1ed --- /dev/null +++ b/desktop/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/desktop/coverage/coverage-final.json b/desktop/coverage/coverage-final.json new file mode 100644 index 0000000..61d645a --- /dev/null +++ b/desktop/coverage/coverage-final.json @@ -0,0 +1,228 @@ +{"G:\\ZClaw_openfang\\desktop\\dist\\assets\\index-BHNSny5A.js": {"path":"G:\\ZClaw_openfang\\desktop\\dist\\assets\\index-BHNSny5A.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":21342}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":75}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":1009}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":15}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":336}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":698}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":37}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":134095}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":133702}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":39}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":42}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":38}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":30}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":11}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":110761}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":36}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":154}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":163}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":105}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":34}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":201}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":23}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":212}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1696}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":159}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":61}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":463}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":58}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1467}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1502}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":724}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1429}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1519}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":10}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":412}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":86}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":63}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":34}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":198}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":5}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":58098}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":79}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":9}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1864}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":53}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":0}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":169}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":15}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":34}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":17}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":170}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":0}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":9364}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":2071}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":32}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":0}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":11}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":22}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":42}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":23}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":30}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":0}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":209}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":39}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":43}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":0}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":55}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":20}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":2056}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":97}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":382}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":0}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":1835}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":0}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":2674}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":926}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1185}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":112}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":29}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":841}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":136}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":114}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":28}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":37}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":99}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18170}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":0}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":7}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":47}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":61}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":4}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":2331}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":32851}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":188}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":0}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":0}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":7}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":0}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":36}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":10}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":6}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":8}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":7}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":39}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":7}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":4}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":0}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":5}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":0}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":22}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":19}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":0}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":10}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":12}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":128}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":29}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":0}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":62}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":0}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":4}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":11}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":78345}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":193}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":149}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":5226}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":22}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":31}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":22}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":9}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":58954}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":33}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":10852}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":60}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":20}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":2125}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":2985}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":75}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":18}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":68739}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":88407}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":108538}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":12}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":141}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":253}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":27}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":58}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":56}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":1174}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":246}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":320}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":25}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":65}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":38}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":82}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":47}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":59}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":13}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":24}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":11}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":1040}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":51}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":62}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":27}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":65}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":32}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":25}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":0}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":74}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":55}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":46}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":41}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":34}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":0}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":55}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":21}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":25}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":57}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":58}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":15}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":20}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":30}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":13}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":11}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":0}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":28}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":9}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":7}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":888}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":51}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":64}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":27}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":0}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":31}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":54}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":57}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":0}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":57}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":26}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":27}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":20}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":21}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":15}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":11}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":11}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":23}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":7}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":913}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":60}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":62}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":27}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":31}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":28}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":30}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":51}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":0}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":46}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":25}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":96}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":19}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":11}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":0}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":26}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":31}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":74}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":39}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":43}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":13}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":11}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":0}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":25}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":39}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":11}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":0}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":801}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":41}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":60}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":53}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":0}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":53}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":0}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":26}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":25}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":54}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":80}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":88}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":9}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":0}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":28}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":55}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":24}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":57}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":62}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":88}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":56}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":31}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":11}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":9}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":0}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":33}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":7}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":2875}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":353}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":430}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":85}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":1273}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":77}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":2764}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":46}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":67}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":49}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":28}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":76}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":55}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":61}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":13}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":24}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":13}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":9}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":25036}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":137}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":0}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5606}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":0}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":1227}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1025839},"end":{"line":364,"column":1227}},"locations":[{"start":{"line":1,"column":1025839},"end":{"line":364,"column":1227}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1025839},"end":{"line":364,"column":1227}},"loc":{"start":{"line":1,"column":1025839},"end":{"line":364,"column":1227}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\download-openfang.ts": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\download-openfang.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":70}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":37}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":36}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":81}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":45}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":66}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":46}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":37}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":14}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":43}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":51}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":8}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":18}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":43}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":43}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":43}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":45}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":43}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":8}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":14}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":43}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":48}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":48}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":45}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":48}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":48}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":8}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":66}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":33}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":37}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":65}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":51}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":57}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":71}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":60}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":30}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":44}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":30}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":53}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":46}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":46}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":37}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":30}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":50}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":31}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":63}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":7}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":41}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":95}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":28}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":8}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":12}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":85}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":33}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":43}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":40}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":47}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":52}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":104}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":3}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":1}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":33}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":68}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":20}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":13}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":92}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":6}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":39}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":122}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":69}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":16}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":42}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":40}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":65}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":36}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":17}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":17}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":53}}},"s":{"0":0,"7":0,"8":0,"9":0,"10":0,"11":0,"13":0,"14":0,"17":0,"18":0,"25":0,"26":0,"27":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"79":0,"80":0,"81":0,"84":0,"85":0,"86":0,"87":0,"90":0,"92":0,"94":0,"96":0,"98":0,"99":0,"100":0,"101":0,"102":0,"104":0,"105":0,"108":0,"111":0,"112":0,"113":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"146":0,"147":0,"149":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":150,"column":-74}},"locations":[{"start":{"line":1,"column":0},"end":{"line":150,"column":-74}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":150,"column":-74}},"loc":{"start":{"line":1,"column":0},"end":{"line":150,"column":-74}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\prepare-openclaw-runtime.mjs": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\prepare-openclaw-runtime.mjs","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":50}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":41}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":50}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":43}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":50}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":87}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":50}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":0}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":23}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":55}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":1}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":0}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":46}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":43}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":9}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":63}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":9}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":35}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":15}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":44}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":81}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":61}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":0}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":42}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":83}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":0}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":31}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":44}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":34}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":3}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":71}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":71}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":0}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":0}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":45}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":52}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":34}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":0}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":78}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":42}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":49}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":34}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":75}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":23}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":0}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":63}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":72}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":0}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":40}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":32}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":11}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":0}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":48}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":75}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":3}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":1}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":36}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":20}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":34}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":65}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":7}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":17}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":73}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":0}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":25}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":47}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":56}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":54}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":64}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":58}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":0}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":51}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":46}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":61}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":47}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":49}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":0}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":75}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":81}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":20}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":22}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":17}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":6}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":39}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":41}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":63}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":40}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":39}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":41}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":34}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":0}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":31}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":11}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":0}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":47}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":34}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":74}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":65}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":81}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":30}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":109}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":0}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":67}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":1}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":0}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":73}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":57}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":18}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":167,"column":-976}},"locations":[{"start":{"line":1,"column":0},"end":{"line":167,"column":-976}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":167,"column":-976}},"loc":{"start":{"line":1,"column":0},"end":{"line":167,"column":-976}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\prepare-openfang-runtime.mjs": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\prepare-openfang-runtime.mjs","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":3}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":38}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":2}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":56}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":49}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":2}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":46}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":56}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":70}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":60}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":29}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":41}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":74}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":43}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":50}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":87}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":50}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":65}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":55}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":0}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":62}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":45}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":56}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":30}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":19}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":12}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":35}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":60}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":8}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":35}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":61}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":8}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":51}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":60}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":32}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":52}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":61}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":32}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":8}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":6}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":12}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":12}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":56}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":65}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":8}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":57}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":66}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":32}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":0}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":24}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":57}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":0}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":72}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":20}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":3}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":38}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":44}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":17}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":34}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":78}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":0}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":7}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":31}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":56}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":44}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":52}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":25}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":44}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":0}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":78}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":50}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":11}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":14}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":0}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":52}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":32}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":37}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":25}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":0}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":31}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":59}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":56}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":52}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":30}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":24}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":27}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":15}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":1}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":0}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":48}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":45}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":3}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":33}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":69}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":50}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":57}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":70}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":64}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":67}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":0}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":40}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":43}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":39}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":43}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":31}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":0}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":15}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":54}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":16}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":3}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":0}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":35}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":47}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":0}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":7}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":59}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":86}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":38}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":63}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":0}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":22}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":32}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":41}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":49}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":15}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":109}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":28}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":8}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":12}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":36}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":84}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":0}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":43}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":48}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":64}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":105}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":6}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":0}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":38}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":52}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":5}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":0}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":58}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":68}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":56}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":0}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":40}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":50}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":44}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":40}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":7}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":55}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":46}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":30}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":31}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":44}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":5}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":0}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":23}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":31}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":35}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":0}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":48}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":28}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":17}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":56}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":29}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":37}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":33}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":5}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":16}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":1}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":0}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":3}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":34}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":41}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":15}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":57}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":11}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":3}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":47}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":59}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":40}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":0}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":28}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":29}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":34}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":0}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":39}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":1}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":0}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":25}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":32}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":15}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":41}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":11}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":3}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":0}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":20}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":13}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":33}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":56}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":49}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":53}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":39}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":41}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":65}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":24}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":28}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":69}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":16}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":42}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":40}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":6}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":15}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":19}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":17}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":6}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":4}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":0}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":69}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":76}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":46}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":1}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":3}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":41}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":39}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":15}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":49}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":11}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":3}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":0}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":21}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":23}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":16}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":54}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":37}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":7}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":17}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":78}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":0}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":18}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":22}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":52}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":50}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":51}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":7}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":15}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":53}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":47}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":30}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":0}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":34}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":1}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":3}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":35}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":3}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":28}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":20}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":37}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":41}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":41}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":4}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":29}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":27}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":19}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":42}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":14}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":55}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":38}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":7}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":3}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":1}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":0}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":16}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":17}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":22}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":38}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":22}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":0}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":37}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":41}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":38}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":30}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":0}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":31}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":20}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":0}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":32}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":38}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":19}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":49}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":35}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":10}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":39}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":21}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":53}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":37}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":12}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":56}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":48}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":35}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":51}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":18}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":32}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":84}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":75}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":95}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":24}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":7}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":5}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":3}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":0}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":27}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":24}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":31}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":0}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":22}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":15}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":52}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":10}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":45}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":3}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":22}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":1}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":0}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":7}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":423,"column":-1513}},"locations":[{"start":{"line":1,"column":0},"end":{"line":423,"column":-1513}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":423,"column":-1513}},"loc":{"start":{"line":1,"column":0},"end":{"line":423,"column":-1513}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\preseed-tauri-tools.mjs": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\preseed-tauri-tools.mjs","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":100}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":25}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":29}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":41}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":47}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":50}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":50}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":61}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":44}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":54}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":81}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":101}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":69}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":48}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":1}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":0}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":52}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":42}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":32}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":65}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":57}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":0}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":65}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":62}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":61}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":5}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":55}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":65}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":83}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":47}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":37}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":14}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":80}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":93}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":59}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":72}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":56}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":66}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":74}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":1}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":0}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":45}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":17}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":15}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":131}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":51}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":40}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":5}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":65}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":32}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":23}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":1}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":0}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":54}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":26}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":34}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":66}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":38}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":5}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":34}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":32}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":51}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":1}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":40}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":91}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":64}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":14}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":1}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":0}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":34}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":49}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":48}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":75}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":75}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":1}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":28}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":27}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":39}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":40}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":58}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":44}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":51}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":48}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":7}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":5}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":0}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":47}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":0}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":44}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":57}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":70}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":7}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":27}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":39}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":44}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":49}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":49}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":58}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":44}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":66}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":70}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":7}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":5}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":0}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":3}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":89}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":89}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":48}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":89}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":7}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":43}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":55}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":55}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":0}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":48}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":43}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":88}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":124}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":42}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":57}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":46}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":124}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":42}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":64}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":46}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":14}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":0}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":53}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":78}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":54}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":29}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":0}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":42}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":49}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":22}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":51}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":7}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":53}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":49}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":59}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":31}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":44}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":51}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":22}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":56}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":7}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":53}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":5}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":29}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":133}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":0}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":74}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":69}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":26}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":36}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":88}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":98}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":0}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":45}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":3}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":0}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":30}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":23}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":76}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":55}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":27}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":40}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":40}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":33}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":33}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":0}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":20}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":56}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":0}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":40}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":1}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":0}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":23}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":73}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":26}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":67}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":88}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":94}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":85}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":92}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":1}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":15}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":15}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":1}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":0}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":46}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":41}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":36}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":13}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":0}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":24}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":7}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":55}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":85}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":41}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":98}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":55}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":66}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":61}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":22}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":31}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":64}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":57}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":9}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":7}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":5}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":13}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":78}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":68}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":1}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":13}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":29}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":296,"column":-1827}},"locations":[{"start":{"line":1,"column":0},"end":{"line":296,"column":-1827}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":296,"column":-1827}},"loc":{"start":{"line":1,"column":0},"end":{"line":296,"column":-1827}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\tauri-build-bundled.mjs": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\tauri-build-bundled.mjs","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":47}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":29}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":41}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":50}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":43}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":50}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":42}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":44}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":43}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":40}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":10}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":21}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":18}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":6}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":0}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":65}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":32}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":0}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":23}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":15}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":100}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":86}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":118}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":104}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":0}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":54}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":61}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":-217}},"locations":[{"start":{"line":1,"column":0},"end":{"line":40,"column":-217}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":40,"column":-217}},"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":-217}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\test-api-connection.mjs": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\test-api-connection.mjs","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":3}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":46}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":2}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":31}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":2}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":9}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":78}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":41}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":66}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":3}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":31}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":0}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":31}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":35}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":28}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":17}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":2}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":0}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":33}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":51}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":32}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":49}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":48}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":30}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":45}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":0}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":73}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":67}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":78}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":39}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":3}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":20}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":38}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":12}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":13}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":2}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":0}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":78}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":41}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":43}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":73}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":0}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":31}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":7}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":13}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":32}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":16}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":43}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":8}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":58}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":47}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":52}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":28}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":44}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":0}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":9}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":43}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":61}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":5}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":0}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":100}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":0}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":12}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":27}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":30}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":38}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":44}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":0}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":21}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":16}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":34}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":15}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":17}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":69}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":6}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":3}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":1}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":0}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":44}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":71}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":79}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":0}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":26}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":38}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":81}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":39}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":0}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":71}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":0}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":22}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":11}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":9}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":26}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":30}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":28}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":24}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":4}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":0}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":38}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":3}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":0}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":54}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":0}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":29}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":42}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":10}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":29}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":42}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":23}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":27}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":17}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":13}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":28}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":9}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":0}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":19}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":21}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":60}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":65}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":28}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":26}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":123}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":6}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":0}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":40}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":59}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":62}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":51}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":5}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":0}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":42}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":52}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":3}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":0}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":16}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":1}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":0}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":3}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":28}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":3}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":45}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":35}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":33}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":25}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":0}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":34}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":0}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":38}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":22}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":17}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":28}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":22}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":51}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":20}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":32}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":43}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":25}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":38}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":11}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":7}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":23}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":0}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":25}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":22}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":30}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":19}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":17}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":28}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":22}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":51}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":22}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":44}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":43}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":24}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":11}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":7}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":7}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":0}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":31}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":22}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":24}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":30}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":17}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":28}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":22}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":51}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":42}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":43}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":25}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":31}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":11}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":7}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":7}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":5}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":1}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":21}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":3}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":20}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":38}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":0}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":56}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":78}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":0}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":42}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":90}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":67}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":28}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":0}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":16}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":66}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":58}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":3}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":0}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":20}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":49}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":73}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":10}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":14}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":73}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":25}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":4}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":0}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":34}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":53}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":41}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":73}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":58}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":47}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":5}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":3}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":0}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":29}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":20}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":43}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":50}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":3}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":0}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":31}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":51}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":1}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":0}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":3}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":20}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":3}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":30}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":56}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":45}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":46}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":20}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":0}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":46}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":30}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":46}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":43}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":0}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":54}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":24}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":41}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":0}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":55}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":39}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":0}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":46}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":20}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":46}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":37}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":0}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":54}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":24}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":35}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":0}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":57}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":55}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":11}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":25}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":24}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":6}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":58}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":5}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":0}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":46}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":23}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":46}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":36}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":0}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":52}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":34}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":5}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":0}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":53}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":11}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":24}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":28}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":23}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":6}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":57}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":5}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":0}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":65}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":34}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":0}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":65}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":35}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":31}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":5}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":0}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":68}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":31}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":5}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":0}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":26}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":74}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":55}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":35}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":5}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":0}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":91}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":38}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":0}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":24}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":73}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":36}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":5}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":0}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":72}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":35}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":0}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":46}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":25}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":46}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":38}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":0}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":54}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":42}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":5}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":0}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":60}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":43}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":0}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":60}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":37}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":46}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":5}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":0}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":46}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":26}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":46}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":39}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":0}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":58}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":37}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":5}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":0}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":59}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":11}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":23}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":20}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":28}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":6}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":34}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":5}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":0}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":74}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":37}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":5}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":0}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":74}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":29}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":34}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":5}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":0}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":77}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":34}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":5}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":0}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":46}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":24}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":46}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":37}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":0}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":57}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":34}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":5}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":0}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":66}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":45}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":5}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":0}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":71}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":49}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":5}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":0}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":46}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":35}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":46}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":44}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":0}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":54}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":35}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":5}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":0}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":63}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":37}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":5}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":0}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":46}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":24}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":46}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":37}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":0}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":52}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":34}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":5}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":0}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":72}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":34}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":43}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":5}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":0}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":46}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":27}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":46}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":40}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":0}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":60}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":38}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":5}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":0}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":61}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":11}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":28}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":16}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":6}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":35}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":5}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":0}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":77}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":38}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":5}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":0}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":46}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":24}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":46}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":37}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":0}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":58}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":40}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":5}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":0}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":61}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":42}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":5}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":0}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":46}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":26}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":46}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":40}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":0}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":58}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":37}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":5}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":0}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":46}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":23}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":46}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":37}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":0}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":74}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":62}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":56}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":37}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":13}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":37}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":37}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":22}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":4}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":26}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":0}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":25}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":29}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":23}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":111}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":5}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":10}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":29}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":25}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":28}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":24}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":18}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":28}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":30}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":7}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":23}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":111}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":54}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":5}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":3}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":0}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":18}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":17}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":1}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":0}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":12}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":32}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":55}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":18}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":3}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":595,"column":-82}},"locations":[{"start":{"line":1,"column":0},"end":{"line":595,"column":-82}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":595,"column":-82}},"loc":{"start":{"line":1,"column":0},"end":{"line":595,"column":-82}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\scripts\\test-toml-parsing.mjs": {"path":"G:\\ZClaw_openfang\\desktop\\scripts\\test-toml-parsing.mjs","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":3}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":29}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":38}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":26}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":18}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":21}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":22}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":16}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":35}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":23}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":27}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":0}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":32}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":26}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":0}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":23}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":13}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":0}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":2}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":46}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":28}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":52}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":50}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":38}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":76}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":86}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":70}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":0}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":26}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":71}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":71}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":98}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":106}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":89}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":83}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":46}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":17}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":63}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":18}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":0}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":39}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":58}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":62}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":38}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":84}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":38}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":65}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":90}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":28}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":62}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":7}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":7}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":0}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":46}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":41}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":62}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":55}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":45}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":53}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":0}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":69}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":1}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":0}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":58}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":104,"column":-60}},"locations":[{"start":{"line":1,"column":0},"end":{"line":104,"column":-60}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":104,"column":-60}},"loc":{"start":{"line":1,"column":0},"end":{"line":104,"column":-60}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\App.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\App.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":58}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":56}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":21}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":61}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":49}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":53}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":70}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":58}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":75}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":65}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":61}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":55}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":75}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":67}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":45}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":57}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":61}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":63}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":49}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":49}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":43}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":61}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":83}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":56}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":45}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":95}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":53}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":63}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":103}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":58}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":10}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":74}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":56}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":66}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":57}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":12}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":10}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":49}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":79}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":86}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":59}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":76}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":62}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":66}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":85}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":68}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":102}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":55}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":45}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":57}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":53}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":62}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":62}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":102}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":70}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":55}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":66}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":45}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":81}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":86}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":9}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":82}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":64}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":43}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":30}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":35}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":46}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":11}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":35}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":66}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":44}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":32}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":38}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":81}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":59}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":53}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":22}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":32}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":38}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":54}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":32}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":23}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":35}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":11}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":31}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":59}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":57}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":93}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":52}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":65}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":79}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":38}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":68}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":55}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":33}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":63}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":11}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":74}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":9}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":27}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":53}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":51}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":45}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":51}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":25}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":11}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":44}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":65}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":31}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":37}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":35}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":31}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":40}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":33}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":11}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":13}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":64}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":56}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":63}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":27}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":31}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":34}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":12}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":71}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":28}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":71}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":9}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":65}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":73}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":57}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":59}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":15}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":66}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":58}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":65}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":29}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":24}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":33}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":14}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":64}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":25}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":74}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":11}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":39}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":65}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":21}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":69}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":30}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":19}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":52}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":30}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":5}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":4}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":16}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":18}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":49}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":60}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":7}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":6}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":53}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":53}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":19}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":41}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":31}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":7}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":21}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":23}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":32}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":60}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":45}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":15}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":7}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":29}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":4}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":56}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":4}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":31}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":22}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":31}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":4}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":48}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":50}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":15}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":26}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":32}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":4}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":28}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":61}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":56}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":23}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":12}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":28}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":21}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":30}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":15}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":78}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":46}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":25}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":61}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":29}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":34}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":31}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":28}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":40}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":80}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":33}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":33}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":62}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":17}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":40}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":33}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":44}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":48}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":57}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":72}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":70}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":27}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":19}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":15}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":13}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":25}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":79}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":11}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":25}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":29}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":29}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":13}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":35}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":10}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":43}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":8}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":3}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":10}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":99}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":14}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":50}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":47}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":39}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":39}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":33}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":8}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":60}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":15}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":23}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":56}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":10}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":37}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":22}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":33}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":35}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":29}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":29}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":23}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":42}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":69}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":49}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":25}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":41}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":33}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":33}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":50}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":35}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":27}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":46}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":28}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":54}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":91}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":27}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":70}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":123}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":56}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":84}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":126}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":25}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":51}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":29}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":27}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":69}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":123}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":55}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":84}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":126}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":25}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":54}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":29}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":24}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":58}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":56}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":105}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":70}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":24}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":22}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":27}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":54}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":33}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":68}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":18}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":47}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":25}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":41}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":33}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":33}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":50}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":34}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":27}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":48}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":25}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":41}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":33}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":33}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":50}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":31}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":27}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":26}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":24}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":26}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":12}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":19}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":31}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":50}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":18}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":22}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":21}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":24}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":36}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":34}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":37}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":35}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":42}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":8}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":37}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":10}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":1}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":19}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"69":0,"70":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"108":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"133":0,"136":0,"137":0,"139":0,"140":0,"142":0,"143":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"153":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"169":0,"170":0,"171":0,"173":0,"176":0,"177":0,"178":0,"181":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"234":0,"235":0,"236":0,"238":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"249":0,"251":0,"252":0,"255":0,"257":0,"258":0,"259":0,"260":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"280":0,"281":0,"282":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"303":0,"304":0,"305":0,"308":0,"309":0,"310":0,"311":0,"312":0,"314":0,"315":0,"316":0,"317":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"358":0,"359":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"370":0,"372":0,"373":0,"374":0,"375":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"395":0,"396":0,"397":0,"398":0,"399":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"410":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"423":0,"424":0,"426":0,"427":0,"428":0,"430":0,"432":0,"433":0,"435":0,"436":0,"437":0,"438":0,"439":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"457":0,"458":0,"460":0,"462":0,"463":0,"464":0,"467":0,"468":0,"469":0,"470":0,"472":0,"473":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"485":0,"486":0,"488":0,"490":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":491,"column":-3832}},"locations":[{"start":{"line":1,"column":0},"end":{"line":491,"column":-3832}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":491,"column":-3832}},"loc":{"start":{"line":1,"column":0},"end":{"line":491,"column":-3832}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src-tauri\\target\\debug\\build\\desktop-db285a9d1e393983\\out\\__global-api-script.js": {"path":"G:\\ZClaw_openfang\\desktop\\src-tauri\\target\\debug\\build\\desktop-db285a9d1e393983\\out\\__global-api-script.js","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":248}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":248}},"locations":[{"start":{"line":1,"column":0},"end":{"line":1,"column":248}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":248}},"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":248}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ActiveLearningPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ActiveLearningPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":88}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":55}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":53}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":54}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":52}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":53}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":78}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":44}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":38}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":42}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":41}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":2}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":62}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":49}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":46}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":10}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":37}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":36}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":78}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":81}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":9}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":62}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":40}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":78}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":30}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":87}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":16}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":98}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":105}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":33}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":68}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":41}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":12}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":93}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":64}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":36}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":50}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":12}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":1}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":82}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":73}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":10}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":43}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":40}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":40}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":28}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":36}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":170}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":46}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":77}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":40}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":93}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":97}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":73}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":60}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":14}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":52}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":62}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":44}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":17}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":62}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":40}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":12}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":83}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":42}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":48}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":99}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":9}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":11}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":11}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":21}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":22}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":13}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":14}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":31}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":34}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":77}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":45}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":51}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":62}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":25}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":71}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":34}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":24}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":73}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":36}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":48}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":64}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":42}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":42}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":17}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":91}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":14}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":36}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":41}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":43}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":27}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":29}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":10}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":46}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":30}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":38}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":106}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":59}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":94}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":55}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":29}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":85}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":46}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":20}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":18}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":51}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":29}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":38}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":72}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":70}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":82}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":46}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":21}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":16}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":14}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":19}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":17}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":30}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":38}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":106}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":110}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":47}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":13}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":48}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":39}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":86}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":78}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":16}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":89}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":78}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":39}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":93}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":78}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":39}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":63}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":55}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":79}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":16}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":14}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":74}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":70}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":17}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":21}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":45}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":76}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":31}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":88}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":97}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":15}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":43}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":38}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":40}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":19}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":11}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":12}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":33}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":37}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":43}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":23}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":31}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":38}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":38}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":35}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":35}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":48}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":27}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":58}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":32}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":49}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":34}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":52}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":33}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":39}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":43}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":72}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":76}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":20}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":25}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":38}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":23}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":26}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":38}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":38}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":35}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":43}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":27}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":54}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":32}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":49}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":34}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":18}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":42}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":28}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":34}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":33}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":69}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":20}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":18}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":25}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":40}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":23}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":28}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":38}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":38}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":35}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":35}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":45}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":27}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":59}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":32}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":50}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":34}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":18}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":46}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":108}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":26}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":31}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":67}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":44}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":52}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":120}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":78}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":65}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":54}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":120}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":30}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":132}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":66}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":31}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":28}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":103}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":85}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":53}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":28}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":33}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":18}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":26}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":12}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":108}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":66}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":77}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":14}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":108}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":40}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":17}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":12}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":10}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":1}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":48}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":62}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":32}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":63}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":66}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":45}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":1}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":35}}},"s":{"0":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"84":0,"85":0,"86":0,"87":0,"89":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"99":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"140":0,"141":0,"142":0,"144":0,"152":0,"153":0,"154":0,"156":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"178":0,"179":0,"180":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"347":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"390":0,"392":0,"394":0,"395":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"405":0,"406":0,"407":0,"409":0,"413":0,"414":0,"416":0,"417":0,"418":0,"419":0,"420":0,"422":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":423,"column":-7752}},"locations":[{"start":{"line":1,"column":0},"end":{"line":423,"column":-7752}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":423,"column":-7752}},"loc":{"start":{"line":1,"column":0},"end":{"line":423,"column":-7752}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\AgentOnboardingWizard.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\AgentOnboardingWizard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":41}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":16}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":22}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":12}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":2}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":64}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":66}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":66}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":67}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":64}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":2}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":99}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":93}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":52}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":76}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":67}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":89}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":35}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":20}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":95}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":57}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":27}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":32}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":25}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":9}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":63}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":49}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":40}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":41}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":9}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":14}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":13}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":41}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":47}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":13}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":30}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":42}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":9}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":36}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":46}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":14}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":46}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":9}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":13}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":25}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":47}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":17}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":26}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":36}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":65}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":52}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":36}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":37}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":13}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":46}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":54}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":36}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":49}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":38}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":57}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":46}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":42}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":43}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":8}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":40}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":68}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":14}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":51}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":32}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":46}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":49}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":7}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":13}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":51}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":42}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":46}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":42}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":13}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":51}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":40}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":40}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":42}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":13}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":86}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":94}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":89}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":23}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":78}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":9}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":35}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":26}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":29}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":20}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":33}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":7}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":13}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":31}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":4}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":62}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":10}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":73}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":10}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":65}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":25}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":8}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":145}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":123}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":51}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":97}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":66}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":18}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":17}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":82}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":19}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":70}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":80}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":18}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":16}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":17}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":29}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":104}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":37}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":19}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":14}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":95}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":51}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":41}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":41}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":55}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":56}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":22}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":72}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":25}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":33}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":84}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":53}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":34}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":113}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":58}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":81}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":95}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":22}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":100}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":48}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":36}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":55}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":83}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":24}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":15}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":16}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":14}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":52}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":39}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":23}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":31}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":45}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":44}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":44}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":35}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":37}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":18}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":52}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":91}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":25}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":76}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":24}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":24}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":103}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":66}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":28}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":26}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":33}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":47}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":79}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":41}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":36}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":197}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":99}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":24}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":22}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":41}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":87}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":59}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":41}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":26}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":24}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":23}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":103}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":26}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":33}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":47}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":79}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":49}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":241}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":22}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":24}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":19}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":37}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":18}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":52}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":91}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":25}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":76}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":24}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":24}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":23}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":103}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":70}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":28}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":26}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":33}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":48}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":80}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":43}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":36}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":197}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":100}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":24}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":22}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":42}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":87}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":59}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":42}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":26}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":24}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":23}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":103}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":28}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":26}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":33}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":48}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":80}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":48}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":241}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":22}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":24}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":23}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":103}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":28}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":26}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":33}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":52}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":84}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":41}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":241}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":22}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":24}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":19}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":37}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":18}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":52}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":91}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":25}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":76}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":24}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":24}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":23}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":103}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":72}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":28}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":32}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":44}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":71}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":22}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":38}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":87}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":59}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":38}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":26}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":24}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":40}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":103}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":68}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":28}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":40}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":50}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":89}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":22}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":44}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":87}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":59}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":44}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":26}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":24}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":19}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":37}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":18}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":52}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":91}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":25}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":76}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":24}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":24}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":31}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":46}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":81}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":37}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":20}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":40}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":85}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":57}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":40}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":24}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":19}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":37}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":18}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":52}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":91}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":25}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":76}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":24}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":24}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":23}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":103}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":28}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":26}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":33}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":51}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":83}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":68}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":251}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":22}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":62}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":24}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":24}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":50}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":117}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":27}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":89}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":28}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":80}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":28}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":28}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":29}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":37}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":93}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":38}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":77}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":96}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":26}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":29}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":40}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":105}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":28}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":83}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":26}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":31}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":26}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":24}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":40}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":103}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":28}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":29}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":44}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":76}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":54}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":30}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":253}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":22}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":24}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":68}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":91}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":25}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":55}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":63}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":82}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":90}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":52}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":91}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":28}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":72}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":46}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":72}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":28}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":65}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":57}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":31}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":36}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":94}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":32}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":33}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":27}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":28}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":26}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":24}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":50}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":149}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":65}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":66}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":26}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":48}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":141}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":71}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":76}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":26}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":19}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":25}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":28}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":14}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":123}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":17}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":25}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":30}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":40}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":245}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":47}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":19}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":51}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":43}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":21}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":29}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":34}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":145}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":15}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":52}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":23}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":21}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":29}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":38}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":66}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":165}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":30}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":20}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":64}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":21}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":50}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":20}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":49}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":21}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":20}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":49}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":21}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":23}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":16}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":14}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":12}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":10}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":1}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":37}}},"s":{"0":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"141":0,"143":0,"144":0,"145":0,"148":0,"149":0,"150":0,"151":0,"152":0,"155":0,"156":0,"157":0,"160":0,"161":0,"162":0,"163":0,"165":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"206":0,"207":0,"208":0,"209":0,"212":0,"215":0,"217":0,"218":0,"219":0,"221":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"236":0,"238":0,"240":0,"241":0,"243":0,"244":0,"245":0,"246":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"271":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"305":0,"306":0,"307":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"329":0,"330":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"352":0,"354":0,"355":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"370":0,"371":0,"372":0,"373":0,"375":0,"376":0,"378":0,"379":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"401":0,"403":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"416":0,"417":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"432":0,"433":0,"434":0,"435":0,"437":0,"438":0,"440":0,"441":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"457":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"473":0,"474":0,"478":0,"479":0,"480":0,"481":0,"483":0,"484":0,"486":0,"487":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"500":0,"504":0,"505":0,"506":0,"507":0,"509":0,"510":0,"512":0,"513":0,"515":0,"516":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"528":0,"529":0,"531":0,"532":0,"533":0,"534":0,"536":0,"537":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"559":0,"560":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"573":0,"574":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"603":0,"604":0,"605":0,"606":0,"607":0,"609":0,"610":0,"611":0,"612":0,"613":0,"615":0,"617":0,"618":0,"619":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"629":0,"631":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"641":0,"642":0,"644":0,"645":0,"646":0,"647":0,"648":0,"650":0,"651":0,"652":0,"654":0,"655":0,"656":0,"657":0,"659":0,"661":0,"662":0,"664":0,"666":0,"668":0,"669":0,"670":0,"671":0,"673":0,"675":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":676,"column":-14101}},"locations":[{"start":{"line":1,"column":0},"end":{"line":676,"column":-14101}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":676,"column":-14101}},"loc":{"start":{"line":1,"column":0},"end":{"line":676,"column":-14101}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ApprovalsPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ApprovalsPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":72}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":16}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":14}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":70}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":4}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":12}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":81}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":13}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":14}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":77}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":13}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":14}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":69}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":12}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":70}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":2}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":8}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":46}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":11}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":81}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":87}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":44}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":68}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":69}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":59}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":20}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":64}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":20}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":58}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":19}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":63}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":23}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":11}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":12}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":11}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":64}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":55}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":50}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":30}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":49}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":49}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":26}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":12}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":4}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":36}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":116}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":67}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":57}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":57}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":35}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":79}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":33}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":17}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":68}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":46}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":63}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":14}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":13}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":78}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":63}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":50}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":13}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":27}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":15}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":27}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":69}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":12}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":70}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":137}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":63}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":14}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":65}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":71}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":13}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":67}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":66}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":14}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":39}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":70}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":14}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":40}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":19}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":32}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":61}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":36}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":210}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":20}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":21}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":12}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":38}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":19}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":42}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":121}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":21}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":36}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":61}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":141}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":16}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":41}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":49}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":17}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":50}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":35}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":169}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":29}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":62}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":53}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":19}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":17}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":34}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":35}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":240}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":47}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":19}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":10}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":1}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":59}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":82}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":10}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":22}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":18}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":35}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":6}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":14}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":34}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":6}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":15}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":23}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":32}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":6}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":15}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":23}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":32}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":6}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":14}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":23}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":32}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":6}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":4}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":50}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":10}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":121}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":57}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":12}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":76}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":15}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":10}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":79}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":10}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":10}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":1}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":34}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":53}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":61}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":69}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":53}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":60}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":72}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":19}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":36}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":27}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":26}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":11}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":42}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":17}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":30}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":7}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":23}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":4}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":35}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":43}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":26}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":11}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":51}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":17}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":30}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":7}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":6}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":23}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":4}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":27}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":17}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":53}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":18}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":26}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":68}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":70}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":70}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":68}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":4}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":44}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":12}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":39}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":79}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":64}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":12}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":3}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":10}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":31}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":57}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":13}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":78}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":15}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":66}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":14}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":14}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":15}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":41}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":30}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":122}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":24}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":60}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":49}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":12}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":17}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":12}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":91}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":80}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":29}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":24}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":27}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":40}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":34}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":45}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":12}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":11}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":12}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":41}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":38}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":35}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":48}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":25}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":31}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":33}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":39}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":37}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":57}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":14}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":13}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":14}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":10}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":1}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":30}}},"s":{"0":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"83":0,"85":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"160":0,"161":0,"162":0,"165":0,"166":0,"167":0,"168":0,"172":0,"173":0,"174":0,"175":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"188":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"215":0,"216":0,"217":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"229":0,"231":0,"232":0,"234":0,"235":0,"236":0,"237":0,"238":0,"240":0,"242":0,"243":0,"245":0,"247":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"276":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"291":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"304":0,"305":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"332":0,"333":0,"334":0,"335":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"348":0,"349":0,"350":0,"352":0,"353":0,"355":0,"357":0,"358":0,"360":0,"361":0,"362":0,"364":0,"365":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"374":0,"375":0,"377":0,"378":0,"380":0,"381":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"397":0,"398":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"412":0,"414":0,"416":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":417,"column":-5261}},"locations":[{"start":{"line":1,"column":0},"end":{"line":417,"column":-5261}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":417,"column":-5261}},"loc":{"start":{"line":1,"column":0},"end":{"line":417,"column":-5261}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\AuditLogsPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\AuditLogsPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":53}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":7}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":37}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":41}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":23}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":21}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":7}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":11}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":55}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":37}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":51}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":1}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":81}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":24}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":44}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":42}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":1}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":62}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":39}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":29}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":23}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":29}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":31}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":47}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":33}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":37}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":37}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":27}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":43}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":6}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":45}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":61}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":12}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":22}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":17}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":11}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":11}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":18}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":50}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":49}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":58}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":24}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":27}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":49}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":1}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":82}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":55}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":40}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":40}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":15}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":31}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":12}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":31}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":27}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":1}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":97}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":77}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":75}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":45}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":16}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":95}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":7}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":4}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":75}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":73}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":49}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":20}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":95}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":4}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":10}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":77}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":11}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":91}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":16}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":36}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":16}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":33}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":77}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":44}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":159}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":31}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":16}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":33}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":75}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":42}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":159}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":29}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":12}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":14}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":12}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":11}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":91}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":16}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":15}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":18}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":41}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":43}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":22}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":81}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":13}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":157}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":37}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":44}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":20}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":13}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":17}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":12}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":11}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":91}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":16}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":15}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":18}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":37}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":43}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":22}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":77}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":13}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":157}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":18}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":34}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":46}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":21}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":21}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":13}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":17}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":12}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":11}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":91}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":16}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":15}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":40}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":43}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":99}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":13}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":157}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":42}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":50}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":50}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":12}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":13}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":25}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":175}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":7}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":15}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":1}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":6}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":10}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":11}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":21}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":14}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":24}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":10}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":118}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":62}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":92}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":15}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":27}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":84}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":35}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":17}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":12}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":33}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":13}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":103}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":105}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":14}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":13}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":100}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":85}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":14}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":13}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":99}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":91}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":14}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":13}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":100}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":69}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":117}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":14}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":41}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":50}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":44}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":45}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":21}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":31}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":17}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":14}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":32}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":15}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":111}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":105}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":16}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":27}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":15}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":106}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":100}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":16}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":27}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":15}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":106}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":109}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":16}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":64}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":15}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":108}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":94}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":52}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":18}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":81}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":110}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":44}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":15}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":32}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":108}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":91}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":43}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":19}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":16}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":32}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":109}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":91}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":51}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":19}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":16}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":44}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":34}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":109}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":96}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":18}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":17}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":41}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":47}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":218}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":28}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":62}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":46}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":59}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":19}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":34}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":56}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":87}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":79}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":16}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":62}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":45}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":58}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":53}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":46}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":77}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":23}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":20}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":95}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":74}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":104}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":18}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":14}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":12}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":10}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":1}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":112}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":74}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":10}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":67}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":106}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":40}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":54}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":11}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":68}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":40}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":58}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":19}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":78}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":127}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":72}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":44}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":76}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":82}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":124}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":17}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":52}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":79}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":21}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":46}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":43}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":72}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":32}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":50}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":20}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":16}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":11}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":12}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":39}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":67}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":61}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":47}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":12}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":1}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":34}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":57}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":65}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":64}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":29}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":41}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":51}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":56}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":59}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":85}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":102}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":56}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":56}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":50}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":84}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":50}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":57}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":19}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":29}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":29}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":19}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":57}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":64}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":5}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":41}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":48}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":36}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":39}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":32}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":44}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":45}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":7}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":12}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":43}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":42}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":6}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":18}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":38}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":52}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":34}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":57}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":82}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":5}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":32}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":53}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":80}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":5}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":36}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":75}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":5}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":32}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":83}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":5}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":24}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":64}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":5}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":28}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":44}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":33}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":50}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":52}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":81}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":8}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":5}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":16}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":38}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":44}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":37}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":54}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":22}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":33}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":7}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":7}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":39}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":25}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":47}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":43}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":31}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":29}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":34}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":5}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":26}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":9}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":41}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":33}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":9}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":73}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":25}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":32}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":9}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":62}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":54}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":36}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":44}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":41}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":45}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":36}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":46}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":8}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":42}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":76}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":53}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":7}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":13}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":67}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":99}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":76}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":29}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":23}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":33}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":70}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":45}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":36}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":54}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":9}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":21}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":35}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":7}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":15}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":28}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":5}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":26}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":46}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":47}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":17}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":14}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":65}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":24}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":6}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":21}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":45}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":46}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":17}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":14}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":64}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":16}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":6}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":21}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":48}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":18}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":22}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":9}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":23}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":50}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":46}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":4}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":44}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":12}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":61}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":66}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":81}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":12}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":3}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":10}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":33}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":52}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":64}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":51}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":80}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":17}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":53}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":30}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":18}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":25}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":41}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":66}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":30}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":79}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":76}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":23}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":57}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":93}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":27}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":25}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":43}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":148}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":42}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":45}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":27}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":103}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":92}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":50}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":25}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":19}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":23}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":42}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":206}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":50}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":25}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":18}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":16}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":51}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":38}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":109}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":20}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":27}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":34}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":63}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":39}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":171}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":16}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":18}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":19}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":58}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":103}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":27}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":86}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":124}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":17}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":44}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":101}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":21}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":53}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":21}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":42}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":203}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":38}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":48}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":23}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":21}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":41}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":203}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":37}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":55}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":23}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":18}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":19}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":27}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":64}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":157}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":44}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":44}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":46}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":46}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":46}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":21}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":19}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":54}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":34}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":110}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":29}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":84}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":21}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":16}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":14}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":25}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":32}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":24}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":29}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":40}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":37}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":29}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":42}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":14}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":16}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":37}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":32}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":35}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":33}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":105}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":67}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":43}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":14}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":16}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":46}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":40}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":111}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":54}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":40}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":66}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":23}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":46}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":91}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":17}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":25}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":18}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":46}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":77}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":78}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":113}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":110}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":114}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":115}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":113}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":21}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":22}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":21}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":51}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":21}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":41}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":55}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":113}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":48}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":58}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":49}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":98}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":70}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":23}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":79}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":54}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":25}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":76}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":52}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":25}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":79}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":51}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":25}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":125}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":64}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":53}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":66}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":56}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":61}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":33}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":99}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":29}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":25}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":97}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":44}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":25}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":23}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":19}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":22}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":20}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":34}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":14}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":156}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":16}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":68}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":17}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":16}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":45}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":63}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":64}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":21}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":17}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":14}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":12}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":23}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":25}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":27}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":26}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":33}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":40}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":12}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":32}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":49}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":35}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":10}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":10}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":1}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":30}}},"s":{"0":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"165":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"185":0,"186":0,"188":0,"189":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"257":0,"258":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"276":0,"277":0,"278":0,"279":0,"281":0,"282":0,"284":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"313":0,"315":0,"317":0,"318":0,"319":0,"320":0,"323":0,"324":0,"325":0,"326":0,"329":0,"330":0,"331":0,"332":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"350":0,"351":0,"352":0,"353":0,"354":0,"358":0,"359":0,"360":0,"361":0,"362":0,"366":0,"367":0,"368":0,"369":0,"370":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"384":0,"385":0,"386":0,"388":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"407":0,"408":0,"409":0,"410":0,"411":0,"415":0,"416":0,"417":0,"418":0,"420":0,"421":0,"423":0,"425":0,"426":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"448":0,"449":0,"451":0,"452":0,"453":0,"455":0,"464":0,"465":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"505":0,"507":0,"511":0,"512":0,"513":0,"514":0,"515":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"529":0,"530":0,"533":0,"534":0,"535":0,"538":0,"539":0,"540":0,"541":0,"542":0,"545":0,"546":0,"547":0,"549":0,"550":0,"551":0,"552":0,"554":0,"555":0,"556":0,"557":0,"558":0,"561":0,"562":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"575":0,"576":0,"577":0,"580":0,"581":0,"582":0,"585":0,"586":0,"587":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"599":0,"600":0,"603":0,"604":0,"606":0,"607":0,"609":0,"610":0,"611":0,"613":0,"614":0,"615":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"625":0,"626":0,"627":0,"630":0,"631":0,"632":0,"634":0,"636":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"647":0,"649":0,"650":0,"651":0,"652":0,"654":0,"655":0,"658":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"696":0,"697":0,"698":0,"699":0,"701":0,"702":0,"703":0,"704":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"713":0,"715":0,"716":0,"718":0,"720":0,"721":0,"722":0,"724":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"736":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"753":0,"754":0,"755":0,"757":0,"759":0,"761":0,"762":0,"763":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"785":0,"787":0,"788":0,"791":0,"792":0,"793":0,"794":0,"795":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"804":0,"805":0,"806":0,"809":0,"810":0,"811":0,"812":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"822":0,"823":0,"824":0,"825":0,"826":0,"828":0,"829":0,"830":0,"831":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"870":0,"872":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"924":0,"925":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"938":0,"939":0,"940":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"955":0,"957":0,"959":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":960,"column":-16208}},"locations":[{"start":{"line":1,"column":0},"end":{"line":960,"column":-16208}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":960,"column":-16208}},"loc":{"start":{"line":1,"column":0},"end":{"line":960,"column":-16208}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\AutonomyConfig.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\AutonomyConfig.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":31}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":13}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":18}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":36}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":22}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":27}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":15}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":39}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":28}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":2}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":26}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":25}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":25}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":2}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":24}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":11}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":4}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":31}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":70}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":43}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":43}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":16}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":23}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":43}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":103}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":24}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":72}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":105}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":79}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":44}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":53}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":104}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":18}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":20}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":79}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":36}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":18}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":28}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":79}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":9}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":23}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":8}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":10}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":11}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":11}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":4}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":4}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":10}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":94}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":79}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":13}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":55}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":27}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":70}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":67}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":51}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":19}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":84}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":15}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":10}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":1}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":8}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":13}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":4}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":50}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":30}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":27}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":35}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":4}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":25}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":23}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":4}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":66}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":22}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":22}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":5}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":10}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":83}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":13}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":46}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":121}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":59}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":60}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":61}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":93}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":55}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":15}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":68}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":40}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":15}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":15}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":23}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":22}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":21}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":47}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":52}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":44}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":43}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":70}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":79}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":70}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":41}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":18}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":87}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":21}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":54}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":117}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":49}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":23}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":23}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":24}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":10}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":1}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":89}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":57}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":76}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":64}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":54}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":19}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":41}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":16}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":35}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":43}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":27}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":45}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":28}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":31}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":20}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":9}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":6}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":4}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":67}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":54}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":25}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":24}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":32}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":23}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":40}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":33}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":25}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":59}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":36}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":43}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":5}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":16}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":44}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":28}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":20}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":16}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":10}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":57}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":107}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":49}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":56}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":90}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":14}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":15}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":30}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":32}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":164}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":9}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":17}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":12}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":60}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":35}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":51}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":61}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":83}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":16}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":77}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":14}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":35}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":51}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":58}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":83}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":19}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":16}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":90}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":25}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":28}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":60}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":36}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":30}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":88}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":18}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":14}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":25}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":30}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":64}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":36}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":30}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":92}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":18}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":14}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":25}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":28}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":62}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":36}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":30}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":90}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":18}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":25}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":62}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":30}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":90}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":18}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":14}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":25}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":29}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":60}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":36}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":30}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":88}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":18}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":14}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":25}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":26}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":60}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":36}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":30}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":88}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":18}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":14}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":14}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":35}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":51}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":63}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":83}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":19}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":16}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":42}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":63}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":73}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":21}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":20}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":28}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":23}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":24}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":62}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":32}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":32}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":40}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":50}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":62}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":22}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":20}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":125}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":16}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":100}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":56}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":21}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":18}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":63}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":73}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":21}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":56}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":32}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":32}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":40}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":50}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":75}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":22}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":20}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":156}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":48}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":51}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":49}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":23}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":18}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":16}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":14}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":35}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":61}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":53}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":57}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":85}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":21}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":82}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":18}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":19}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":38}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":80}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":26}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":44}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":21}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":16}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":34}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":125}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":23}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":24}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":26}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":33}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":36}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":34}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":33}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":47}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":20}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":19}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":18}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":87}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":18}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":14}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":143}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":59}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":13}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":14}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":14}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":12}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":10}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":1}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":30}}},"s":{"0":0,"47":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"90":0,"91":0,"92":0,"93":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"130":0,"131":0,"133":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"165":0,"166":0,"167":0,"168":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"198":0,"199":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"233":0,"235":0,"237":0,"238":0,"240":0,"244":0,"245":0,"246":0,"247":0,"248":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"304":0,"305":0,"308":0,"310":0,"311":0,"312":0,"313":0,"315":0,"316":0,"317":0,"318":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"382":0,"383":0,"384":0,"387":0,"388":0,"389":0,"390":0,"392":0,"393":0,"394":0,"395":0,"396":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"432":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"443":0,"444":0,"445":0,"446":0,"447":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"457":0,"458":0,"459":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"475":0,"477":0,"479":0,"482":0,"483":0,"484":0,"487":0,"488":0,"489":0,"490":0,"492":0,"494":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":495,"column":-6698}},"locations":[{"start":{"line":1,"column":0},"end":{"line":495,"column":-6698}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":495,"column":-6698}},"loc":{"start":{"line":1,"column":0},"end":{"line":495,"column":-6698}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ChannelList.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ChannelList.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":47}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":14}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":14}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":14}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":2}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":42}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":67}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":71}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":68}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":53}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":61}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":52}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":52}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":31}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":50}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":61}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":49}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":67}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":96}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":111}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":53}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":46}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":92}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":71}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":33}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":69}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":47}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":17}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":63}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":37}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":14}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":23}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":99}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":126}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":36}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":65}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":31}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":16}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":79}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":44}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":90}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":45}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":116}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":99}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":89}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":18}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":16}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":11}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":128}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":136}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":79}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":44}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":80}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":66}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":18}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":11}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":47}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":72}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":30}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":38}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":102}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":46}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":14}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":12}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":1}}},"s":{"0":0,"6":0,"7":0,"8":0,"9":0,"10":0,"13":0,"14":0,"15":0,"16":0,"17":0,"23":0,"24":0,"25":0,"26":0,"27":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"47":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"76":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"125":0,"127":0,"128":0,"129":0,"131":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":132,"column":-2239}},"locations":[{"start":{"line":1,"column":0},"end":{"line":132,"column":-2239}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":132,"column":-2239}},"loc":{"start":{"line":1,"column":0},"end":{"line":132,"column":-2239}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ChatArea.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ChatArea.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":133}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":57}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":11}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":12}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":12}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":16}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":28}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":9}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":65}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":68}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":20}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":21}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":71}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":49}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":64}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":49}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":56}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":69}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":64}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":34}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":55}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":8}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":9}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":14}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":75}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":72}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":64}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":101}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":52}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":19}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":44}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":35}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":13}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":31}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":62}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":9}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":39}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":17}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":19}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":50}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":67}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":58}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":52}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":28}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":45}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":25}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":53}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":43}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":25}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":52}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":70}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":57}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":41}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":72}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":76}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":24}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":81}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":5}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":9}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":42}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":153}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":49}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":109}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":26}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":95}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":106}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":133}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":129}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":57}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":14}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":49}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":38}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":35}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":75}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":35}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":29}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":39}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":32}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":180}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":51}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":21}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":14}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":12}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":105}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":42}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":50}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":23}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":36}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":39}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":31}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":31}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":25}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":47}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":25}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":31}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":39}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":31}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":31}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":50}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":40}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":38}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":61}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":18}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":27}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":62}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":42}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":136}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":25}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":55}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":35}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":33}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":31}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":35}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":40}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":39}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":14}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":39}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":25}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":32}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":82}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":43}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":32}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":33}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":22}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":46}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":51}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":14}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":26}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":12}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":99}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":43}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":313}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":29}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":23}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":107}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":31}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":47}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":41}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":23}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":33}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":29}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":81}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":41}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":29}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":29}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":37}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":90}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":38}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":24}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":213}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":65}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":18}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":72}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":21}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":31}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":25}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":68}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":133}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":33}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":47}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":43}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":51}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":23}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":35}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":207}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":40}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":43}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":29}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":38}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":97}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":231}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":36}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":31}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":22}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":69}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":60}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":26}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":33}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":25}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":36}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":55}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":150}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":33}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":58}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":23}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":18}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":85}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":16}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":14}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":12}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":10}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":1}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":98}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":46}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":56}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":39}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":44}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":67}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":63}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":59}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":56}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":49}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":57}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":6}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":59}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":22}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":41}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":78}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":26}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":5}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":114}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":28}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":106}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":27}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":5}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":73}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":47}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":4}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":34}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":9}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":48}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":22}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":47}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":19}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":44}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":5}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":4}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":32}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":25}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":9}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":39}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":74}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":44}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":44}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":19}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":28}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":35}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":35}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":31}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":19}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":48}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":5}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":49}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":4}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":10}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":41}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":114}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":22}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":102}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":35}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":16}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":27}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":12}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":110}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":15}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":30}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":114}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":22}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":104}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":17}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":15}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":34}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":114}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":22}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":32}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":86}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":17}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":12}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":10}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":1}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":43}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":55}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":7}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":56}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":50}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":25}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":5}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":11}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":13}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":1}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":58}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":38}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":33}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":28}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":26}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":33}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":40}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":37}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":10}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":63}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":33}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":12}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":7}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":30}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":17}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":105}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":8}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":15}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":5}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":15}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":31}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":109}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":28}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":13}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":6}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":8}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":3}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":15}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":1}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":56}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":38}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":78}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":20}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":36}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":47}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":34}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":53}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":5}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":19}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":91}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":26}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":57}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":26}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":17}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":155}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":20}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":15}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":8}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":26}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":17}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":100}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":132}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":8}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":5}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":46}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":3}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":32}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":38}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":3}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":43}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":1}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":59}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":32}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":12}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":134}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":87}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":46}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":77}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":14}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":31}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":144}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":29}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":139}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":12}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":3}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":41}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":59}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":39}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":33}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":60}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":47}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":86}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":42}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":42}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":17}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":26}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":33}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":14}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":33}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":29}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":4}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":10}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":65}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":10}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":202}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":28}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":12}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":65}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":23}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":94}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":27}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":56}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":16}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":125}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":129}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":30}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":78}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":24}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":144}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":18}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":31}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":74}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":66}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":21}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":47}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":270}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":36}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":52}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":23}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":16}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":12}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":10}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":1}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":32}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":10}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":17}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":14}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":8}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":17}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":33}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":4}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":46}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":19}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":25}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":67}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":23}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":31}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":7}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":5}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":59}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":10}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":8}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":20}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":17}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":75}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":50}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":9}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":8}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":19}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":22}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":25}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":41}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":10}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":1}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":33}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":11}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":10}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":12}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":17}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":14}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":33}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":32}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":26}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":37}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":73}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":31}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":25}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":43}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":6}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":10}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":9}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":23}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":33}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":19}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":88}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":32}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":25}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":23}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":36}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":6}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":1}}},"s":{"0":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"45":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"66":0,"69":0,"70":0,"71":0,"72":0,"75":0,"78":0,"79":0,"80":0,"81":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"93":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"147":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"157":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"172":0,"174":0,"175":0,"178":0,"179":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"189":0,"190":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"202":0,"203":0,"204":0,"205":0,"206":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"241":0,"242":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"302":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"312":0,"313":0,"314":0,"315":0,"316":0,"318":0,"319":0,"320":0,"321":0,"323":0,"326":0,"327":0,"328":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"342":0,"343":0,"344":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"400":0,"401":0,"403":0,"404":0,"405":0,"406":0,"407":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"417":0,"418":0,"419":0,"420":0,"422":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"435":0,"436":0,"437":0,"439":0,"440":0,"441":0,"442":0,"444":0,"445":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"473":0,"474":0,"476":0,"477":0,"479":0,"480":0,"481":0,"483":0,"485":0,"486":0,"487":0,"489":0,"491":0,"492":0,"494":0,"495":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"504":0,"505":0,"506":0,"507":0,"508":0,"510":0,"511":0,"513":0,"514":0,"515":0,"517":0,"518":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"531":0,"532":0,"534":0,"536":0,"538":0,"541":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"559":0,"560":0,"561":0,"562":0,"564":0,"565":0,"566":0,"567":0,"569":0,"570":0,"571":0,"572":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"585":0,"586":0,"587":0,"588":0,"589":0,"591":0,"592":0,"594":0,"596":0,"597":0,"599":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"626":0,"627":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"651":0,"652":0,"654":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"676":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"706":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":707,"column":-10071}},"locations":[{"start":{"line":1,"column":0},"end":{"line":707,"column":-10071}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":707,"column":-10071}},"loc":{"start":{"line":1,"column":0},"end":{"line":707,"column":-10071}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ClassroomPreviewer.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ClassroomPreviewer.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":70}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":31}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":25}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":16}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":92}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":63}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":52}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":39}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":51}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":16}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":31}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":63}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":52}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":39}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":63}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":31}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":76}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":138}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":33}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":27}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":41}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":23}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":37}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":36}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":20}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":43}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":35}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":59}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":18}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":18}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":16}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":31}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":63}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":17}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":36}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":41}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":50}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":47}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":20}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":76}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":70}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":27}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":33}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":117}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":57}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":58}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":29}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":30}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":21}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":16}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":21}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":31}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":63}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":17}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":39}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":40}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":63}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":21}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":31}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":77}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":61}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":28}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":23}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":14}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":31}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":58}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":27}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":77}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":4}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":10}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":98}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":44}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":44}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":74}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":50}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":111}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":56}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":18}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":65}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":31}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":10}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":1}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":23}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":10}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":9}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":15}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":10}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":74}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":82}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":11}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":58}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":34}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":85}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":29}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":16}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":39}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":48}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":76}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":62}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":65}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":24}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":33}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":62}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":98}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":30}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":92}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":101}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":23}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":79}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":27}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":17}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":16}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":11}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":12}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":10}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":1}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":36}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":7}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":11}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":29}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":64}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":52}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":59}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":55}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":58}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":72}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":31}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":54}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":41}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":52}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":44}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":34}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":20}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":39}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":37}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":37}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":37}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":37}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":19}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":27}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":82}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":36}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":48}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":20}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":14}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":28}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":35}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":17}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":37}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":82}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":19}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":49}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":22}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":26}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":17}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":29}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":22}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":16}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":25}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":29}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":22}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":29}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":35}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":11}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":16}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":7}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":6}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":54}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":70}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":43}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":34}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":35}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":4}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":61}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":19}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":23}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":12}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":59}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":4}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":10}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":86}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":75}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":8}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":107}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":13}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":78}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":24}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":15}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":66}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":67}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":14}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":14}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":49}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":17}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":48}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":219}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":44}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":19}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":17}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":48}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":207}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":42}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":19}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":14}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":12}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":38}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":25}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":92}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":36}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":34}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":46}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":39}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":14}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":16}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":46}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":43}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":38}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":28}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":36}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":37}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":45}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":16}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":85}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":56}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":54}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":27}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":36}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":54}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":103}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":51}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":45}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":97}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":25}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":96}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":79}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":39}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":28}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":28}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":29}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":21}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":22}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":20}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":16}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":139}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":53}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":21}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":60}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":63}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":29}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":88}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":97}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":19}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":26}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":44}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":23}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":21}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":86}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":116}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":64}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":44}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":23}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":18}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":53}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":21}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":35}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":50}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":136}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":51}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":23}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":21}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":56}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":103}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":30}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":47}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":46}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":23}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":21}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":35}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":64}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":136}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":52}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":23}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":98}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":55}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":21}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":18}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":53}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":21}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":64}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":63}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":31}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":88}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":97}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":19}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":55}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":34}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":49}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":49}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":23}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":21}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":42}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":116}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":52}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":33}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":50}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":50}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":23}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":18}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":16}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":14}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":12}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":10}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":1}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":34}}},"s":{"0":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"126":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"174":0,"175":0,"177":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"189":0,"190":0,"192":0,"193":0,"195":0,"196":0,"197":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"214":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"266":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"282":0,"283":0,"286":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"296":0,"297":0,"298":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"314":0,"315":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"338":0,"339":0,"340":0,"343":0,"344":0,"345":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"359":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"375":0,"377":0,"378":0,"379":0,"380":0,"382":0,"384":0,"385":0,"386":0,"389":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"403":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"435":0,"438":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"457":0,"458":0,"459":0,"462":0,"463":0,"464":0,"465":0,"466":0,"468":0,"469":0,"471":0,"472":0,"473":0,"475":0,"476":0,"478":0,"480":0,"482":0,"483":0,"484":0,"485":0,"487":0,"488":0,"490":0,"491":0,"492":0,"493":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"506":0,"507":0,"509":0,"511":0,"512":0,"513":0,"514":0,"515":0,"517":0,"518":0,"520":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"529":0,"531":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":532,"column":-7605}},"locations":[{"start":{"line":1,"column":0},"end":{"line":532,"column":-7605}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":532,"column":-7605}},"loc":{"start":{"line":1,"column":0},"end":{"line":532,"column":-7605}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\CloneManager.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\CloneManager.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":32}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":48}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":56}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":58}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":71}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":59}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":67}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":54}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":52}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":5}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":30}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":46}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":28}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":40}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":71}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":13}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":17}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":17}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":30}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":48}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":44}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":18}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":49}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":6}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":63}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":22}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":14}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":27}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":59}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":8}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":71}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":96}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":74}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":127}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":136}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":36}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":147}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":5}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":131}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":10}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":47}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":63}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":44}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":61}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":83}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":46}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":65}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":134}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":151}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":120}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":26}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":58}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":22}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":20}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":46}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":74}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":153}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":32}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":25}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":89}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":81}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":60}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":20}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":20}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":83}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":220}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":28}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":47}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":18}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":11}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":12}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":26}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":28}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":34}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":13}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":12}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":168}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":21}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":146}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":100}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":123}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":59}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":42}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":16}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":48}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":17}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":14}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":12}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":28}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":27}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":44}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":39}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":8}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":10}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":1}}},"s":{"0":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"18":0,"20":0,"21":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"30":0,"32":0,"33":0,"34":0,"35":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"126":0,"128":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"145":0,"147":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"164":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":165,"column":-2240}},"locations":[{"start":{"line":1,"column":0},"end":{"line":165,"column":-2240}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":165,"column":-2240}},"loc":{"start":{"line":1,"column":0},"end":{"line":165,"column":-2240}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\CodeSnippetPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\CodeSnippetPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":77}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":89}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":81}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":83}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":73}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":71}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":82}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":69}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":83}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":74}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":82}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":79}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":80}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":72}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":72}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":76}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":72}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":2}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":49}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":69}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":50}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":46}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":17}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":15}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":13}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":17}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":75}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":46}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":65}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":24}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":9}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":63}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":22}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":47}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":44}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":22}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":63}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":105}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":73}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":42}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":14}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":29}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":68}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":61}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":49}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":80}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":10}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":92}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":13}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":132}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":57}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":70}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":35}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":53}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":94}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":63}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":122}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":42}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":18}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":77}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":108}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":16}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":49}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":27}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":32}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":58}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":24}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":23}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":58}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":42}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":17}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":21}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":36}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":58}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":44}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":64}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":66}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":15}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":39}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":23}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":47}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":52}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":44}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":42}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":39}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":107}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":153}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":31}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":18}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":23}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":37}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":139}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":28}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":69}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":10}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":1}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":71}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":53}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":80}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":68}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":35}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":46}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":27}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":61}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":54}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":7}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":40}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":48}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":41}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":17}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":42}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":39}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":34}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":95}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":7}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":24}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":48}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":78}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":76}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":78}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":68}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":7}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":48}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":52}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":51}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":9}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":30}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":12}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":17}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":45}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":38}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":24}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":8}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":10}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":31}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":32}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":93}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":14}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":21}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":31}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":29}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":58}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":214}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":10}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":25}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":46}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":118}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":51}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":12}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":32}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":48}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":17}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":53}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":75}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":39}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":96}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":122}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":15}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":11}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":19}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":47}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":19}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":24}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":90}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":77}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":41}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":98}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":124}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":17}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":30}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":21}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":13}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":14}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":45}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":66}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":44}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":14}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":94}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":42}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":46}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":30}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":45}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":44}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":43}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":20}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":26}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":33}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":54}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":57}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":16}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":25}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":13}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":26}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":43}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":85}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":12}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":10}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":1}}},"s":{"0":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"116":0,"117":0,"119":0,"120":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"168":0,"170":0,"171":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"197":0,"198":0,"200":0,"204":0,"205":0,"206":0,"207":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"222":0,"223":0,"224":0,"227":0,"228":0,"229":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"257":0,"259":0,"260":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"276":0,"277":0,"279":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"311":0,"312":0,"313":0,"314":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"337":0,"338":0,"340":0,"342":0,"343":0,"345":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":346,"column":-5168}},"locations":[{"start":{"line":1,"column":0},"end":{"line":346,"column":-5168}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":346,"column":-5168}},"loc":{"start":{"line":1,"column":0},"end":{"line":346,"column":-5168}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ConnectionStatus.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ConnectionStatus.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":40}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":26}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":44}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":50}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":50}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":18}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":28}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":48}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":17}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":50}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":2}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":29}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":17}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":27}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":71}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":55}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":54}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":81}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":31}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":67}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":46}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":7}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":61}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":26}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":29}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":7}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":57}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":29}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":7}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":20}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":23}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":47}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":27}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":60}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":60}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":39}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":25}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":9}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":21}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":55}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":16}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":64}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":13}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":91}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":10}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":52}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":42}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":87}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":27}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":47}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":17}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":37}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":70}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":11}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":12}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":10}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":99}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":17}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":23}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":54}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":92}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":54}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":30}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":63}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":42}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":87}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":27}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":68}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":56}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":12}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":23}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":65}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":48}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":46}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":45}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":37}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":151}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":45}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":26}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":1}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":81}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":71}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":54}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":60}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":10}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":69}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":47}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":21}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":28}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":28}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":43}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":26}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":8}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":23}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":19}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":28}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":26}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":29}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":25}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":26}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":26}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":13}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":11}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":1}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":17}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":22}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":4}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":4}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":83}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":19}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":60}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":30}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":40}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":19}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":9}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":12}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":71}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":55}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":53}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":13}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":3}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":97}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":74}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":77}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":72}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":4}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":51}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":27}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":10}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":69}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":55}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":36}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":51}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":13}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":47}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":74}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":59}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":15}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":11}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":1}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":32}}},"s":{"0":0,"37":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"90":0,"91":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0,"148":0,"150":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"185":0,"187":0,"189":0,"190":0,"192":0,"197":0,"198":0,"200":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"229":0,"234":0,"235":0,"236":0,"237":0,"240":0,"241":0,"243":0,"245":0,"246":0,"247":0,"249":0,"250":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"283":0,"285":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":8200},"end":{"line":286,"column":32}},"locations":[{"start":{"line":1,"column":8200},"end":{"line":286,"column":32}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":8200},"end":{"line":286,"column":32}},"loc":{"start":{"line":1,"column":8200},"end":{"line":286,"column":32}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ConversationList.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ConversationList.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":50}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":36}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":9}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":73}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":60}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":14}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":21}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":44}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":66}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":50}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":10}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":42}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":92}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":71}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":15}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":35}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":69}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":43}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":12}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":63}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":53}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":116}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":120}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":55}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":86}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":68}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":102}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":61}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":79}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":40}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":85}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":22}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":27}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":57}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":125}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":63}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":17}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":99}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":83}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":57}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":46}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":114}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":68}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":58}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":33}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":38}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":42}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":48}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":19}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":117}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":26}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":46}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":23}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":11}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":58}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":61}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":41}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":25}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":27}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":45}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":45}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":31}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":44}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":42}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":42}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":42}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":42}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":46}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":1}}},"s":{"0":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"11":0,"14":0,"15":0,"16":0,"18":0,"19":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"28":0,"29":0,"30":0,"32":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"89":0,"90":0,"92":0,"94":0,"95":0,"97":0,"98":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"111":0,"112":0,"114":0,"115":0,"117":0,"118":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":119,"column":-2959}},"locations":[{"start":{"line":1,"column":0},"end":{"line":119,"column":-2959}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":119,"column":-2959}},"loc":{"start":{"line":1,"column":0},"end":{"line":119,"column":-2959}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\CreateTriggerModal.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\CreateTriggerModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":31}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":29}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":28}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":61}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":56}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":56}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":57}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":57}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":51}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":84}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":44}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":89}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":47}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":34}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":90}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":7}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":38}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":55}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":29}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":39}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":37}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":83}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":27}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":75}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":77}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":42}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":11}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":21}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":16}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":2}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":33}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":3}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":21}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":21}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":49}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":4}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":51}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":4}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":48}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":24}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":2}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":53}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":55}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":63}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":45}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":2}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":93}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":45}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":61}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":53}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":65}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":77}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":67}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":58}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":89}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":55}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":18}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":22}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":41}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":35}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":30}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":26}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":15}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":51}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":49}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":32}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":50}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":43}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":61}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":59}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":67}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":9}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":14}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":34}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":57}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":9}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":39}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":52}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":16}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":68}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":34}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":70}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":11}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":9}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":5}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":29}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":52}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":47}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":17}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":54}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":23}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":26}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":13}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":26}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":28}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":9}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":49}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":30}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":23}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":45}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":16}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":21}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":48}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":23}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":44}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":16}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":7}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":27}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":28}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":35}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":15}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":81}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":87}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":9}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":33}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":24}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":20}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":15}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":19}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":31}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":87}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":15}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":29}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":4}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":97}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":55}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":24}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":38}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":32}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":25}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":9}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":5}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":4}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":75}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":34}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":18}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":60}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":22}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":64}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":4}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":10}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":73}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":10}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":65}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":25}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":8}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":144}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":123}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":51}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":115}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":76}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":18}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":17}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":82}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":70}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":17}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":29}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":104}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":37}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":19}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":14}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":87}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":15}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":95}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":66}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":20}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":18}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":25}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":35}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":67}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":54}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":201}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":87}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":17}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":14}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":29}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":79}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":51}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":29}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":18}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":15}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":95}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":66}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":20}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":52}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":51}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":41}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":24}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":25}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":38}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":33}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":84}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":115}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":52}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":68}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":146}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":23}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":48}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":47}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":27}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":17}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":18}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":54}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":84}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":16}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":43}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":17}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":97}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":68}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":22}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":20}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":27}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":44}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":76}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":56}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":213}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":96}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":19}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":16}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":38}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":81}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":53}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":38}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":20}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":56}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":18}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":18}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":41}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":17}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":97}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":66}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":22}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":21}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":42}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":74}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":182}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":94}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":19}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":65}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":51}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":66}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":34}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":27}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":19}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":23}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":36}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":81}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":53}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":36}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":20}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":18}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":43}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":17}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":97}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":71}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":22}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":20}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":27}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":40}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":72}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":38}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":213}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":92}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":19}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":16}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":34}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":81}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":53}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":34}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":20}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":56}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":18}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":18}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":15}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":95}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":20}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":40}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":16}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":49}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":57}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":33}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":36}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":31}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":34}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":74}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":82}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":20}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":93}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":56}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":66}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":144}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":21}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":32}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":25}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":17}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":18}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":16}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":15}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":95}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":67}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":20}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":19}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":39}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":71}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":180}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":91}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":17}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":59}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":54}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":58}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":44}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":25}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":17}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":21}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":33}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":79}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":51}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":33}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":18}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":52}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":56}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":85}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":18}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":16}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":51}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":18}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":29}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":34}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":40}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":72}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":93}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":14}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":98}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":20}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":16}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":42}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":136}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":63}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":76}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":18}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":40}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":128}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":63}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":61}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":18}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":15}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":125}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":17}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":25}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":29}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":35}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":193}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":11}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":19}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":17}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":25}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":34}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":65}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":157}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":29}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":16}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":60}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":17}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":16}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":43}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":17}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":19}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":14}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":12}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":10}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":1}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":34}}},"s":{"0":0,"25":0,"26":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"41":0,"42":0,"43":0,"46":0,"47":0,"48":0,"49":0,"50":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"106":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"178":0,"179":0,"181":0,"182":0,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"213":0,"215":0,"216":0,"217":0,"220":0,"221":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"231":0,"233":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0,"296":0,"297":0,"299":0,"300":0,"301":0,"302":0,"305":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"315":0,"316":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"326":0,"327":0,"330":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"351":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"372":0,"373":0,"374":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"404":0,"406":0,"407":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"436":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"462":0,"463":0,"467":0,"468":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"489":0,"490":0,"491":0,"492":0,"493":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"520":0,"521":0,"522":0,"523":0,"525":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"538":0,"539":0,"542":0,"543":0,"544":0,"545":0,"546":0,"548":0,"549":0,"550":0,"551":0,"552":0,"554":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"572":0,"573":0,"574":0,"576":0,"578":0,"579":0,"581":0,"583":0,"584":0,"585":0,"586":0,"588":0,"590":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":591,"column":-6970}},"locations":[{"start":{"line":1,"column":0},"end":{"line":591,"column":-6970}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":591,"column":-6970}},"loc":{"start":{"line":1,"column":0},"end":{"line":591,"column":-6970}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\DetailDrawer.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\DetailDrawer.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":92}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":10}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":21}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":16}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":36}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":36}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":42}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":71}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":35}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":72}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":163}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":120}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":91}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":144}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":52}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":18}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":25}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":11}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":1}}},"s":{"0":0,"11":0,"12":0,"13":0,"14":0,"15":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"55":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":56,"column":-549}},"locations":[{"start":{"line":1,"column":0},"end":{"line":56,"column":-549}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":56,"column":-549}},"loc":{"start":{"line":1,"column":0},"end":{"line":56,"column":-549}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\DevQALoop.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\DevQALoop.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":89}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":25}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":85}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":91}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":77}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":47}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":54}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":49}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":4}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":77}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":86}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":86}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":83}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":92}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":13}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":26}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":98}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":49}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":131}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":17}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":129}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":44}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":48}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":17}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":69}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":60}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":17}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":94}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":44}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":101}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":40}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":58}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":108}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":78}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":29}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":23}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":19}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":18}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":42}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":126}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":41}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":54}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":88}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":66}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":118}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":40}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":29}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":107}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":58}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":74}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":31}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":99}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":42}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":106}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":64}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":20}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":14}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":96}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":82}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":45}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":58}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":69}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":32}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":38}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":27}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":45}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":40}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":26}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":26}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":38}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":4}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":30}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":14}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":14}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":41}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":13}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":7}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":74}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":82}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":11}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":106}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":36}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":71}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":43}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":71}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":29}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":36}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":47}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":40}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":48}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":45}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":83}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":17}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":35}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":21}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":13}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":14}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":12}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":11}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":106}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":25}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":54}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":43}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":149}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":18}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":12}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":11}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":108}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":48}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":17}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":48}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":111}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":112}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":54}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":48}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":48}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":58}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":19}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":23}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":39}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":80}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":35}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":112}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":12}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":16}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":25}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":39}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":103}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":30}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":112}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":12}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":23}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":46}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":87}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":43}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":112}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":12}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":14}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":14}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":21}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":84}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":48}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":122}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":10}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":15}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":34}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":42}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":144}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":9}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":17}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":12}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":29}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":35}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":109}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":135}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":32}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":74}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":21}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":77}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":60}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":47}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":13}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":14}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":34}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":15}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":32}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":129}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":38}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":17}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":15}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":28}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":127}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":9}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":17}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":12}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":1}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":111}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":80}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":62}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":59}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":23}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":80}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":95}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":96}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":88}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":95}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":96}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":4}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":41}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":101}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":50}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":29}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":4}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":46}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":56}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":4}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":10}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":118}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":156}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":59}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":51}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":75}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":17}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":90}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":85}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":16}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":51}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":179}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":28}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":19}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":71}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":70}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":19}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":14}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":12}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":79}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":59}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":51}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":85}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":121}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":46}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":18}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":37}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":94}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":68}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":57}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":73}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":133}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":73}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":16}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":51}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":48}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":93}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":70}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":85}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":102}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":16}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":41}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":18}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":16}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":14}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":12}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":79}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":49}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":69}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":16}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":21}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":47}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":39}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":35}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":109}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":33}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":50}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":17}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":14}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":13}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":14}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":12}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":62}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":98}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":46}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":85}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":16}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":55}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":25}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":23}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":33}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":33}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":51}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":89}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":14}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":12}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":12}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":73}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":39}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":83}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":74}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":66}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":16}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":16}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":41}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":87}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":75}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":70}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":16}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":16}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":61}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":17}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":51}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":135}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":45}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":19}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":41}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":17}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":44}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":131}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":47}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":19}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":30}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":21}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":28}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":27}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":41}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":53}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":12}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":17}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":12}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":10}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":1}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":30}}},"s":{"0":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"110":0,"111":0,"112":0,"113":0,"115":0,"117":0,"119":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"267":0,"268":0,"269":0,"270":0,"272":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"284":0,"296":0,"297":0,"298":0,"300":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"311":0,"313":0,"314":0,"315":0,"316":0,"318":0,"319":0,"320":0,"322":0,"323":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"399":0,"400":0,"401":0,"402":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"416":0,"419":0,"420":0,"421":0,"422":0,"423":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"441":0,"442":0,"443":0,"444":0,"445":0,"447":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"461":0,"463":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":464,"column":-9622}},"locations":[{"start":{"line":1,"column":0},"end":{"line":464,"column":-9622}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":464,"column":-9622}},"loc":{"start":{"line":1,"column":0},"end":{"line":464,"column":-9622}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ErrorNotification.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ErrorNotification.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":14}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":22}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":2}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":45}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":6}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":39}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":49}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":9}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":45}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":55}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":49}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":11}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":45}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":55}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":49}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":8}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":41}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":51}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":45}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":2}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":20}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":8}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":12}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":16}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":50}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":60}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":73}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":56}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":61}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":38}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":28}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":39}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":50}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":50}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":46}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":47}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":18}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":52}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":46}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":74}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":40}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":66}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":60}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":49}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":92}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":16}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":62}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":26}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":19}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":52}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":91}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":27}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":51}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":18}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":53}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":38}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":23}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":49}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":54}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":46}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":110}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":33}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":38}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":63}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":58}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":22}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":31}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":83}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":75}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":41}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":26}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":73}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":14}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":12}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":1}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":17}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":25}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":17}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":28}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":58}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":32}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":61}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":19}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":53}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":41}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":19}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":53}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":21}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":53}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":46}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":17}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":18}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":9}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":51}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":33}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":31}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":39}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":39}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":10}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":8}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":92}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":40}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":30}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":20}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":26}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":25}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":37}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":41}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":12}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":11}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":29}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":22}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":34}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":34}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":36}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":124}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":9}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":32}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":24}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":10}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":1}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":43}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":11}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":4}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":4}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":10}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":6}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":27}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":7}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":1}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":33}}},"s":{"0":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"95":0,"96":0,"97":0,"98":0,"99":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"146":0,"148":0,"149":0,"151":0,"153":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"169":0,"170":0,"172":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"195":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"222":0,"224":0,"225":0,"226":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"249":0,"251":0,"256":0,"257":0,"258":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"269":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":270,"column":-2973}},"locations":[{"start":{"line":1,"column":0},"end":{"line":270,"column":-2973}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":270,"column":-2973}},"loc":{"start":{"line":1,"column":0},"end":{"line":270,"column":-2973}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\FirstConversationPrompt.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\FirstConversationPrompt.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":41}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":34}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":70}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":71}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":42}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":10}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":37}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":36}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":35}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":70}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":178}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":65}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":49}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":100}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":95}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":43}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":49}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":23}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":44}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":42}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":47}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":61}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":68}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":91}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":81}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":59}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":76}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":78}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":31}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":117}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":26}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":11}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":57}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":66}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":48}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":57}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":39}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":20}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":19}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":32}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":30}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":63}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":83}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":32}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":21}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":67}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":17}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":1}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":39}}},"s":{"0":0,"23":0,"24":0,"25":0,"26":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"37":0,"39":0,"40":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"51":0,"52":0,"53":0,"54":0,"55":0,"58":0,"59":0,"60":0,"61":0,"62":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"111":0,"112":0,"116":0,"118":0,"119":0,"121":0,"123":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":124,"column":-1819}},"locations":[{"start":{"line":1,"column":0},"end":{"line":124,"column":-1819}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":124,"column":-1819}},"loc":{"start":{"line":1,"column":0},"end":{"line":124,"column":-1819}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\HandApprovalModal.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\HandApprovalModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":26}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":8}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":48}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":49}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":58}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":11}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":25}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":50}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":51}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":60}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":9}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":23}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":44}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":45}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":54}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":2}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":89}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":57}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":85}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":22}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":38}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":61}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":49}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":53}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":55}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":7}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":22}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":39}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":50}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":22}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":47}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":49}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":22}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":85}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":83}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":19}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":37}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":7}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":39}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":43}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":7}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":49}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":80}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":81}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":76}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":79}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":22}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":78}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":12}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":1}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":55}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":37}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":41}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":43}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":32}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":1}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":72}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":56}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":52}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":50}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":54}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":29}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":74}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":34}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":35}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":6}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":18}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":52}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":41}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":38}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":1}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":53}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":27}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":10}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":8}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":158}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":38}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":10}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":1}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":108}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":86}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":38}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":33}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":65}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":83}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":39}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":15}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":13}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":119}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":46}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":15}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":85}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":12}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":85}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":51}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":13}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":45}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":10}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":12}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":10}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":1}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":73}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":52}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":12}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":95}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":3}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":10}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":98}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":56}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":41}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":12}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":10}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":1}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":35}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":10}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":12}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":11}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":10}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":58}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":64}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":55}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":58}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":63}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":30}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":73}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":82}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":69}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":66}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":12}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":27}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":13}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":68}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":13}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":52}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":56}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":37}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":55}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":16}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":52}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":58}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":4}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":19}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":48}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":41}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":18}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":7}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":6}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":53}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":69}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":24}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":17}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":32}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":26}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":21}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":29}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":15}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":49}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":59}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":26}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":19}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":9}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":42}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":19}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":73}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":15}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":5}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":66}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":48}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":46}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":27}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":31}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":13}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":31}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":56}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":13}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":26}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":19}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":9}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":62}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":72}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":15}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":29}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":85}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":48}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":30}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":24}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":19}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":9}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":44}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":10}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":73}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":10}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":65}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":25}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":8}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":144}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":122}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":51}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":117}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":79}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":18}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":17}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":82}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":19}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":70}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":18}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":18}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":16}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":17}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":29}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":104}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":37}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":19}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":14}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":62}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":25}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":130}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":57}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":80}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":18}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":37}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":63}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":55}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":58}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":74}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":41}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":20}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":58}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":18}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":68}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":40}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":16}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":16}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":26}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":28}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":43}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":63}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":14}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":37}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":90}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":20}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":58}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":16}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":43}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":39}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":116}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":48}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":22}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":116}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":45}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":18}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":18}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":129}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":47}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":15}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":78}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":16}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":16}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":31}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":39}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":92}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":72}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":22}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":23}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":36}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":65}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":83}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":214}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":24}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":25}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":39}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":16}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":18}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":21}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":128}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":65}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":54}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":18}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":14}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":125}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":30}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":14}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":21}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":29}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":44}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":39}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":197}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":15}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":23}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":21}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":29}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":38}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":63}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":157}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":33}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":20}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":64}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":21}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":20}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":51}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":21}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":23}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":15}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":14}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":21}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":29}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":33}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":39}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":197}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":15}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":23}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":21}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":29}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":38}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":52}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":232}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":47}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":23}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":21}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":29}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":39}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":52}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":161}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":33}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":20}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":64}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":21}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":20}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":55}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":21}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":23}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":15}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":14}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":12}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":10}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":1}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":33}}},"s":{"0":0,"54":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"83":0,"85":0,"86":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"99":0,"100":0,"101":0,"102":0,"103":0,"105":0,"107":0,"108":0,"109":0,"110":0,"112":0,"114":0,"116":0,"118":0,"120":0,"122":0,"124":0,"126":0,"127":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"189":0,"190":0,"192":0,"193":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"205":0,"206":0,"207":0,"209":0,"211":0,"212":0,"213":0,"215":0,"216":0,"217":0,"218":0,"219":0,"221":0,"222":0,"223":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"238":0,"240":0,"241":0,"242":0,"243":0,"245":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"271":0,"272":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"294":0,"295":0,"296":0,"297":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"307":0,"308":0,"309":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"321":0,"322":0,"324":0,"325":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"345":0,"346":0,"347":0,"348":0,"350":0,"351":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"369":0,"371":0,"372":0,"374":0,"375":0,"376":0,"377":0,"380":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"400":0,"401":0,"402":0,"405":0,"407":0,"408":0,"409":0,"410":0,"411":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"431":0,"432":0,"433":0,"434":0,"435":0,"439":0,"440":0,"442":0,"443":0,"444":0,"447":0,"448":0,"449":0,"450":0,"452":0,"453":0,"454":0,"455":0,"456":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"486":0,"487":0,"488":0,"489":0,"490":0,"492":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"512":0,"513":0,"514":0,"516":0,"518":0,"519":0,"521":0,"523":0,"524":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"541":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"550":0,"551":0,"552":0,"554":0,"556":0,"557":0,"559":0,"561":0,"562":0,"564":0,"565":0,"566":0,"568":0,"570":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":571,"column":-6194}},"locations":[{"start":{"line":1,"column":0},"end":{"line":571,"column":-6194}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":571,"column":-6194}},"loc":{"start":{"line":1,"column":0},"end":{"line":571,"column":-6194}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\HandList.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\HandList.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":65}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":19}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":76}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":71}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":62}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":71}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":68}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":55}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":17}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":22}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":2}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":75}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":45}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":53}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":40}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":39}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":79}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":55}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":27}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":12}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":39}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":62}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":64}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":64}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":12}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":42}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":86}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":72}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":69}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":14}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":37}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":30}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":125}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":84}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":12}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":46}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":17}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":51}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":108}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":89}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":52}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":80}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":46}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":59}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":79}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":31}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":25}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":57}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":22}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":69}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":36}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":20}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":62}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":58}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":48}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":52}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":60}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":41}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":27}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":22}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":19}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":11}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":10}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":24}}},"s":{"0":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"43":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"130":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":131,"column":-2376}},"locations":[{"start":{"line":1,"column":0},"end":{"line":131,"column":-2376}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":131,"column":-2376}},"loc":{"start":{"line":1,"column":0},"end":{"line":131,"column":-2376}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\HandParamsForm.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\HandParamsForm.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":84}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":23}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":64}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":62}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":53}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":62}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":123}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":62}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":62}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":29}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":23}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":54}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":67}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":7}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":57}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":77}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":57}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":77}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":38}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":65}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":7}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":26}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":13}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":50}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":35}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":69}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":11}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":9}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":7}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":12}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":65}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":7}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":12}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":62}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":65}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":7}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":11}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":30}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":15}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":70}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":7}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":12}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":38}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":79}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":27}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":51}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":54}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":45}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":57}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":67}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":61}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":1}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":72}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":7}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":79}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":11}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":1}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":78}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":10}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":33}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":84}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":72}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":39}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":88}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":38}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":29}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":17}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":68}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":45}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":17}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":12}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":1}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":87}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":10}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":10}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":37}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":48}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":37}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":25}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":240}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":73}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":9}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":1}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":89}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":10}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":10}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":19}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":37}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":35}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":59}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":8}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":37}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":21}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":240}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":73}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":9}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":6}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":1}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":83}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":10}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":62}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":12}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":23}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":45}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":52}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":133}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":8}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":65}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":35}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":13}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":12}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":1}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":89}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":10}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":11}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":37}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":48}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":25}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":219}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":73}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":9}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":66}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":36}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":50}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":21}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":17}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":9}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":13}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":1}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":91}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":10}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":13}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":37}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":48}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":37}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":25}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":14}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":249}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":73}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":9}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":6}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":1}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":88}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":45}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":64}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":31}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":25}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":43}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":21}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":5}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":4}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":47}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":32}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":30}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":23}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":4}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":65}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":32}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":31}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":23}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":4}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":53}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":28}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":25}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":22}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":4}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":10}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":124}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":28}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":37}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":39}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":65}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":20}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":27}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":28}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":73}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":35}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":232}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":16}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":21}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":29}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":55}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":35}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":160}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":46}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":23}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":18}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":13}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":14}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":47}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":14}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":21}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":25}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":54}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":35}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":54}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":29}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":247}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":10}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":15}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":23}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":33}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":48}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":158}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":38}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":17}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":12}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":42}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":79}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":10}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":1}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":89}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":47}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":68}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":53}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":19}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":9}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":72}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":52}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":28}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":14}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":24}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":7}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":13}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":22}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":5}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":14}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":46}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":22}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":23}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":26}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":13}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":48}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":25}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":75}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":57}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":28}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":14}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":38}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":7}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":12}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":33}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":5}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":4}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":10}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":80}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":13}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":21}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":50}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":126}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":94}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":43}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":15}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":22}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":17}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":26}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":60}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":69}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":29}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":18}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":263}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":91}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":13}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":10}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":22}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":68}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":45}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":22}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":12}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":10}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":1}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":87}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":72}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":37}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":15}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":26}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":5}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":4}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":10}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":66}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":47}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":14}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":124}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":20}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":76}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":83}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":82}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":56}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":74}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":72}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":17}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":16}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":33}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":39}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":31}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":30}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":12}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":16}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":31}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":17}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":25}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":40}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":31}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":156}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":42}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":19}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":12}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":10}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":1}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":124}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":84}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":59}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":54}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":48}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":23}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":24}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":47}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":96}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":29}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":25}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":18}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":50}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":20}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":52}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":21}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":53}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":20}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":52}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":22}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":54}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":19}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":51}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":20}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":52}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":18}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":50}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":14}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":50}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":5}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":4}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":10}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":50}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":21}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":23}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":1}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":88}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":64}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":62}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":51}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":62}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":19}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":20}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":41}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":5}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":18}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":34}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":49}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":40}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":33}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":30}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":42}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":35}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":6}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":47}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":27}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":39}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":22}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":29}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":4}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":57}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":32}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":29}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":4}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":52}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":27}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":64}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":27}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":39}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":4}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":30}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":10}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":77}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":47}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":15}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":23}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":49}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":195}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":42}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":17}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":15}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":23}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":60}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":41}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":243}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":48}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":33}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":17}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":12}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":26}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":83}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":88}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":18}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":51}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":18}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":25}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":32}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":61}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":35}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":236}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":33}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":58}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":65}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":16}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":23}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":14}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":19}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":27}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":40}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":43}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":185}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":13}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":21}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":19}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":27}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":54}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":173}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":13}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":21}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":16}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":14}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":48}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":83}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":88}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":18}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":64}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":38}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":18}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":31}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":143}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":48}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":92}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":33}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":22}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":74}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":69}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":22}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":22}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":62}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":25}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":33}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":60}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":133}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":19}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":27}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":25}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":33}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":65}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":116}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":53}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":27}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":22}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":20}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":15}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":16}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":14}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":10}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":1}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":32}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":13}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":9}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":11}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":9}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":11}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":12}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":25}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":39}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":58}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":35}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":81}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":48}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":7}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":7}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":18}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":27}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":19}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":47}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":73}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":6}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":29}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":30}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":5}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":52}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":40}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":44}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":16}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":18}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":27}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":9}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":6}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":22}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":4}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":39}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":48}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":16}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":18}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":24}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":9}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":6}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":22}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":4}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":32}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":12}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":81}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":12}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":3}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":10}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":31}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":20}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":29}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":30}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":39}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":8}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":61}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":36}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":14}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":28}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":125}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":27}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":27}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":40}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":72}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":33}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":50}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":14}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":16}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":11}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":12}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":10}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":1}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":38}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":30}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":33}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":27}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":44}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":33}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":64}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":42}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":40}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":5}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":5}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":16}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":1}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":30}}},"s":{"0":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"75":0,"76":0,"77":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"106":0,"107":0,"108":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"135":0,"136":0,"140":0,"142":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"192":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"311":0,"312":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"321":0,"322":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"344":0,"345":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"365":0,"366":0,"367":0,"369":0,"370":0,"372":0,"374":0,"376":0,"377":0,"378":0,"379":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"395":0,"396":0,"398":0,"399":0,"400":0,"401":0,"402":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"441":0,"442":0,"443":0,"444":0,"445":0,"447":0,"449":0,"451":0,"452":0,"453":0,"454":0,"457":0,"458":0,"459":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"490":0,"491":0,"493":0,"494":0,"496":0,"500":0,"501":0,"503":0,"505":0,"506":0,"507":0,"508":0,"510":0,"512":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"537":0,"538":0,"539":0,"540":0,"542":0,"552":0,"553":0,"554":0,"555":0,"556":0,"559":0,"560":0,"561":0,"562":0,"563":0,"565":0,"566":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"582":0,"583":0,"584":0,"585":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"594":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"604":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"613":0,"614":0,"615":0,"616":0,"619":0,"620":0,"621":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"651":0,"652":0,"653":0,"657":0,"658":0,"659":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"683":0,"684":0,"685":0,"686":0,"687":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"697":0,"699":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"752":0,"753":0,"754":0,"756":0,"758":0,"760":0,"761":0,"763":0,"764":0,"765":0,"766":0,"767":0,"770":0,"771":0,"772":0,"773":0,"774":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"788":0,"792":0,"793":0,"794":0,"795":0,"796":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"805":0,"806":0,"808":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":809,"column":-8792}},"locations":[{"start":{"line":1,"column":0},"end":{"line":809,"column":-8792}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":809,"column":-8792}},"loc":{"start":{"line":1,"column":0},"end":{"line":809,"column":-8792}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\HandTaskPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\HandTaskPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":132}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":81}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":83}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":91}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":79}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":85}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":98}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":88}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":78}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":2}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":71}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":45}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":51}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":53}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":59}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":57}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":31}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":70}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":58}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":58}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":71}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":51}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":81}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":49}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":30}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":57}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":50}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":44}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":66}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":26}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":94}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":9}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":56}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":64}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":19}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":62}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":27}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":55}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":11}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":57}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":53}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":64}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":16}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":86}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":7}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":72}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":67}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":48}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":62}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":72}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":7}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":15}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":29}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":22}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":39}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":64}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":62}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":12}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":65}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":120}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":91}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":10}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":42}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":113}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":49}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":22}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":30}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":160}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":47}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":71}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":42}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":89}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":33}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":107}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":16}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":35}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":35}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":178}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":85}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":17}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":36}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":69}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":187}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":16}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":16}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":44}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":17}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":19}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":14}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":12}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":60}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":45}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":44}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":83}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":82}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":37}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":117}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":112}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":58}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":41}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":39}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":41}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":57}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":17}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":16}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":37}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":112}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":112}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":43}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":41}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":17}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":39}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":41}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":57}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":39}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":112}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":88}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":44}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":17}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":39}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":66}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":18}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":16}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":46}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":45}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":127}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":55}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":18}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":83}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":68}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":16}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":16}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":12}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":10}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":1}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":86}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":57}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":77}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":33}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":32}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":92}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":10}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":108}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":10}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":68}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":50}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":57}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":111}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":90}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":17}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":14}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":63}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":78}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":26}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":17}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":116}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":14}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":12}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":132}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":48}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":30}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":59}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":16}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":48}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":29}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":68}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":16}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":32}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":50}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":31}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":72}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":18}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":26}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":203}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":26}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":18}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":26}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":148}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":26}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":18}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":14}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":10}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":1}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":29}}},"s":{"0":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"53":0,"54":0,"55":0,"58":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"71":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"85":0,"86":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"97":0,"98":0,"99":0,"101":0,"102":0,"104":0,"105":0,"106":0,"107":0,"108":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"140":0,"141":0,"142":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"177":0,"178":0,"179":0,"181":0,"183":0,"184":0,"186":0,"188":0,"189":0,"190":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"255":0,"256":0,"258":0,"259":0,"261":0,"264":0,"265":0,"266":0,"267":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"318":0,"319":0,"321":0,"323":0,"325":0,"327":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":328,"column":-5219}},"locations":[{"start":{"line":1,"column":0},"end":{"line":328,"column":-5219}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":328,"column":-5219}},"loc":{"start":{"line":1,"column":0},"end":{"line":328,"column":-5219}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\HandsPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\HandsPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":31}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":27}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":44}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":58}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":7}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":16}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":57}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":9}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":86}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":12}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":17}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":82}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":42}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":4}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":90}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":4}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":78}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":27}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":79}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":28}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":17}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":17}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":90}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":2}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":58}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":82}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":122}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":72}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":20}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":1}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":79}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":120}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":103}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":106}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":120}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":2}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":61}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":142}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":10}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":72}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":11}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":77}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":152}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":45}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":45}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":41}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":13}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":38}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":70}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":33}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":104}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":10}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":1}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":103}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":70}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":71}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":78}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":77}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":62}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":32}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":51}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":31}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":43}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":44}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":9}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":9}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":31}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":31}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":25}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":49}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":51}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":30}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":13}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":25}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":68}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":29}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":43}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":15}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":7}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":30}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":60}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":79}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":68}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":10}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":73}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":65}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":25}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":8}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":144}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":108}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":51}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":65}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":98}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":54}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":18}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":17}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":29}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":86}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":52}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":19}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":62}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":88}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":45}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":72}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":114}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":19}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":62}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":35}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":23}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":81}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":96}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":32}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":23}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":80}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":93}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":24}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":18}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":65}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":72}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":114}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":19}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":41}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":54}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":65}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":19}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":20}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":51}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":72}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":114}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":40}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":19}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":54}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":48}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":23}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":29}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":172}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":26}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":25}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":19}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":20}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":18}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":55}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":72}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":114}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":19}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":29}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":36}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":41}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":36}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":39}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":45}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":16}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":18}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":55}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":72}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":114}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":45}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":19}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":54}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":52}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":29}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":125}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":101}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":99}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":24}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":19}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":20}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":18}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":14}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":111}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":17}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":79}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":169}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":42}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":19}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":17}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":41}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":75}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":205}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":29}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":60}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":17}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":40}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":16}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":48}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":17}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":34}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":44}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":17}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":16}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":43}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":17}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":19}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":14}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":12}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":10}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":81}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":45}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":63}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":10}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":150}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":67}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":57}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":76}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":93}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":14}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":48}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":12}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":102}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":32}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":125}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":108}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":53}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":34}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":16}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":14}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":93}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":42}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":43}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":44}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":45}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":27}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":52}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":12}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":47}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":15}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":41}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":193}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":9}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":50}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":17}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":15}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":42}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":73}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":205}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":27}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":14}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":62}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":15}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":43}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":14}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":62}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":15}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":14}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":45}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":15}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":17}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":12}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":10}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":1}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":30}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":105}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":70}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":80}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":52}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":63}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":31}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":19}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":16}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":18}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":59}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":50}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":37}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":23}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":23}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":94}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":33}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":113}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":9}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":56}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":66}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":19}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":54}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":26}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":14}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":54}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":72}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":64}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":7}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":19}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":72}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":69}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":62}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":15}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":32}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":5}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":50}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":46}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":24}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":26}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":9}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":87}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":30}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":24}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":47}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":37}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":40}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":12}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":39}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":79}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":81}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":12}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":3}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":27}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":12}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":39}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":123}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":51}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":14}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":84}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":64}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":12}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":12}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":3}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":10}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":31}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":57}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":13}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":78}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":15}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":66}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":14}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":14}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":15}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":37}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":30}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":122}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":24}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":60}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":49}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":12}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":17}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":12}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":74}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":15}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":47}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":109}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":33}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":72}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":114}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":13}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":37}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":17}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":15}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":51}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":109}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":37}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":72}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":114}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":13}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":39}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":17}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":12}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":36}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":26}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":10}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":59}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":63}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":98}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":19}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":63}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":136}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":19}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":16}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":38}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":34}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":133}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":34}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":28}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":27}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":25}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":14}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":21}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":27}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":25}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":39}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":41}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":57}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":14}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":11}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":14}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":26}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":27}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":31}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":30}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":38}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":44}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":63}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":12}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":9}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":10}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":1}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":26}}},"s":{"0":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"110":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"132":0,"144":0,"146":0,"147":0,"150":0,"151":0,"152":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"175":0,"176":0,"178":0,"179":0,"180":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"196":0,"198":0,"199":0,"201":0,"202":0,"204":0,"205":0,"206":0,"207":0,"210":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"226":0,"229":0,"231":0,"234":0,"235":0,"236":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"253":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"290":0,"291":0,"292":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"328":0,"329":0,"330":0,"331":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"344":0,"345":0,"346":0,"347":0,"349":0,"350":0,"351":0,"352":0,"354":0,"356":0,"357":0,"359":0,"361":0,"362":0,"363":0,"364":0,"366":0,"377":0,"378":0,"379":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"393":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"406":0,"407":0,"408":0,"410":0,"411":0,"413":0,"414":0,"416":0,"419":0,"420":0,"421":0,"422":0,"423":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"432":0,"433":0,"434":0,"436":0,"437":0,"438":0,"439":0,"441":0,"443":0,"444":0,"446":0,"448":0,"449":0,"450":0,"452":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"464":0,"465":0,"466":0,"468":0,"470":0,"471":0,"472":0,"473":0,"475":0,"476":0,"477":0,"479":0,"480":0,"481":0,"483":0,"484":0,"486":0,"487":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"502":0,"503":0,"504":0,"505":0,"507":0,"508":0,"509":0,"510":0,"511":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"520":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"531":0,"532":0,"534":0,"536":0,"537":0,"539":0,"540":0,"541":0,"543":0,"544":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"553":0,"554":0,"556":0,"557":0,"559":0,"560":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"572":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"583":0,"585":0,"586":0,"589":0,"590":0,"592":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"604":0,"605":0,"607":0,"609":0,"610":0,"611":0,"612":0,"613":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"623":0,"624":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"636":0,"638":0,"640":0,"642":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":643,"column":-10218}},"locations":[{"start":{"line":1,"column":0},"end":{"line":643,"column":-10218}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":643,"column":-10218}},"loc":{"start":{"line":1,"column":0},"end":{"line":643,"column":-10218}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\HeartbeatConfig.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\HeartbeatConfig.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":55}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":26}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":23}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":32}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":2}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":113}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":11}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":16}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":36}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":13}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":24}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":15}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":34}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":2}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":44}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":35}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":24}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":34}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":4}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":24}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":33}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":19}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":2}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":35}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":8}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":11}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":4}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":4}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":10}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":44}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":79}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":49}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":33}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":43}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":96}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":24}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":72}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":105}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":17}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":57}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":64}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":17}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":50}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":106}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":30}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":79}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":36}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":18}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":19}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":10}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":1}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":27}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":8}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":6}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":16}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":14}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":11}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":4}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":4}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":31}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":57}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":49}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":54}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":93}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":44}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":73}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":70}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":13}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":21}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":45}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":86}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":17}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":12}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":47}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":52}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":44}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":52}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":53}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":55}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":20}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":27}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":38}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":61}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":156}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":16}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":18}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":52}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":53}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":56}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":27}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":40}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":63}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":156}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":16}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":18}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":23}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":10}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":1}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":26}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":7}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":11}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":4}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":10}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":60}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":38}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":78}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":21}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":14}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":75}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":28}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":12}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":13}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":47}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":70}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":72}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":11}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":19}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":48}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":84}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":10}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":15}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":10}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":1}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":91}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":86}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":83}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":77}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":52}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":54}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":19}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":65}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":11}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":41}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":62}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":15}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":7}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":5}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":71}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":22}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":11}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":47}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":15}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":7}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":9}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":35}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":48}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":45}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":28}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":31}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":20}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":9}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":6}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":20}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":4}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":73}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":29}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":37}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":52}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":8}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":26}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":18}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":9}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":40}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":75}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":79}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":25}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":27}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":55}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":9}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":68}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":75}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":28}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":21}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":61}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":15}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":26}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":15}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":10}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":57}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":107}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":49}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":53}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":90}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":14}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":49}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":17}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":41}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":51}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":165}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":82}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":19}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":17}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":32}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":34}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":162}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":11}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":14}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":12}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":60}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":105}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":51}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":16}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":84}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":30}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":53}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":50}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":17}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":20}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":38}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":68}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":19}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":16}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":18}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":17}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":84}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":20}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":72}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":20}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":18}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":16}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":17}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":70}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":75}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":77}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":15}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":23}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":54}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":88}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":14}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":19}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":14}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":25}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":30}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":49}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":54}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":46}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":35}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":41}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":57}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":61}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":89}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":25}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":22}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":62}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":24}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":32}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":27}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":29}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":28}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":51}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":98}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":129}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":20}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":105}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":48}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":25}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":22}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":20}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":41}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":57}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":69}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":89}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":25}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":22}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":38}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":43}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":52}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":84}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":20}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":22}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":41}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":33}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":63}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":59}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":54}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":85}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":81}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":40}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":34}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":66}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":64}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":22}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":18}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":20}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":41}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":57}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":64}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":89}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":25}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":22}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":96}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":45}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":36}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":35}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":33}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":79}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":22}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":21}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":22}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":20}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":30}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":79}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":64}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":51}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":72}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":75}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":91}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":27}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":24}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":76}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":52}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":90}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":24}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":52}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":52}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":84}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":28}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":33}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":60}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":52}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":93}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":58}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":105}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":97}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":29}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":93}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":30}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":25}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":26}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":22}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":25}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":26}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":135}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":59}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":13}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":14}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":14}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":12}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":10}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":1}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":31}}},"s":{"0":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"112":0,"113":0,"114":0,"115":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"158":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"227":0,"229":0,"230":0,"231":0,"232":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"333":0,"334":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"347":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"409":0,"410":0,"411":0,"412":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"433":0,"434":0,"435":0,"436":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"462":0,"463":0,"466":0,"467":0,"468":0,"469":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"485":0,"486":0,"487":0,"488":0,"489":0,"491":0,"493":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"514":0,"515":0,"516":0,"517":0,"519":0,"521":0,"523":0,"526":0,"527":0,"528":0,"531":0,"532":0,"533":0,"534":0,"536":0,"538":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":539,"column":-7776}},"locations":[{"start":{"line":1,"column":0},"end":{"line":539,"column":-7776}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":539,"column":-7776}},"loc":{"start":{"line":1,"column":0},"end":{"line":539,"column":-7776}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\IdentityChangeProposal.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\IdentityChangeProposal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":81}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":72}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":75}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":77}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":27}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":106}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":72}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":98}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":47}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":10}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":69}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":72}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":71}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":38}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":37}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":38}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":32}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":99}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":40}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":76}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":40}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":77}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":98}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":62}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":94}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":161}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":14}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":81}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":41}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":23}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":40}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":39}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":82}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":44}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":94}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":54}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":17}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":87}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":91}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":40}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":18}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":13}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":12}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":94}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":173}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":14}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":81}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":41}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":16}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":40}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":37}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":90}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":44}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":94}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":54}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":87}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":91}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":41}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":13}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":11}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":12}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":11}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":15}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":4}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":4}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":49}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":74}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":50}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":10}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":15}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":37}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":36}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":35}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":130}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":10}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":147}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":46}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":49}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":115}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":81}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":16}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":15}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":53}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":85}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":21}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":59}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":22}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":101}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":43}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":36}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":14}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":49}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":23}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":59}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":61}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":14}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":12}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":23}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":22}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":21}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":47}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":52}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":44}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":42}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":39}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":49}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":116}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":91}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":22}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":93}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":23}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":50}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":53}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":72}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":23}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":35}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":27}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":36}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":41}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":118}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":25}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":23}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":35}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":27}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":37}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":41}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":61}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":52}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":25}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":20}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":18}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":24}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":17}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":1}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":22}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":11}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":12}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":14}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":4}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":4}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":49}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":10}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":134}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":118}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":72}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":12}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":38}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":65}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":85}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":17}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":27}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":21}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":31}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":34}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":67}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":11}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":19}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":78}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":37}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":12}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":10}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":1}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":47}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":42}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":61}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":69}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":47}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":72}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":58}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":35}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":19}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":25}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":34}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":23}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":21}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":11}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":70}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":67}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":64}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":11}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":39}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":37}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":21}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":76}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":25}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":17}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":26}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":7}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":6}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":15}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":55}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":25}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":32}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":19}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":9}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":68}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":68}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":65}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":62}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":9}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":37}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":35}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":19}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":72}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":52}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":15}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":28}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":4}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":54}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":25}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":32}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":19}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":9}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":67}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":94}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":37}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":19}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":71}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":53}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":15}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":28}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":5}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":4}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":55}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":25}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":32}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":19}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":9}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":77}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":89}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":35}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":19}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":72}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":51}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":15}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":28}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":5}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":4}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":17}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":12}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":73}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":64}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":47}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":12}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":3}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":16}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":12}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":73}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":51}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":12}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":3}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":10}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":31}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":17}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":132}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":45}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":17}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":14}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":11}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":108}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":58}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":36}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":57}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":32}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":20}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":13}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":35}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":171}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":16}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":37}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":29}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":44}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":29}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":35}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":37}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":62}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":60}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":61}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":18}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":17}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":30}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":16}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":12}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":11}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":108}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":55}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":13}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":35}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":171}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":16}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":37}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":42}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":26}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":33}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":35}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":60}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":58}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":16}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":15}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":16}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":12}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":10}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":1}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":48}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":25}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":45}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":26}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":32}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":63}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":66}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":67}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":57}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":1}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":43}}},"s":{"0":0,"36":0,"37":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"58":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"69":0,"70":0,"75":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"164":0,"165":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"178":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"207":0,"208":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"220":0,"222":0,"223":0,"225":0,"226":0,"227":0,"230":0,"231":0,"232":0,"233":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"264":0,"268":0,"269":0,"270":0,"271":0,"272":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"315":0,"318":0,"319":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"339":0,"340":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"412":0,"414":0,"415":0,"417":0,"418":0,"419":0,"420":0,"421":0,"425":0,"426":0,"427":0,"429":0,"430":0,"431":0,"432":0,"434":0,"436":0,"437":0,"439":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"455":0,"458":0,"459":0,"460":0,"462":0,"464":0,"465":0,"467":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"480":0,"481":0,"483":0,"487":0,"488":0,"489":0,"490":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"499":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":500,"column":-8333}},"locations":[{"start":{"line":1,"column":0},"end":{"line":500,"column":-8333}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":500,"column":-8333}},"loc":{"start":{"line":1,"column":0},"end":{"line":500,"column":-8333}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\MemoryGraph.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\MemoryGraph.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":89}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":64}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":70}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":66}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":67}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":64}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":2}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":49}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":13}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":17}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":13}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":2}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":23}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":32}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":33}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":56}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":49}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":55}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":33}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":29}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":29}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":53}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":55}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":37}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":18}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":18}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":29}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":64}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":64}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":37}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":35}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":35}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":51}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":61}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":35}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":35}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":20}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":20}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":28}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":29}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":36}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":48}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":48}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":36}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":23}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":54}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":22}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":74}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":75}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":1}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":67}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":52}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":51}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":54}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":64}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":56}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":53}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":51}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":9}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":14}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":10}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":11}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":11}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":15}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":22}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":14}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":16}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":17}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":20}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":20}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":21}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":21}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":28}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":43}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":43}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":19}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":23}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":65}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":37}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":28}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":94}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":76}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":61}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":59}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":18}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":33}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":51}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":7}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":113}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":19}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":37}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":24}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":40}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":45}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":38}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":40}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":24}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":41}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":52}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":15}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":50}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":40}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":39}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":67}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":67}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":39}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":22}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":37}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":37}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":49}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":35}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":33}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":35}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":36}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":40}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":19}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":39}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":44}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":52}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":66}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":31}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":24}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":60}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":51}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":19}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":7}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":22}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":54}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":34}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":38}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":41}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":23}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":55}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":36}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":33}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":36}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":45}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":43}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":7}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":18}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":23}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":21}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":51}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":62}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":53}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":22}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":51}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":34}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":17}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":86}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":29}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":53}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":5}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":73}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":83}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":37}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":48}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":69}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":68}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":39}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":28}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":28}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":58}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":29}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":28}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":28}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":15}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":7}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":21}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":42}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":83}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":41}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":37}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":24}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":48}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":69}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":68}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":50}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":58}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":43}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":25}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":22}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":9}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":79}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":23}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":43}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":68}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":33}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":31}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":55}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":26}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":27}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":24}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":48}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":37}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":24}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":50}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":42}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":21}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":77}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":14}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":9}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":72}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":10}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":57}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":142}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":50}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":95}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":23}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":33}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":31}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":58}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":278}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":12}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":14}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":15}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":53}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":19}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":54}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":45}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":40}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":17}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":79}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":17}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":27}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":21}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":81}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":43}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":19}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":75}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":44}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":17}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":17}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":27}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":21}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":79}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":42}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":19}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":17}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":27}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":21}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":74}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":45}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":19}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":14}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":79}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":17}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":61}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":21}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":84}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":90}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":45}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":19}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":14}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":65}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":42}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":17}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":65}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":37}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":17}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":12}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":23}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":25}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":21}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":47}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":52}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":44}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":116}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":54}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":55}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":66}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":73}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":25}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":30}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":36}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":63}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":62}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":50}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":43}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":22}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":60}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":49}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":52}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":89}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":23}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":39}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":27}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":19}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":20}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":55}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":67}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":22}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":30}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":25}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":26}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":46}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":90}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":34}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":18}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":86}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":20}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":70}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":46}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":23}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":23}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":24}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":83}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":23}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":116}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":72}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":16}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":19}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":77}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":63}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":16}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":15}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":25}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":64}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":56}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":39}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":39}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":35}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":38}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":31}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":10}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":25}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":28}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":23}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":45}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":44}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":42}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":148}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":70}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":58}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":50}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":24}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":23}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":50}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":85}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":43}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":25}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":20}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":80}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":82}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":57}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":46}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":48}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":22}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":57}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":47}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":50}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":22}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":57}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":45}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":77}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":22}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":20}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":87}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":90}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":74}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":40}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":85}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":29}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":22}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":20}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":25}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":26}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":54}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":77}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":55}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":67}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":27}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":58}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":18}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":16}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":12}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":153}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":49}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":49}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":49}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":14}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":49}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":33}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":69}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":60}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":19}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":14}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":12}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":10}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":1}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":27}}},"s":{"0":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"64":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"110":0,"111":0,"112":0,"113":0,"114":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"127":0,"128":0,"129":0,"131":0,"132":0,"134":0,"135":0,"138":0,"139":0,"140":0,"142":0,"143":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"188":0,"189":0,"190":0,"193":0,"194":0,"196":0,"197":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"215":0,"216":0,"217":0,"219":0,"220":0,"222":0,"223":0,"224":0,"225":0,"228":0,"229":0,"232":0,"233":0,"234":0,"237":0,"238":0,"239":0,"240":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"255":0,"256":0,"257":0,"258":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"288":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"307":0,"310":0,"311":0,"312":0,"314":0,"315":0,"316":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"333":0,"334":0,"336":0,"337":0,"339":0,"340":0,"341":0,"343":0,"344":0,"346":0,"347":0,"348":0,"349":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"358":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"374":0,"376":0,"377":0,"379":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"393":0,"394":0,"395":0,"396":0,"397":0,"399":0,"401":0,"404":0,"405":0,"406":0,"407":0,"408":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"427":0,"428":0,"429":0,"432":0,"433":0,"434":0,"435":0,"436":0,"438":0,"439":0,"440":0,"441":0,"444":0,"445":0,"446":0,"449":0,"450":0,"451":0,"452":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"463":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"482":0,"483":0,"484":0,"485":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"502":0,"503":0,"505":0,"506":0,"507":0,"509":0,"512":0,"513":0,"514":0,"515":0,"516":0,"519":0,"520":0,"521":0,"522":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"553":0,"554":0,"555":0,"557":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"585":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"597":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"610":0,"612":0,"613":0,"614":0,"616":0,"618":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":619,"column":-5356}},"locations":[{"start":{"line":1,"column":0},"end":{"line":619,"column":-5356}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":619,"column":-5356}},"loc":{"start":{"line":1,"column":0},"end":{"line":619,"column":-5356}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\MemoryPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\MemoryPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":57}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":90}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":112}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":121}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":118}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":124}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":108}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":2}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":62}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":63}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":53}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":74}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":68}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":56}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":48}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":86}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":18}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":27}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":12}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":62}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":18}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":22}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":9}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":27}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":54}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":41}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":46}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":47}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":19}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":25}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":64}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":67}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":34}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":41}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":47}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":74}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":44}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":44}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":89}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":31}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":15}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":28}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":5}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":4}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":35}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":61}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":14}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":23}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":7}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":64}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":41}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":73}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":6}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":31}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":51}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":10}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":30}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":38}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":114}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":64}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":107}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":57}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":38}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":29}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":23}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":36}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":36}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":26}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":42}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":50}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":29}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":23}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":27}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":45}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":29}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":48}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":16}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":19}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":62}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":77}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":91}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":66}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":18}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":77}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":96}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":65}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":77}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":103}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":65}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":33}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":101}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":16}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":23}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":31}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":60}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":33}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":223}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":12}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":14}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":46}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":22}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":41}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":48}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":69}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":24}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":77}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":42}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":49}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":14}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":13}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":14}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":12}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":33}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":32}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":43}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":38}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":30}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":29}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":50}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":89}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":55}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":15}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":28}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":21}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":48}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":53}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":74}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":28}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":10}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":1}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":21}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":8}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":11}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":11}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":11}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":4}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":43}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":59}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":46}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":10}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":15}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":12}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":36}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":36}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":34}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":124}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":10}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":105}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":48}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":99}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":45}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":17}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":42}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":100}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":16}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":23}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":84}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":86}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":14}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":101}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":54}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":40}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":74}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":17}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":54}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":41}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":21}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":17}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":37}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":56}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":41}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":49}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":14}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":12}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":23}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":22}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":21}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":47}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":52}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":44}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":42}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":69}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":57}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":54}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":21}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":60}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":81}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":21}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":59}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":132}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":22}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":21}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":59}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":80}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":59}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":115}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":22}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":41}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":54}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":44}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":68}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":21}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":48}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":23}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":33}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":27}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":53}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":40}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":31}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":20}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":120}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":53}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":25}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":20}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":18}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":17}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":1}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":21}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":8}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":9}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":10}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":4}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":4}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":10}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":11}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":23}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":82}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":14}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":127}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":129}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":9}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":13}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":13}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":1}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":46}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":25}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":43}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":28}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":46}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":31}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":43}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":41}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":39}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":38}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":36}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":39}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":24}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":1}}},"s":{"0":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"24":0,"25":0,"26":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"164":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"220":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"261":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"328":0,"329":0,"330":0,"331":0,"333":0,"334":0,"336":0,"338":0,"339":0,"340":0,"341":0,"342":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"359":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"370":0,"371":0,"373":0,"374":0,"376":0,"377":0,"378":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":379,"column":-6664}},"locations":[{"start":{"line":1,"column":0},"end":{"line":379,"column":-6664}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":379,"column":-6664}},"loc":{"start":{"line":1,"column":0},"end":{"line":379,"column":-6664}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\MessageSearch.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\MessageSearch.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":74}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":76}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":38}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":46}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":57}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":64}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":56}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":67}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":50}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":9}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":61}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":44}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":7}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":62}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":36}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":67}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":77}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":74}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":7}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":7}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":111}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":41}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":62}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":36}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":24}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":40}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":18}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":44}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":45}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":20}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":102}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":38}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":58}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":95}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":16}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":9}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":55}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":33}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":73}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":44}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":37}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":61}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":67}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":52}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":69}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":39}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":58}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":34}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":72}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":33}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":9}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":7}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":36}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":55}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":65}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":43}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":83}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":31}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":95}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":11}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":56}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":7}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":68}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":44}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":43}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":34}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":52}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":6}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":107}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":43}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":62}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":40}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":43}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":52}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":6}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":107}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":43}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":62}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":49}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":54}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":27}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":35}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":57}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":7}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":41}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":25}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":21}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":7}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":68}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":25}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":27}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":16}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":9}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":6}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":54}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":70}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":65}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":19}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":28}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":48}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":23}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":34}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":37}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":57}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":7}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":5}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":4}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":29}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":30}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":4}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":30}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":31}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":55}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":5}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":4}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":10}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":6}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":13}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":23}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":17}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":30}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":215}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":40}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":36}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":30}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":42}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":56}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":15}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":23}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":20}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":21}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":47}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":52}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":44}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":42}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":116}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":39}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":80}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":49}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":103}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":24}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":31}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":33}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":62}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":52}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":248}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":45}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":20}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":29}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":27}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":35}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":43}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":138}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":47}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":47}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":29}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":22}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":23}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":31}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":63}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":27}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":65}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":53}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":45}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":45}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":48}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":67}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":46}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":59}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":84}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":70}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":27}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":27}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":35}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":37}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":31}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":46}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":39}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":49}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":55}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":29}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":27}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":35}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":37}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":31}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":42}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":45}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":57}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":29}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":24}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":21}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":31}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":33}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":29}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":55}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":60}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":52}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":87}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":58}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":63}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":108}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":58}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":32}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":31}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":48}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":130}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":187}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":58}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":60}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":70}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":33}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":28}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":63}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":108}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":59}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":32}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":31}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":51}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":136}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":187}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":63}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":62}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":65}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":67}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":33}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":28}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":26}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":31}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":32}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":54}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":38}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":103}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":56}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":69}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":29}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":35}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":37}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":54}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":190}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":30}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":31}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":23}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":24}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":22}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":55}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":96}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":54}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":22}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":18}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":23}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":24}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":7}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":1}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":39}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":15}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":16}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":83}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":22}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":35}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":71}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":46}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":39}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":60}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":35}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":23}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":18}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":56}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":30}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":63}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":29}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":5}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":3}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":42}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":44}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":59}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":32}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":77}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":32}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":12}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":89}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":5}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":39}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":20}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":43}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":28}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":34}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":54}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":16}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":51}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":44}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":13}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":6}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":26}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":3}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":32}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":39}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":3}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":16}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":1}}},"s":{"0":0,"20":0,"21":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"66":0,"67":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"94":0,"95":0,"97":0,"98":0,"100":0,"102":0,"104":0,"105":0,"107":0,"108":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"170":0,"171":0,"172":0,"173":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"185":0,"186":0,"187":0,"190":0,"191":0,"192":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"206":0,"207":0,"208":0,"209":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"232":0,"233":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"246":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"266":0,"267":0,"269":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"282":0,"283":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"309":0,"310":0,"311":0,"313":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"324":0,"326":0,"327":0,"328":0,"330":0,"331":0,"332":0,"333":0,"334":0,"336":0,"337":0,"338":0,"339":0,"340":0,"343":0,"344":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"362":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"376":0,"377":0,"378":0,"379":0,"380":0,"384":0,"385":0,"386":0,"387":0,"389":0,"390":0,"392":0,"393":0,"395":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"405":0,"406":0,"408":0,"409":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"422":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"436":0,"437":0,"439":0,"440":0,"443":0,"444":0,"445":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"458":0,"459":0,"460":0,"462":0,"463":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":464,"column":-5102}},"locations":[{"start":{"line":1,"column":0},"end":{"line":464,"column":-5102}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":464,"column":-5102}},"loc":{"start":{"line":1,"column":0},"end":{"line":464,"column":-5102}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\OfflineIndicator.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\OfflineIndicator.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":56}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":32}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":62}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":65}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":44}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":54}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":58}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":41}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":75}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":50}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":45}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":34}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":18}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":14}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":27}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":9}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":14}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":21}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":55}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":66}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":66}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":49}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":52}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":40}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":58}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":30}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":28}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":32}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":41}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":43}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":39}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":20}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":72}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":4}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":45}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":58}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":11}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":41}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":3}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":16}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":62}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":22}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":60}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":66}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":34}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":135}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":34}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":12}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":62}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":65}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":34}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":127}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":36}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":13}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":12}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":21}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":40}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":38}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":37}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":12}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":69}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":21}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":100}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":96}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":13}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":21}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":59}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":67}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":26}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":61}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":64}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":34}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":48}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":105}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":17}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":47}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":70}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":33}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":18}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":46}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":42}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":43}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":58}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":27}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":19}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":31}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":34}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":38}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":47}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":25}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":18}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":51}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":46}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":41}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":159}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":49}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":23}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":32}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":21}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":41}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":217}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":41}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":47}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":21}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":70}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":165}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":37}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":51}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":53}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":23}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":16}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":25}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":52}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":49}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":54}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":46}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":127}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":115}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":87}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":23}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":20}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":56}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":31}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":81}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":33}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":68}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":21}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":26}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":22}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":1}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":69}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":46}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":24}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":67}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":66}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":72}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":71}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":4}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":46}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":33}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":10}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":116}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":65}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":38}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":73}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":44}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":12}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":54}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":50}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":51}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":17}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":64}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":77}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":14}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":39}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":15}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":51}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":76}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":22}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":35}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":17}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":10}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":1}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":83}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":71}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":66}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":45}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":58}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":11}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":54}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":10}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":62}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":11}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":43}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":21}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":28}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":48}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":43}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":26}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":11}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":11}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":30}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":21}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":30}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":48}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":31}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":28}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":11}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":80}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":13}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":28}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":129}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":24}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":15}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":10}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":32}}},"s":{"0":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"45":0,"50":0,"51":0,"52":0,"53":0,"54":0,"59":0,"60":0,"61":0,"62":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"97":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"106":0,"107":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"124":0,"125":0,"126":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"155":0,"157":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"185":0,"186":0,"188":0,"190":0,"193":0,"194":0,"195":0,"196":0,"197":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"218":0,"219":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"230":0,"232":0,"233":0,"234":0,"235":0,"237":0,"239":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"249":0,"251":0,"252":0,"254":0,"255":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"284":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"299":0,"300":0,"302":0,"303":0,"304":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"317":0,"318":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"329":0,"331":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"344":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"375":0,"377":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":-4739}},"locations":[{"start":{"line":1,"column":0},"end":{"line":378,"column":-4739}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":378,"column":-4739}},"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":-4739}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\PersonalitySelector.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\PersonalitySelector.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":78}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":8}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":11}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":6}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":2}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":95}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":10}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":61}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":44}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":64}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":47}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":24}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":25}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":40}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":38}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":47}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":26}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":74}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":87}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":66}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":131}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":25}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":38}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":115}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":56}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":77}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":43}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":83}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":16}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":51}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":78}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":68}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":34}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":55}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":57}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":32}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":55}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":52}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":87}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":25}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":9}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":100}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":34}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":73}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":58}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":28}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":30}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":10}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":9}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":81}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":25}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":17}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":8}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":73}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":33}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":11}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}}},"s":{"0":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"66":0,"67":0,"70":0,"71":0,"72":0,"75":0,"76":0,"77":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"100":0,"109":0,"110":0,"112":0,"113":0,"115":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"133":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":134,"column":-1623}},"locations":[{"start":{"line":1,"column":0},"end":{"line":134,"column":-1623}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":134,"column":-1623}},"loc":{"start":{"line":1,"column":0},"end":{"line":134,"column":-1623}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\PipelineResultPreview.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\PipelineResultPreview.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":57}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":55}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":16}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":15}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":16}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":15}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":68}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":15}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":59}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":56}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":20}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":60}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":56}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":48}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":40}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":68}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":52}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":60}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":32}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":45}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":25}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":36}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":17}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":36}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":147}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":30}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":38}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":82}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":21}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":66}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":12}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":47}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":57}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":105}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":46}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":17}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":15}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":34}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":147}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":42}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":12}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":1}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":50}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":46}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":31}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":51}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":34}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":52}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":32}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":45}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":4}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":30}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":13}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":144}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":94}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":95}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":61}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":50}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":13}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":86}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":85}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":81}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":55}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":43}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":57}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":47}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":30}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":4}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":8}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":93}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":67}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":6}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":1}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":39}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":9}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":13}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":10}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":56}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":72}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":107}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":95}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":59}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":38}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":50}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":55}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":31}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":25}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":18}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":46}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":22}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":110}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":55}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":58}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":77}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":33}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":57}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":16}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":14}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":46}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":4}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":10}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":114}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":107}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":78}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":15}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":66}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":88}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":21}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":17}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":29}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":76}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":51}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":19}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":12}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":125}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":15}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":41}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":73}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":27}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":86}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":88}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":13}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":9}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":17}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":15}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":41}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":73}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":27}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":86}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":88}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":13}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":9}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":17}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":45}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":73}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":31}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":86}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":88}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":13}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":9}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":17}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":25}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":17}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":48}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":75}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":34}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":88}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":90}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":15}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":11}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":19}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":50}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":25}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":12}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":34}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":75}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":84}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":39}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":15}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":37}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":47}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":58}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":15}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":14}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":137}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":67}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":61}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":15}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":21}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":17}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":29}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":118}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":11}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":19}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":12}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":10}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":1}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":37}}},"s":{"0":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"62":0,"63":0,"75":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"111":0,"113":0,"114":0,"115":0,"117":0,"123":0,"124":0,"125":0,"127":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"156":0,"158":0,"159":0,"161":0,"162":0,"163":0,"165":0,"167":0,"169":0,"171":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"194":0,"195":0,"198":0,"201":0,"202":0,"203":0,"205":0,"208":0,"209":0,"210":0,"211":0,"213":0,"214":0,"215":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"227":0,"228":0,"229":0,"230":0,"232":0,"233":0,"235":0,"236":0,"237":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"249":0,"250":0,"252":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"296":0,"298":0,"301":0,"302":0,"303":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"332":0,"333":0,"335":0,"337":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":338,"column":-4297}},"locations":[{"start":{"line":1,"column":0},"end":{"line":338,"column":-4297}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":338,"column":-4297}},"loc":{"start":{"line":1,"column":0},"end":{"line":338,"column":-4297}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\PipelinesPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\PipelinesPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":79}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":108}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":116}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":108}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":116}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":107}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":104}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":101}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":118}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":103}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":2}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":70}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":84}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":11}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":1}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":63}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":140}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":61}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":59}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":15}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":36}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":17}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":68}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":49}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":16}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":54}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":12}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":80}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":10}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":36}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":51}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":51}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":117}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":13}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":40}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":66}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":41}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":19}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":108}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":48}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":15}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":41}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":149}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":38}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":69}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":71}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":49}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":40}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":81}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":7}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":53}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":48}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":77}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":63}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":54}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":4}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":33}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":63}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":28}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":35}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":5}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":21}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":9}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":53}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":52}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":29}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":27}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":32}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":34}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":7}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":68}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":15}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":24}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":61}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":37}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":30}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":20}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":45}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":19}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":43}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":75}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":43}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":20}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":161}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":12}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":16}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":23}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":43}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":75}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":43}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":161}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":12}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":25}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":43}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":88}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":161}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":12}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":21}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":53}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":18}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":29}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":51}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":79}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":83}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":14}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":80}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":20}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":17}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":43}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":75}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":161}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":44}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":41}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":44}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":23}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":15}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":26}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":37}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":41}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":67}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":22}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":33}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":69}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":36}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":62}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":52}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":41}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":57}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":59}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":20}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":87}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":18}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":87}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":15}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":16}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":16}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":43}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":75}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":43}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":161}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":12}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":4}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":10}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":85}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":120}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":109}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":51}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":61}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":17}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":82}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":38}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":19}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":70}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":38}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":18}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":18}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":16}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":17}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":29}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":76}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":51}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":19}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":14}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":39}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":43}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":97}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":29}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":80}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":61}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":54}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":23}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":22}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":34}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":18}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":13}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":33}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":73}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":41}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":78}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":25}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":20}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":17}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":35}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":75}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":60}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":74}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":87}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":48}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":23}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":20}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":84}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":20}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":73}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":62}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":18}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":14}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":111}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":17}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":29}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":30}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":138}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":11}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":19}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":17}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":31}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":30}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":141}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":24}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":16}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":60}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":17}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":44}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":17}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":19}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":14}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":12}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":10}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":1}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":34}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":80}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":53}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":86}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":31}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":63}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":44}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":5}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":32}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":61}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":4}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":39}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":23}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":14}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":76}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":76}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":81}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":7}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":16}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":57}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":34}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":4}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":62}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":30}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":40}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":40}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":12}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":55}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":5}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":4}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":10}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":42}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":107}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":49}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":55}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":78}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":15}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":123}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":30}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":17}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":14}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":15}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":27}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":28}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":152}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":78}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":17}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":12}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":83}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":34}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":95}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":16}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":23}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":41}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":31}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":60}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":166}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":12}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":14}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":35}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":61}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":56}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":19}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":55}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":75}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":41}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":44}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":124}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":17}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":13}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":21}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":38}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":21}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":25}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":56}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":77}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":42}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":46}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":126}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":19}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":52}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":23}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":15}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":16}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":12}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":50}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":20}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":65}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":70}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":16}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":21}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":57}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":56}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":26}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":16}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":46}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":58}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":56}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":32}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":69}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":16}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":65}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":50}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":27}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":33}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":35}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":41}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":16}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":15}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":16}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":12}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":28}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":17}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":37}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":51}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":40}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":10}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":10}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":1}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":30}}},"s":{"0":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"111":0,"112":0,"113":0,"115":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"142":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"336":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"348":0,"349":0,"350":0,"352":0,"353":0,"354":0,"356":0,"358":0,"359":0,"361":0,"363":0,"364":0,"365":0,"366":0,"368":0,"372":0,"373":0,"374":0,"375":0,"376":0,"378":0,"379":0,"380":0,"383":0,"384":0,"385":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"397":0,"398":0,"399":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"410":0,"411":0,"413":0,"414":0,"415":0,"416":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"428":0,"430":0,"431":0,"434":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"471":0,"472":0,"473":0,"474":0,"476":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"506":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"516":0,"518":0,"520":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":521,"column":-8305}},"locations":[{"start":{"line":1,"column":0},"end":{"line":521,"column":-8305}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":521,"column":-8305}},"loc":{"start":{"line":1,"column":0},"end":{"line":521,"column":-8305}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ReflectionLog.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ReflectionLog.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":42}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":33}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":32}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":30}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":2}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":41}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":7}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":63}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":40}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":46}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":11}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":76}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":53}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":72}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":74}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":103}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":13}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":21}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":48}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":49}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":13}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":44}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":45}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":12}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":46}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":44}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":2}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":77}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":9}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":44}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":45}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":11}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":50}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":51}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":8}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":46}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":47}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":2}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":65}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":53}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":3}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":22}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":13}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":4}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":30}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":12}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":31}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":41}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":55}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":18}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":3}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":63}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":26}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":106}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":18}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":3}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":24}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":1}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":63}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":73}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":9}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":129}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":34}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":80}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":11}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":1}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":60}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":69}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":9}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":118}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":69}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":11}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":1}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":68}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":50}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":10}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":92}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":13}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":124}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":56}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":40}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":91}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":71}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":39}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":14}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":14}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":73}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":74}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":15}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":23}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":53}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":47}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":52}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":44}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":104}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":93}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":38}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":48}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":134}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":22}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":21}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":17}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":17}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":23}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":24}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":10}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":1}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":83}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":10}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":103}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":38}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":54}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":81}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":30}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":17}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":59}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":14}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":92}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":12}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":10}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":1}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":11}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":12}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":11}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":4}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":4}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":50}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":67}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":75}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":10}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":131}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":51}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":110}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":79}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":14}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":40}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":51}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":87}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":19}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":130}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":19}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":16}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":79}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":29}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":14}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":48}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":115}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":47}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":48}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":17}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":12}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":23}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":22}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":21}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":47}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":52}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":44}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":73}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":43}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":94}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":21}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":148}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":58}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":66}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":22}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":20}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":19}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":94}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":21}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":148}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":60}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":68}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":20}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":18}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":100}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":15}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":28}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":159}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":35}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":17}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":15}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":29}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":137}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":39}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":17}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":12}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":10}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":1}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":26}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":9}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":13}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":11}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":4}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":4}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":92}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":92}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":10}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":92}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":13}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":26}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":125}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":115}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":55}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":14}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":40}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":56}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":83}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":19}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":71}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":66}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":19}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":16}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":59}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":65}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":35}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":19}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":61}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":35}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":19}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":63}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":45}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":19}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":54}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":69}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":53}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":21}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":16}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":14}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":59}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":60}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":15}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":23}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":24}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":21}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":47}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":52}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":44}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":69}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":43}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":46}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":21}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":117}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":23}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":45}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":58}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":63}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":23}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":24}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":22}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":50}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":21}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":117}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":23}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":45}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":66}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":75}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":23}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":24}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":22}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":147}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":56}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":71}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":20}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":18}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":23}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":24}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":10}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":1}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":31}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":17}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":25}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":20}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":19}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":24}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":65}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":89}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":68}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":58}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":54}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":77}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":58}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":19}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":23}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":15}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":19}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":34}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":11}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":57}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":79}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":70}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":89}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":39}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":23}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":69}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":7}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":6}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":15}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":24}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":49}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":26}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":19}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":9}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":63}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":16}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":62}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":9}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":56}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":28}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":27}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":33}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":36}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":21}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":10}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":95}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":46}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":78}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":59}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":15}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":56}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":60}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":22}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":19}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":38}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":29}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":14}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":25}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":85}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":11}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":9}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":89}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":39}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":7}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":19}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":76}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":63}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":40}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":15}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":29}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":5}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":16}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":44}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":49}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":69}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":128}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":36}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":6}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":23}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":4}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":43}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":49}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":68}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":128}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":35}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":6}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":22}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":4}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":31}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":44}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":107}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":115}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":124}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":88}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":16}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":10}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":57}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":107}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":49}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":55}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":90}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":14}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":49}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":17}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":54}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":107}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":22}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":44}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":19}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":17}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":35}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":35}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":190}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":29}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":60}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":42}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":14}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":19}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":14}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":12}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":142}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":59}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":108}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":15}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":63}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":72}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":15}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":59}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":76}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":15}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":63}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":79}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":15}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":12}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":23}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":19}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":21}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":47}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":52}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":44}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":39}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":152}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":94}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":53}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":36}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":20}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":21}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":46}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":105}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":41}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":23}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":18}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":23}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":24}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":23}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":24}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":21}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":47}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":52}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":44}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":85}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":74}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":65}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":89}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":22}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":31}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":25}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":26}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":65}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":34}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":114}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":163}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":18}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":20}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":65}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":94}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":23}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":124}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":80}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":101}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":21}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":29}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":76}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":94}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":20}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":25}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":20}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":65}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":87}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":23}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":110}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":80}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":94}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":21}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":29}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":69}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":94}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":20}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":25}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":20}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":18}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":23}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":24}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":60}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":41}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":37}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":109}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":51}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":47}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":17}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":49}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":27}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":33}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":35}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":65}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":63}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":16}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":15}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":16}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":35}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":103}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":43}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":15}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":35}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":109}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":59}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":47}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":21}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":39}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":78}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":15}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":23}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":18}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":37}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":30}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":38}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":31}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":60}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":111}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":16}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":14}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":14}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":12}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":10}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":1}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":29}}},"s":{"0":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"124":0,"126":0,"127":0,"128":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"151":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"162":0,"163":0,"164":0,"167":0,"168":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"179":0,"180":0,"181":0,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"194":0,"196":0,"197":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"215":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"240":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"258":0,"259":0,"260":0,"261":0,"262":0,"266":0,"267":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"295":0,"296":0,"298":0,"300":0,"301":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"313":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"333":0,"335":0,"336":0,"337":0,"338":0,"340":0,"342":0,"343":0,"344":0,"345":0,"347":0,"349":0,"350":0,"351":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"363":0,"364":0,"365":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"400":0,"401":0,"402":0,"403":0,"405":0,"407":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"417":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"433":0,"434":0,"435":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"457":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"476":0,"477":0,"478":0,"481":0,"482":0,"483":0,"485":0,"487":0,"488":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"499":0,"500":0,"501":0,"502":0,"504":0,"505":0,"506":0,"507":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"518":0,"519":0,"523":0,"524":0,"525":0,"527":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"580":0,"581":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"601":0,"602":0,"604":0,"605":0,"607":0,"608":0,"609":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"645":0,"646":0,"647":0,"648":0,"650":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"706":0,"709":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"729":0,"730":0,"731":0,"733":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"744":0,"745":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"756":0,"757":0,"758":0,"760":0,"762":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":763,"column":-13542}},"locations":[{"start":{"line":1,"column":0},"end":{"line":763,"column":-13542}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":763,"column":-13542}},"loc":{"start":{"line":1,"column":0},"end":{"line":763,"column":-13542}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\RightPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\RightPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":65}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":69}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":43}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":40}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":37}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":36}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":49}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":83}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":34}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":73}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":17}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":15}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":7}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":16}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":20}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":10}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":7}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":8}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":10}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":11}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":23}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":107}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":14}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":90}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":132}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":12}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":26}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":13}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":71}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":69}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":55}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":48}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":56}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":60}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":56}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":64}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":68}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":58}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":63}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":59}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":83}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":151}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":81}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":62}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":72}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":52}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":32}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":64}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":30}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":4}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":135}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":61}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":69}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":19}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":49}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":65}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":52}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":20}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":19}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":23}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":25}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":18}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":33}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":54}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":4}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":33}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":31}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":65}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":4}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":34}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":67}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":29}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":4}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":39}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":73}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":62}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":35}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":48}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":56}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":50}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":92}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":64}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":56}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":56}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":46}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":44}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":7}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":49}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":88}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":5}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":70}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":80}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":71}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":145}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":84}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":110}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":83}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":53}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":39}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":24}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":62}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":56}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":45}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":25}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":53}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":33}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":13}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":24}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":9}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":7}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":24}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":74}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":46}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":25}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":53}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":18}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":33}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":24}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":7}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":20}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":70}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":83}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":59}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":43}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":50}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":51}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":22}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":12}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":20}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":42}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":49}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":47}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":25}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":12}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":20}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":42}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":51}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":12}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":20}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":43}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":50}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":48}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":22}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":12}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":14}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":59}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":20}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":47}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":54}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":51}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":12}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":20}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":45}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":52}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":49}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":22}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":12}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":45}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":52}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":56}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":22}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":12}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":20}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":46}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":53}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":46}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":22}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":12}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":14}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":12}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":121}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":82}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":47}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":44}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":69}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":65}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":14}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":103}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":94}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":39}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":14}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":12}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":77}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":35}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":37}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":97}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":21}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":57}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":117}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":43}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":92}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":101}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":19}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":48}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":23}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":21}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":58}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":117}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":44}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":92}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":101}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":19}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":51}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":23}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":42}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":29}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":112}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":31}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":16}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":42}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":27}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":40}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":28}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":40}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":33}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":41}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":41}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":37}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":37}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":23}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":36}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":44}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":120}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":70}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":57}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":169}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":45}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":77}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":37}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":24}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":23}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":118}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":75}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":53}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":74}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":109}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":32}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":74}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":32}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":26}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":120}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":24}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":22}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":34}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":36}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":48}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":29}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":41}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":33}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":50}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":48}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":23}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":31}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":29}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":41}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":33}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":102}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":46}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":23}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":31}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":26}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":27}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":39}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":31}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":47}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":45}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":21}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":29}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":25}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":20}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":25}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":23}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":36}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":44}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":120}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":105}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":47}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":43}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":137}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":137}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":149}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":140}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":22}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":51}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":86}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":87}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":89}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":81}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":22}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":25}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":23}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":36}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":44}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":120}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":111}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":47}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":43}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":145}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":145}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":183}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":158}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":170}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":166}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":22}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":51}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":67}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":72}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":69}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":46}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":86}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":65}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":49}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":74}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":25}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":26}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":24}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":140}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":130}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":117}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":107}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":22}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":25}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":23}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":36}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":44}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":120}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":70}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":109}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":87}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":81}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":24}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":20}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":49}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":75}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":147}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":77}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":103}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":73}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":60}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":30}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":26}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":110}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":24}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":22}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":122}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":20}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":25}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":16}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":37}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":31}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":56}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":16}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":12}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":19}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":32}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":40}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":203}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":66}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":53}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":28}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":79}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":80}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":65}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":176}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":22}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":18}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":27}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":21}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":31}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":25}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":87}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":67}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":36}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":41}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":53}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":23}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":16}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":45}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":50}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":55}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":75}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":18}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":32}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":52}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":57}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":71}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":20}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":50}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":57}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":81}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":18}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":16}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":62}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":34}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":21}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":33}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":25}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":41}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":34}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":15}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":23}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":18}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":21}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":87}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":21}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":19}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":32}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":40}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":70}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":93}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":53}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":15}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":47}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":50}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":57}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":79}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":18}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":50}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":57}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":84}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":18}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":50}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":57}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":80}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":18}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":50}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":57}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":84}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":18}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":16}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":21}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":19}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":32}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":40}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":70}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":93}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":43}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":15}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":32}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":41}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":44}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":76}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":155}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":47}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":24}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":74}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":22}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":17}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":37}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":81}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":18}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":49}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":51}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":16}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":21}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":24}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":21}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":34}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":42}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":72}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":95}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":51}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":17}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":49}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":52}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":59}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":93}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":20}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":52}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":59}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":93}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":20}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":52}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":62}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":108}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":20}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":18}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":23}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":37}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":21}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":34}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":42}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":72}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":95}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":46}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":40}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":17}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":47}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":65}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":62}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":82}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":95}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":59}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":25}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":22}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":17}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":18}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":23}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":19}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":32}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":40}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":70}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":93}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":43}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":15}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":47}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":50}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":57}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":69}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":18}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":50}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":63}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":76}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":18}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":50}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":58}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":68}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":18}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":50}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":58}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":74}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":18}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":16}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":21}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":13}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":12}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":12}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":1}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":71}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":10}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":32}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":55}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":67}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":10}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":1}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":26}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":10}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":22}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":15}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":10}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":27}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":27}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":35}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":39}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":49}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":70}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":35}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":35}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":47}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":46}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":4}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":1}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":21}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":8}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":8}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":11}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":14}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":4}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":4}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":10}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":29}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":63}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":12}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":19}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":21}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":50}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":33}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":97}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":8}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":12}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":1}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":22}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":8}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":10}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":11}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":4}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":4}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":10}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":123}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":26}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":94}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":12}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"24":0,"25":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"42":0,"43":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"66":0,"67":0,"68":0,"70":0,"83":0,"85":0,"86":0,"87":0,"88":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"179":0,"180":0,"181":0,"183":0,"184":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"215":0,"216":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"302":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"313":0,"315":0,"316":0,"319":0,"320":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"342":0,"343":0,"344":0,"345":0,"346":0,"348":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"359":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"385":0,"386":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"395":0,"397":0,"398":0,"399":0,"401":0,"402":0,"403":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"422":0,"424":0,"425":0,"426":0,"427":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"458":0,"460":0,"461":0,"462":0,"463":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"493":0,"495":0,"496":0,"497":0,"498":0,"500":0,"501":0,"502":0,"503":0,"505":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"520":0,"521":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"549":0,"550":0,"552":0,"553":0,"555":0,"558":0,"559":0,"560":0,"561":0,"563":0,"564":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"583":0,"584":0,"585":0,"588":0,"589":0,"590":0,"591":0,"593":0,"594":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"610":0,"612":0,"613":0,"614":0,"616":0,"619":0,"620":0,"621":0,"622":0,"623":0,"625":0,"626":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"647":0,"648":0,"649":0,"650":0,"651":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"671":0,"672":0,"673":0,"674":0,"676":0,"677":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"701":0,"703":0,"705":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"714":0,"729":0,"730":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"781":0,"783":0,"784":0,"785":0,"786":0,"787":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"798":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":799,"column":-16140}},"locations":[{"start":{"line":1,"column":0},"end":{"line":799,"column":-16140}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":799,"column":-16140}},"loc":{"start":{"line":1,"column":0},"end":{"line":799,"column":-16140}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ScenarioTags.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ScenarioTags.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":78}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":7}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":10}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":10}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":11}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":10}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":9}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":2}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":30}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":8}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":11}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":12}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":50}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":37}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":56}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":41}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":41}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":7}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":10}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":48}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":44}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":39}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":60}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":54}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":76}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":52}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":50}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":49}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":47}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":54}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":37}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":109}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":91}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":66}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":32}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":34}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":125}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":91}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":31}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":47}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":55}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":40}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":30}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":13}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":12}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":98}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":14}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":48}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":15}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":30}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":17}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":25}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":40}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":52}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":11}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":12}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":40}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":40}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":67}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":80}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":48}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":65}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":36}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":22}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":26}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":115}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":29}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":16}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":10}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":79}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":56}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":10}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":59}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":30}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":59}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":30}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":56}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":16}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":144}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":49}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":9}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":10}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":1}}},"s":{"0":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"93":0,"95":0,"96":0,"98":0,"99":0,"100":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"116":0,"119":0,"120":0,"121":0,"122":0,"123":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"135":0,"136":0,"138":0,"139":0,"140":0,"142":0,"144":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"162":0,"163":0,"164":0,"165":0,"167":0,"168":0,"169":0,"171":0,"172":0,"174":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":175,"column":-1958}},"locations":[{"start":{"line":1,"column":0},"end":{"line":175,"column":-1958}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":175,"column":-1958}},"loc":{"start":{"line":1,"column":0},"end":{"line":175,"column":-1958}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\SchedulerPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\SchedulerPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":38}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":23}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":21}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":18}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":18}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":15}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":2}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":20}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":9}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":8}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":11}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":23}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":95}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":14}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":79}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":88}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":9}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":38}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":13}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":13}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":21}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":8}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":14}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":14}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":11}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":4}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":38}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":121}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":50}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":78}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":84}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":10}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":35}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":15}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":28}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":144}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":17}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":78}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":45}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":57}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":48}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":75}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":53}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":65}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":73}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":67}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":58}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":89}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":55}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":19}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":17}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":18}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":22}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":53}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":17}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":35}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":30}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":26}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":15}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":60}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":36}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":18}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":39}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":24}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":64}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":82}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":7}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":59}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":72}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":9}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":18}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":14}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":51}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":49}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":32}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":34}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":36}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":18}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":46}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":52}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":59}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":52}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":9}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":22}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":42}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":49}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":9}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":14}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":18}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":36}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":44}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":9}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":36}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":44}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":9}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":14}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":29}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":39}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":25}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":47}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":17}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":56}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":49}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":50}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":4}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":54}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":23}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":13}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":5}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":26}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":28}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":9}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":48}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":33}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":35}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":17}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":44}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":17}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":36}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":32}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":10}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":62}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":34}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":9}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":33}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":24}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":20}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":18}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":15}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":19}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":31}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":69}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":15}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":29}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":5}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":4}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":89}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":55}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":24}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":25}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":38}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":32}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":25}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":9}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":5}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":4}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":75}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":19}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":61}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":18}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":60}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":64}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":14}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":18}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":5}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":4}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":27}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":10}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":73}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":10}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":65}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":25}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":8}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":144}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":123}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":51}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":113}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":76}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":18}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":17}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":82}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":19}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":70}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":18}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":16}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":17}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":29}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":104}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":37}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":19}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":14}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":87}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":15}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":95}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":58}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":20}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":18}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":25}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":35}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":67}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":38}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":200}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":87}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":17}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":14}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":29}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":79}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":51}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":29}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":18}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":16}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":15}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":95}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":58}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":20}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":40}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":16}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":53}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":53}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":49}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":33}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":23}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":36}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":31}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":91}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":93}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":58}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":64}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":143}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":21}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":32}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":25}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":17}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":18}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":16}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":48}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":17}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":97}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":64}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":22}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":20}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":27}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":47}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":79}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":49}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":212}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":99}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":19}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":16}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":41}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":81}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":53}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":41}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":20}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":56}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":18}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":18}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":52}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":40}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":38}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":99}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":62}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":24}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":22}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":31}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":25}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":48}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":95}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":183}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":100}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":21}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":18}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":42}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":83}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":55}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":42}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":22}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":20}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":36}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":99}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":24}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":23}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":47}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":111}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":217}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":53}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":51}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":49}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":25}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":20}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":18}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":48}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":40}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":38}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":99}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":62}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":24}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":22}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":29}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":46}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":78}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":183}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":98}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":21}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":18}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":40}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":83}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":55}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":40}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":22}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":20}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":38}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":99}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":62}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":24}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":22}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":29}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":46}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":78}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":183}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":98}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":21}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":18}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":40}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":83}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":55}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":40}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":22}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":20}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":15}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":95}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":20}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":40}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":16}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":49}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":57}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":51}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":33}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":23}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":36}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":31}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":34}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":74}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":82}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":20}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":93}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":56}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":64}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":143}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":21}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":32}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":25}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":17}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":18}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":16}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":15}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":95}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":58}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":20}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":19}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":39}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":71}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":179}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":91}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":17}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":49}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":54}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":58}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":44}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":25}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":17}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":21}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":33}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":79}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":51}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":33}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":18}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":52}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":56}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":128}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":18}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":16}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":15}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":95}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":20}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":21}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":42}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":74}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":38}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":22}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":246}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":14}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":16}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":51}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":18}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":29}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":26}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":40}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":72}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":91}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":14}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":90}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":20}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":16}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":42}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":136}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":63}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":54}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":18}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":40}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":128}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":63}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":61}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":18}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":15}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":125}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":17}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":25}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":29}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":35}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":193}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":11}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":19}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":17}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":25}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":27}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":34}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":65}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":155}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":29}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":16}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":60}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":17}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":16}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":44}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":17}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":19}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":14}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":12}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":10}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":1}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":34}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":65}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":73}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":57}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":65}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":67}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":69}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":131}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":67}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":68}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":74}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":90}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":82}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":66}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":19}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":25}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":20}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":42}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":45}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":31}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":9}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":49}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":25}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":27}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":50}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":34}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":34}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":9}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":66}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":33}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":34}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":9}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":73}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":34}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":9}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":55}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":9}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":30}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":9}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":28}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":66}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":14}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":35}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":7}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":37}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":36}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":28}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":21}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":55}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":18}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":15}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":33}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":5}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":55}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":75}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":9}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":40}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":28}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":21}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":58}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":5}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":39}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":49}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":12}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":39}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":79}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":64}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":12}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":12}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":3}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":10}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":6}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":33}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":64}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":15}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":80}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":17}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":75}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":16}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":16}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":17}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":48}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":32}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":124}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":26}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":62}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":51}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":14}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":19}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":14}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":59}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":89}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":22}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":48}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":55}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":26}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":26}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":14}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":22}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":47}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":54}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":24}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":27}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":14}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":22}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":48}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":55}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":30}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":25}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":14}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":22}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":46}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":53}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":28}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":26}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":14}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":16}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":41}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":19}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":39}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":141}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":42}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":21}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":41}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":19}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":44}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":141}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":42}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":21}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":14}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":39}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":112}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":44}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":25}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":31}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":30}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":46}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":36}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":42}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":16}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":41}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":47}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":22}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":33}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":108}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":61}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":123}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":86}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":28}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":27}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":83}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":37}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":30}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":82}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":41}},"845":{"start":{"line":846,"column":0},"end":{"line":846,"column":30}},"846":{"start":{"line":847,"column":0},"end":{"line":847,"column":28}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":26}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":61}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":27}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":66}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":50}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":100}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":54}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":104}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":93}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":27}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":107}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":29}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":26}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":24}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":19}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":20}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":16}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":38}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":27}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":39}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":30}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":28}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":41}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":54}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":14}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":114}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":41}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":27}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":34}},"884":{"start":{"line":885,"column":0},"end":{"line":885,"column":31}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":65}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":37}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":49}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":18}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":43}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":48}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":24}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":39}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":110}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":63}},"897":{"start":{"line":898,"column":0},"end":{"line":898,"column":129}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":96}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":30}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":29}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":85}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":43}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":32}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":84}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":59}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":32}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":30}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":28}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":63}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":44}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":85}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":47}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":33}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":31}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":76}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":111}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":36}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":54}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":33}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":31}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":70}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":151}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":36}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":59}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":33}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":31}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":77}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":151}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":36}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":57}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":33}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":28}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":26}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":21}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":25}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":50}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":297}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":48}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":27}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":22}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":18}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":37}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":112}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":23}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":28}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":28}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":62}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":14}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":16}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":12}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":21}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":34}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":51}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":39}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":8}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":21}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":34}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":37}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":24}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":41}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":40}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":10}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":35}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":35}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":8}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":7}},"983":{"start":{"line":984,"column":0},"end":{"line":984,"column":1}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":30}}},"s":{"0":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"96":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"131":0,"133":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"198":0,"199":0,"201":0,"202":0,"203":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"229":0,"230":0,"232":0,"233":0,"234":0,"237":0,"239":0,"240":0,"241":0,"244":0,"245":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"283":0,"284":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"309":0,"311":0,"312":0,"314":0,"315":0,"316":0,"317":0,"320":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"389":0,"390":0,"391":0,"392":0,"393":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"416":0,"418":0,"419":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"444":0,"445":0,"446":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"502":0,"503":0,"507":0,"508":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"530":0,"531":0,"532":0,"533":0,"534":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"561":0,"562":0,"563":0,"564":0,"566":0,"569":0,"570":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"593":0,"594":0,"597":0,"598":0,"599":0,"600":0,"601":0,"603":0,"604":0,"605":0,"606":0,"607":0,"609":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"628":0,"629":0,"630":0,"632":0,"634":0,"635":0,"637":0,"639":0,"640":0,"641":0,"642":0,"644":0,"648":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"664":0,"665":0,"666":0,"667":0,"669":0,"670":0,"671":0,"673":0,"674":0,"675":0,"678":0,"679":0,"680":0,"681":0,"683":0,"684":0,"685":0,"686":0,"688":0,"689":0,"690":0,"692":0,"701":0,"702":0,"703":0,"704":0,"706":0,"707":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"731":0,"732":0,"733":0,"734":0,"735":0,"737":0,"738":0,"740":0,"742":0,"743":0,"744":0,"746":0,"747":0,"748":0,"750":0,"751":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"760":0,"761":0,"763":0,"764":0,"766":0,"767":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"802":0,"804":0,"806":0,"807":0,"808":0,"809":0,"811":0,"813":0,"815":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"829":0,"830":0,"831":0,"832":0,"833":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"855":0,"856":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"865":0,"868":0,"869":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"880":0,"881":0,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"890":0,"891":0,"892":0,"893":0,"894":0,"896":0,"897":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"915":0,"916":0,"917":0,"918":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"943":0,"945":0,"946":0,"948":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"961":0,"964":0,"965":0,"966":0,"967":0,"968":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"983":0,"985":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":986,"column":-16291}},"locations":[{"start":{"line":1,"column":0},"end":{"line":986,"column":-16291}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":986,"column":-16291}},"loc":{"start":{"line":1,"column":0},"end":{"line":986,"column":-16291}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\SecurityLayersPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\SecurityLayersPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":6}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":27}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":35}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":108}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":22}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":33}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":106}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":21}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":39}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":97}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":22}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":4}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":92}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":37}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":98}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":19}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":92}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":27}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":24}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":89}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":4}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":41}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":20}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":95}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":4}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":36}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":19}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":86}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":14}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":35}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":81}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":24}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":4}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":3}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":34}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":87}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":14}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":3}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":35}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":106}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":27}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":15}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":37}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":82}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":23}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":31}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":4}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":3}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":35}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":19}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":93}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":23}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":17}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":28}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":36}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":19}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":90}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":24}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":4}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":28}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":36}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":87}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":16}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":2}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":31}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":20}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":67}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":4}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":13}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":21}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":65}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":4}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":9}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":29}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":57}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":14}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":30}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":20}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":81}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":4}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":72}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":4}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":11}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":60}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":22}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":60}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":3}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":60}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":1}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":67}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":64}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":19}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":65}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":20}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":58}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":3}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":1}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":68}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":19}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":18}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":59}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":19}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":62}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":56}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":1}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":76}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":29}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":10}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":89}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":13}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":72}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":50}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":40}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":51}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":83}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":80}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":16}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":14}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":38}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":21}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":56}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":57}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":15}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":40}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":86}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":73}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":71}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":14}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":10}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":1}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":26}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":14}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":9}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":17}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":16}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":26}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":49}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":40}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":58}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":20}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":24}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":67}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":14}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":23}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":83}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":8}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":7}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":88}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":43}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":10}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":31}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":62}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":85}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":103}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":36}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":15}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":12}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":35}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":50}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":19}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":24}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":26}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":49}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":50}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":12}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":11}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":12}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":10}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":1}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":91}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":79}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":76}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":42}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":4}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":39}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":33}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":33}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":25}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":24}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":14}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":21}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":7}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":18}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":7}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":4}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":43}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":37}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":33}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":26}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":25}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":22}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":7}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":18}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":7}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":4}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":69}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":45}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":63}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":10}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":46}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":61}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":44}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":84}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":19}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":21}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":21}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":20}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":25}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":35}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":29}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":39}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":14}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":19}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":21}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":21}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":20}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":25}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":35}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":29}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":35}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":53}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":27}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":36}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":31}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":35}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":31}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":37}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":34}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":14}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":16}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":86}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":17}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":47}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":27}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":36}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":31}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":35}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":31}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":37}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":34}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":17}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":21}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":19}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":73}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":16}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":14}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":12}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":51}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":37}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":84}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":61}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":14}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":37}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":65}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":60}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":16}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":63}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":14}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":37}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":82}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":60}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":14}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":12}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":33}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":85}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":28}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":73}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":21}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":59}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":73}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":57}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":62}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":70}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":59}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":25}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":22}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":56}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":67}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":68}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":23}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":55}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":32}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":43}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":40}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":49}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":45}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":18}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":18}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":10}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":12}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":10}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":1}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":73}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":61}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":66}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":1}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":60}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":32}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":23}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":20}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":25}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":17}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":20}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":16}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":14}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":23}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":23}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":21}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":20}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":24}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":4}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":67}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":19}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":53}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":35}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":6}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":62}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":10}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":11}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":17}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":30}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":91}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":4}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":1}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":83}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":67}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":81}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":75}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":71}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":93}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":54}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":52}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":19}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":20}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":27}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":5}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":38}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":83}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":37}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":24}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":9}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":22}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":35}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":14}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":51}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":7}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":15}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":27}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":5}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":4}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":61}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":10}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":46}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":57}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":49}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":54}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":87}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":14}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":49}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":112}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":88}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":40}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":17}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":17}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":35}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":58}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":112}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":26}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":108}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":19}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":14}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":12}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":61}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":44}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":84}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":19}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":21}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":21}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":20}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":25}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":35}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":29}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":58}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":14}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":19}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":21}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":21}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":20}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":25}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":35}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":29}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":35}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":53}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":25}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":27}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":36}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":31}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":35}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":31}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":37}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":34}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":14}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":16}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":86}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":17}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":47}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":27}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":36}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":31}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":35}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":31}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":37}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":34}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":17}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":21}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":19}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":67}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":16}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":14}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":12}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":46}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":85}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":64}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":66}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":16}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":59}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":14}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":87}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":65}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":67}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":16}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":60}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":14}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":80}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":63}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":38}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":16}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":58}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":14}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":12}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":47}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":50}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":42}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":50}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":40}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":44}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":10}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":49}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":38}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":54}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":32}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":54}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":31}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":33}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":16}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":50}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":54}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":32}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":54}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":31}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":33}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":14}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":55}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":24}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":54}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":23}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":25}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":17}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":14}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":50}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":64}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":12}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":12}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":33}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":95}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":48}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":55}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":102}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":36}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":20}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":18}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":30}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":83}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":27}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":50}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":49}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":19}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":36}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":44}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":72}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":20}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":13}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":105}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":29}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":16}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":14}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":12}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":10}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":1}}},"s":{"0":0,"33":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"241":0,"242":0,"244":0,"245":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"270":0,"272":0,"274":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"332":0,"333":0,"334":0,"335":0,"336":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"363":0,"364":0,"365":0,"367":0,"368":0,"370":0,"371":0,"372":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"459":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"470":0,"472":0,"473":0,"474":0,"476":0,"479":0,"480":0,"481":0,"482":0,"485":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"502":0,"503":0,"504":0,"505":0,"506":0,"508":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"532":0,"535":0,"536":0,"537":0,"538":0,"539":0,"542":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"558":0,"560":0,"561":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"579":0,"580":0,"581":0,"582":0,"585":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"690":0,"691":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"710":0,"711":0,"712":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"722":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":726,"column":-9037}},"locations":[{"start":{"line":1,"column":0},"end":{"line":726,"column":-9037}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":726,"column":-9037}},"loc":{"start":{"line":1,"column":0},"end":{"line":726,"column":-9037}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\SecurityStatus.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\SecurityStatus.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":54}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":30}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":26}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":31}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":22}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":30}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":25}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":26}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":26}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":27}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":24}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":47}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":42}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":49}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":42}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":39}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":43}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":40}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":48}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":49}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":43}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":43}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":50}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":44}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":45}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":2}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":73}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":20}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":64}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":58}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":65}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":15}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":58}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":74}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":20}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":82}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":16}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":78}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":18}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":84}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":15}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":75}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":71}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":67}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":81}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":77}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":75}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":52}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":27}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":5}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":18}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":80}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":54}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":54}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":75}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":54}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":49}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":12}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":80}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":54}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":68}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":75}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":55}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":47}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":12}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":80}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":64}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":51}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":63}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":77}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":17}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":48}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":89}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":22}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":49}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":19}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":14}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":61}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":65}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":12}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":12}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":54}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":44}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":89}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":40}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":8}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":69}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":42}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":56}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":107}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":53}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":10}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":78}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":62}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":49}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":42}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":75}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":37}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":70}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":14}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":49}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":90}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":29}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":17}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":17}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":48}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":109}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":44}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":49}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":19}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":14}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":12}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":50}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":45}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":12}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":73}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":12}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":59}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":40}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":30}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":40}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":42}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":31}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":28}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":13}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":68}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":10}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":12}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":48}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":39}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":71}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":18}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":30}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":85}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":29}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":48}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":46}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":32}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":55}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":64}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":16}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":55}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":11}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":12}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":58}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":56}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":26}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":79}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":12}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":26}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":22}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":76}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":12}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":26}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":22}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":76}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":12}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":26}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":22}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":77}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":12}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":26}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":22}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":77}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":14}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":12}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":10}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":1}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":96}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":39}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":57}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":30}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":39}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":10}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":48}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":89}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":25}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":13}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":52}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":10}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":1}}},"s":{"0":0,"6":0,"8":0,"9":0,"10":0,"12":0,"13":0,"14":0,"16":0,"17":0,"19":0,"20":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"154":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"177":0,"178":0,"179":0,"180":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"225":0,"226":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"255":0,"257":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"271":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":272,"column":-4935}},"locations":[{"start":{"line":1,"column":0},"end":{"line":272,"column":-4935}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":272,"column":-4935}},"loc":{"start":{"line":1,"column":0},"end":{"line":272,"column":-4935}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Sidebar.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Sidebar.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":73}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":68}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":65}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":2}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":19}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":17}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":11}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":60}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":53}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":86}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":65}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":39}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":33}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":34}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":31}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":48}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":25}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":31}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":128}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":73}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":34}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":95}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":23}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":31}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":31}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":60}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":279}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":48}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":152}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":14}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":12}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":26}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":35}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":26}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":12}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":171}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":56}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":50}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":12}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":40}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":66}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":57}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":96}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":31}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":93}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":140}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":118}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":32}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":35}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":72}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":19}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":11}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":12}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":81}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":46}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":37}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":21}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":27}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":40}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":28}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":23}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":42}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":46}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":56}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":38}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":47}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":47}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":16}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":73}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":15}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":27}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":20}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":125}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":124}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":40}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":107}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":22}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":60}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":12}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":12}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":1}}},"s":{"0":0,"24":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"139":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"168":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":169,"column":-2502}},"locations":[{"start":{"line":1,"column":0},"end":{"line":169,"column":-2502}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":169,"column":-2502}},"loc":{"start":{"line":1,"column":0},"end":{"line":169,"column":-2502}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\SkillMarket.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\SkillMarket.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":92}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":118}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":111}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":124}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":114}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":118}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":117}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":118}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":123}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":124}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":2}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":61}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":47}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":20}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":46}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":44}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":4}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":117}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":33}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":11}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":1}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":11}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":12}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":14}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":86}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":10}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":8}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":69}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":88}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":99}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":13}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":26}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":101}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":64}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":42}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":58}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":63}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":83}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":28}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":35}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":101}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":47}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":18}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":81}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":33}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":55}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":57}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":60}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":21}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":27}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":121}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":23}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":23}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":49}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":75}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":50}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":16}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":27}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":63}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":64}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":16}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":14}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":15}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":47}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":52}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":44}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":69}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":43}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":115}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":21}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":54}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":52}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":35}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":125}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":31}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":27}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":21}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":22}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":19}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":115}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":21}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":54}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":52}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":25}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":133}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":27}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":27}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":22}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":45}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":21}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":117}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":23}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":56}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":50}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":33}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":135}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":29}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":23}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":24}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":22}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":105}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":36}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":25}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":37}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":42}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":36}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":22}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":178}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":49}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":27}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":37}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":42}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":34}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":22}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":187}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":48}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":27}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":20}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":18}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":23}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":10}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":1}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":29}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":17}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":17}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":19}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":63}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":71}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":59}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":71}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":53}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":78}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":78}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":58}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":83}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":19}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":42}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":26}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":5}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":43}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":40}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":35}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":67}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":5}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":51}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":35}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":52}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":59}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":71}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":72}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":8}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":18}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":44}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":36}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":72}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":60}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":15}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":31}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":63}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":47}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":15}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":49}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":30}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":27}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":26}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":36}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":36}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":53}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":30}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":6}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":33}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":4}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":38}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":36}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":54}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":32}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":6}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":35}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":4}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":55}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":26}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":9}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":10}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":57}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":107}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":49}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":57}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":90}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":14}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":49}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":17}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":35}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":35}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":127}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":22}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":85}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":19}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":14}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":12}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":142}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":59}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":97}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":15}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":61}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":69}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":15}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":12}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":73}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":34}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":95}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":16}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":23}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":31}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":58}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":40}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":225}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":12}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":14}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":12}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":106}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":34}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":17}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":21}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":50}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":93}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":36}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":92}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":93}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":15}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":71}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":19}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":11}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":12}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":60}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":40}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":109}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":58}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":35}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":49}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":16}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":16}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":41}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":22}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":28}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":27}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":55}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":98}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":52}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":56}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":14}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":12}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":12}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":10}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":1}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":27}}},"s":{"0":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"155":0,"156":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"172":0,"173":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"219":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"230":0,"232":0,"233":0,"234":0,"236":0,"237":0,"239":0,"243":0,"244":0,"245":0,"246":0,"247":0,"249":0,"250":0,"251":0,"254":0,"256":0,"257":0,"258":0,"259":0,"262":0,"265":0,"266":0,"267":0,"268":0,"269":0,"272":0,"273":0,"276":0,"277":0,"278":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"291":0,"292":0,"295":0,"296":0,"297":0,"298":0,"301":0,"302":0,"303":0,"304":0,"306":0,"307":0,"308":0,"309":0,"310":0,"312":0,"313":0,"315":0,"316":0,"317":0,"318":0,"319":0,"321":0,"322":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"332":0,"334":0,"335":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"349":0,"350":0,"351":0,"352":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"379":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"419":0,"420":0,"422":0,"424":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":425,"column":-7445}},"locations":[{"start":{"line":1,"column":0},"end":{"line":425,"column":-7445}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":425,"column":-7445}},"loc":{"start":{"line":1,"column":0},"end":{"line":425,"column":-7445}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\SwarmDashboard.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\SwarmDashboard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":135}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":17}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":90}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":30}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":82}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":42}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":4}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":16}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":17}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":82}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":20}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":4}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":9}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":17}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":86}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":29}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":22}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":11}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":16}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":78}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":27}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":18}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":2}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":84}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":53}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":67}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":50}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":50}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":2}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":124}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":15}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":18}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":20}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":42}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":13}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":17}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":11}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":24}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":4}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":2}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":67}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":44}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":27}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":10}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":122}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":34}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":11}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":59}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":80}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":93}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":1}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":76}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":51}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":27}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":10}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":9}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":138}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":34}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":11}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":1}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":12}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":13}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":11}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":4}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":4}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":34}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":40}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":56}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":91}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":44}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":47}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":10}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":92}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":13}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":26}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":128}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":52}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":40}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":89}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":33}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":68}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":78}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":23}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":59}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":60}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":15}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":42}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":21}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":47}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":52}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":44}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":69}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":119}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":30}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":18}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":24}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":25}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":110}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":83}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":10}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":1}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":19}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":7}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":13}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":4}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":4}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":83}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":37}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":60}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":35}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":33}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":32}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":31}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":28}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":7}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":7}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":9}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":81}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":39}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":39}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":53}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":53}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":44}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":41}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":45}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":55}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":34}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":4}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":10}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":8}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":69}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":18}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":80}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":99}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":9}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":13}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":26}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":101}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":64}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":42}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":58}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":54}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":73}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":18}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":90}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":32}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":17}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":99}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":56}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":45}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":59}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":21}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":42}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":58}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":47}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":23}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":77}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":18}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":75}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":76}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":14}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":15}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":23}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":24}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":21}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":47}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":52}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":44}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":69}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":43}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":108}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":19}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":41}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":49}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":30}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":36}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":37}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":64}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":65}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":62}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":20}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":19}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":36}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":86}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":94}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":96}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":38}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":22}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":18}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":23}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":24}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":10}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":1}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":25}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":11}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":11}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":4}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":4}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":53}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":71}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":48}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":23}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":29}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":42}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":4}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":10}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":102}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":11}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":91}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":16}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":17}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":29}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":58}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":38}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":220}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":18}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":10}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":12}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":11}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":91}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":16}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":48}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":89}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":57}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":37}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":20}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":21}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":23}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":29}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":43}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":100}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":29}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":113}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":142}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":44}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":63}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":23}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":13}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":14}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":12}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":46}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":15}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":23}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":28}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":119}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":9}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":17}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":15}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":23}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":40}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":190}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":42}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":17}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":12}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":11}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":1}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":87}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":51}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":54}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":76}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":58}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":62}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":58}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":19}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":39}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":58}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":14}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":39}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":20}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":96}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":23}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":56}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":20}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":58}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":14}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":21}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":5}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":22}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":31}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":107}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":70}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":69}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":62}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":14}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":49}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":26}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":61}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":39}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":37}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":27}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":14}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":39}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":57}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":80}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":42}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":33}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":31}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":27}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":78}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":6}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":25}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":4}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":39}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":25}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":69}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":54}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":46}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":29}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":7}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":6}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":41}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":4}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":10}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":57}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":107}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":49}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":55}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":90}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":14}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":49}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":17}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":35}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":35}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":127}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":22}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":85}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":19}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":17}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":62}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":141}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":40}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":19}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":14}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":12}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":142}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":59}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":97}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":15}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":59}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":65}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":15}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":61}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":68}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":15}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":30}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":59}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":67}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":17}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":12}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":90}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":80}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":17}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":19}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":40}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":75}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":26}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":92}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":93}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":15}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":91}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":19}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":11}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":12}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":23}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":28}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":21}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":47}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":52}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":44}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":85}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":27}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":41}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":55}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":14}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":23}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":24}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":60}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":39}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":109}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":59}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":35}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":31}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":26}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":37}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":26}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":40}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":27}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":27}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":16}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":19}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":53}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":76}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":13}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":21}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":16}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":39}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":21}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":27}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":25}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":53}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":56}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":14}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":12}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":12}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":10}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":1}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":30}}},"s":{"0":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"135":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"176":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"191":0,"193":0,"194":0,"195":0,"196":0,"198":0,"200":0,"202":0,"203":0,"204":0,"205":0,"206":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"234":0,"235":0,"236":0,"237":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"271":0,"272":0,"273":0,"274":0,"275":0,"277":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"306":0,"307":0,"308":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"319":0,"320":0,"322":0,"324":0,"325":0,"326":0,"327":0,"330":0,"331":0,"332":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"375":0,"376":0,"377":0,"379":0,"380":0,"381":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"390":0,"391":0,"392":0,"393":0,"394":0,"396":0,"398":0,"399":0,"400":0,"402":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"415":0,"416":0,"417":0,"418":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"440":0,"441":0,"443":0,"444":0,"445":0,"446":0,"447":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"458":0,"459":0,"460":0,"461":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"474":0,"475":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"489":0,"490":0,"491":0,"492":0,"493":0,"495":0,"497":0,"498":0,"499":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"517":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"531":0,"532":0,"533":0,"534":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"545":0,"546":0,"547":0,"548":0,"549":0,"551":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"572":0,"573":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"584":0,"585":0,"587":0,"589":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":590,"column":-11285}},"locations":[{"start":{"line":1,"column":0},"end":{"line":590,"column":-11285}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":590,"column":-11285}},"loc":{"start":{"line":1,"column":0},"end":{"line":590,"column":-11285}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\TaskList.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\TaskList.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":92}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":64}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":66}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":74}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":2}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":28}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":65}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":71}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":73}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":52}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":20}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":5}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":111}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":53}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":12}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":10}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":42}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":92}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":79}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":38}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":69}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":20}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":47}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":38}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":40}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":75}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":40}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":18}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":62}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":85}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":97}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":52}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":92}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":40}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":96}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":72}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":85}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":85}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":12}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":115}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":57}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":55}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":60}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":12}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":50}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":7}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":32}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":27}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":47}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":37}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":45}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":46}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":63}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":38}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":60}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":138}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":11}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":1}}},"s":{"0":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"12":0,"13":0,"14":0,"15":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"33":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"88":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"102":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":110,"column":-2319}},"locations":[{"start":{"line":1,"column":0},"end":{"line":110,"column":-2319}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":110,"column":-2319}},"loc":{"start":{"line":1,"column":0},"end":{"line":110,"column":-2319}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\TeamCollaborationView.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\TeamCollaborationView.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":61}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":81}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":75}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":68}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":62}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":71}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":76}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":71}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":73}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":70}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":45}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":60}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":40}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":66}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":52}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":10}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":99}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":60}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":38}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":49}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":78}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":69}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":43}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":84}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":56}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":39}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":58}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":12}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":64}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":37}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":1}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":59}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":101}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":93}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":50}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":70}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":56}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":45}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":10}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":88}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":66}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":44}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":118}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":98}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":16}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":12}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":38}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":59}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":87}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":25}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":17}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":71}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":92}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":57}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":52}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":12}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":14}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":12}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":10}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":1}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":70}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":94}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":78}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":83}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":81}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":86}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":84}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":86}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":83}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":4}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":43}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":80}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":46}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":57}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":40}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":61}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":89}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":26}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":19}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":62}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":72}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":74}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":76}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":41}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":29}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":19}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":16}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":97}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":36}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":26}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":30}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":44}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":16}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":14}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":12}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":10}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":1}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":82}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":61}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":69}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":10}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":10}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":64}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":57}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":81}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":78}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":80}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":53}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":12}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":76}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":24}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":12}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":10}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":1}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":96}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":70}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":53}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":52}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":62}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":45}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":41}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":33}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":14}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":12}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":72}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":85}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":31}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":12}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":3}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":25}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":81}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":80}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":64}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":78}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":4}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":16}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":12}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":37}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":48}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":39}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":97}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":63}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":16}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":39}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":98}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":64}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":16}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":101}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":61}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":16}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":39}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":97}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":64}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":16}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":48}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":51}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":65}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":14}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":12}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":10}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":68}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":79}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":59}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":51}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":55}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":88}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":72}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":113}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":117}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":77}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":16}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":27}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":19}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":16}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":73}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":45}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":39}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":16}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":12}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":19}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":81}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":50}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":75}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":143}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":91}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":139}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":148}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":16}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":14}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":51}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":107}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":77}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":110}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":41}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":50}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":17}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":64}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":43}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":69}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":17}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":18}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":54}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":110}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":46}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":58}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":17}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":39}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":49}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":33}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":31}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":29}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":77}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":18}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":17}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":53}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":89}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":20}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":18}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":50}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":16}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":117}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":55}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":58}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":21}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":43}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":54}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":37}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":35}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":33}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":81}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":22}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":21}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":22}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":17}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":16}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":14}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":61}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":117}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":105}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":41}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":17}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":77}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":20}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":31}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":36}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":65}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":35}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":16}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":20}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":16}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":73}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":75}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":81}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":94}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":61}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":20}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":26}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":49}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":38}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":95}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":18}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":16}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":14}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":12}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":10}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":1}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":37}}},"s":{"0":0,"25":0,"26":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"164":0,"165":0,"166":0,"167":0,"169":0,"178":0,"179":0,"180":0,"181":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"198":0,"207":0,"208":0,"209":0,"210":0,"212":0,"214":0,"215":0,"216":0,"217":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"227":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"236":0,"237":0,"238":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"306":0,"308":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"339":0,"341":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"360":0,"361":0,"364":0,"365":0,"366":0,"367":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"387":0,"388":0,"389":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"398":0,"400":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":401,"column":-10262}},"locations":[{"start":{"line":1,"column":0},"end":{"line":401,"column":-10262}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":401,"column":-10262}},"loc":{"start":{"line":1,"column":0},"end":{"line":401,"column":-10262}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\TeamList.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\TeamList.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":75}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":84}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":47}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":61}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":103}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":69}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":54}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":9}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":18}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":19}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":61}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":48}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":50}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":26}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":29}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":40}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":64}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":9}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":116}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":101}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":37}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":30}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":57}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":38}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":9}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":17}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":34}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":24}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":31}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":30}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":37}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":32}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":7}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":15}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":27}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":53}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":29}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":43}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":28}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":45}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":20}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":20}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":69}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":65}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":14}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":62}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":5}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":77}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":67}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":37}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":28}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":25}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":25}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":13}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":42}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":73}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":59}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":106}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":17}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":52}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":94}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":99}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":12}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":92}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":108}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":79}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":65}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":93}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":23}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":59}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":82}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":25}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":43}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":99}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":24}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":22}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":29}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":34}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":63}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":45}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":217}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":20}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":19}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":99}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":24}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":41}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":70}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":44}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":26}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":229}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":18}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":20}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":99}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":37}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":88}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":217}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":64}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":62}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":65}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":25}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":99}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":57}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":24}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":68}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":51}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":27}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":68}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":118}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":57}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":104}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":124}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":25}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":124}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":51}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":28}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":98}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":61}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":81}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":29}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":21}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":52}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":93}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":90}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":21}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":57}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":184}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":15}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":23}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":21}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":42}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":88}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":210}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":46}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":23}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":18}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":16}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":46}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":22}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":77}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":59}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":43}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":87}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":68}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":16}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":73}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":16}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":16}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":41}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":34}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":21}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":29}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":57}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":80}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":44}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":98}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":64}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":57}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":46}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":95}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":31}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":22}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":103}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":60}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":49}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":41}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":25}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":32}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":54}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":22}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":23}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":15}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":16}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":12}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":10}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":1}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":24}}},"s":{"0":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"111":0,"112":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"141":0,"142":0,"143":0,"145":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"161":0,"162":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"175":0,"176":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"214":0,"215":0,"216":0,"218":0,"220":0,"221":0,"222":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"253":0,"254":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"288":0,"289":0,"291":0,"293":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":294,"column":-4823}},"locations":[{"start":{"line":1,"column":0},"end":{"line":294,"column":-4823}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":294,"column":-4823}},"loc":{"start":{"line":1,"column":0},"end":{"line":294,"column":-4823}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\TeamOrchestrator.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\TeamOrchestrator.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":96}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":58}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":54}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":93}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":82}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":85}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":87}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":90}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":83}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":42}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":28}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":8}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":72}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":60}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":99}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":9}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":24}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":57}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":83}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":51}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":90}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":49}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":17}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":85}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":92}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":25}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":17}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":65}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":60}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":46}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":24}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":125}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":24}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":99}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":92}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":21}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":13}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":93}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":49}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":56}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":12}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":10}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":1}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":118}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":62}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":56}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":77}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":85}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":87}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":76}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":68}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":57}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":61}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":61}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":61}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":64}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":66}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":51}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":63}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":10}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":8}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":72}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":60}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":99}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":9}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":62}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":32}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":51}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":38}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":91}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":32}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":86}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":32}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":101}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":15}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":12}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":62}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":49}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":89}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":59}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":22}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":120}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":111}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":15}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":52}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":68}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":14}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":27}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":75}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":26}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":51}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":34}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":29}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":102}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":136}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":21}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":13}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":14}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":10}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":1}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":78}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":86}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":54}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":53}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":91}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":9}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":15}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":10}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":21}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":14}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":15}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":15}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":18}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":12}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":21}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":15}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":17}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":21}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":20}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":21}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":48}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":19}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":17}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":5}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":26}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":40}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":36}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":35}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":31}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":30}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":23}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":7}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":15}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":26}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":25}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":27}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":4}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":54}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":28}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":57}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":4}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":37}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":19}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":28}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":51}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":25}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":29}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":7}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":4}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":27}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":10}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":85}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":119}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":115}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":51}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":55}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":98}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":16}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":51}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":101}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":64}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":70}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":73}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":20}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":106}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":53}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":21}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":16}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":53}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":98}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":68}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":84}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":51}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":80}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":58}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":23}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":18}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":28}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":79}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":29}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":37}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":66}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":44}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":123}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":18}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":40}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":93}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":128}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":64}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":60}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":60}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":66}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":25}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":49}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":25}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":46}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":105}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":19}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":27}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":25}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":56}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":112}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":19}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":27}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":22}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":20}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":39}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":34}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":20}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":31}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":53}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":77}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":46}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":100}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":65}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":21}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":69}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":98}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":27}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":84}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":70}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":56}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":29}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":24}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":86}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":49}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":62}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":34}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":58}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":24}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":40}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":97}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":36}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":27}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":24}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":22}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":17}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":18}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":16}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":25}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":66}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":111}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":23}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":50}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":75}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":36}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":90}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":78}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":21}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":17}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":25}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":23}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":52}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":75}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":38}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":90}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":78}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":21}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":17}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":25}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":23}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":51}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":99}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":37}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":98}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":78}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":21}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":51}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":57}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":111}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":53}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":27}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":25}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":20}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":36}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":60}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":74}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":90}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":27}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":45}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":129}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":50}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":29}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":24}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":45}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":54}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":89}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":28}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":52}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":33}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":39}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":37}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":54}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":65}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":67}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":95}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":103}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":26}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":24}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":24}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":22}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":38}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":60}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":74}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":92}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":61}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":29}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":127}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":73}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":32}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":62}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":46}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":66}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":70}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":35}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":27}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":31}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":26}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":24}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":58}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":56}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":100}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":28}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":56}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":35}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":41}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":41}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":69}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":71}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":99}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":81}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":26}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":24}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":24}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":22}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":37}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":60}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":74}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":104}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":27}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":44}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":92}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":97}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":101}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":60}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":122}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":39}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":108}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":29}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":27}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":25}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":24}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":95}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":181}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":50}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":29}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":24}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":58}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":87}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":103}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":52}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":102}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":26}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":47}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":59}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":86}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":98}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":96}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":32}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":41}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":41}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":39}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":50}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":82}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":79}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":69}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":28}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":25}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":26}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":22}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":18}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":102}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":43}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":93}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":61}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":20}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":18}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":14}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":156}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":49}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":66}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":14}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":12}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":10}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":1}}},"s":{"0":0,"36":0,"37":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"100":0,"101":0,"102":0,"103":0,"104":0,"106":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"197":0,"199":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"236":0,"238":0,"239":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"275":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"299":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"337":0,"338":0,"339":0,"340":0,"341":0,"343":0,"344":0,"345":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"359":0,"360":0,"361":0,"362":0,"363":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"385":0,"386":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"417":0,"419":0,"420":0,"421":0,"422":0,"424":0,"425":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"436":0,"438":0,"439":0,"441":0,"442":0,"443":0,"445":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"459":0,"460":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"484":0,"485":0,"486":0,"488":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"501":0,"502":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"527":0,"529":0,"530":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"539":0,"540":0,"541":0,"542":0,"543":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"555":0,"556":0,"558":0,"560":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"569":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"579":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":580,"column":-12354}},"locations":[{"start":{"line":1,"column":0},"end":{"line":580,"column":-12354}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":580,"column":-12354}},"loc":{"start":{"line":1,"column":0},"end":{"line":580,"column":-12354}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\TopBar.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\TopBar.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":24}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":8}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":11}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":15}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":25}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":17}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":10}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":138}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":47}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":155}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":93}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":93}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":12}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":32}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":47}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":46}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":21}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":125}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":49}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":47}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":12}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":13}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":1}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"28":0,"29":0,"32":0,"35":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"49":0,"50":0,"52":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":53,"column":-861}},"locations":[{"start":{"line":1,"column":0},"end":{"line":53,"column":-861}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":53,"column":-861}},"loc":{"start":{"line":1,"column":0},"end":{"line":53,"column":-861}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\TriggersPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\TriggersPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":97}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":69}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":62}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":73}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":65}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":59}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":61}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":2}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":97}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":36}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":49}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":36}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":49}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":117}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":10}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":99}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":21}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":50}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":48}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":8}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":57}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":40}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":51}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":66}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":96}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":67}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":62}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":16}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":56}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":120}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":19}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":135}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":47}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":16}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":14}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":63}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":17}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":93}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":37}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":34}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":47}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":172}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":78}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":84}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":53}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":17}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":102}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":67}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":17}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":19}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":12}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":10}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":33}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":51}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":59}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":61}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":61}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":53}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":78}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":78}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":54}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":68}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":19}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":76}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":27}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":43}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":27}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":56}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":15}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":5}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":36}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":58}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":27}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":9}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":30}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":27}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":21}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":56}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":31}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":36}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":49}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":9}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":27}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":15}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":27}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":49}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":43}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":12}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":72}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":62}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":37}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":10}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":33}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":59}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":51}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":80}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":17}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":71}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":45}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":19}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":51}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":19}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":37}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":35}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":126}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":89}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":44}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":21}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":19}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":56}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":143}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":42}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":124}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":132}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":76}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":18}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":84}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":90}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":56}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":150}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":42}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":16}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":38}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":40}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":26}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":32}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":33}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":39}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":39}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":59}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":59}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":15}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":16}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":12}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":25}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":34}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":51}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":39}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":8}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":1}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":29}}},"s":{"0":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"104":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"158":0,"159":0,"160":0,"162":0,"164":0,"166":0,"167":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"194":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"208":0,"209":0,"210":0,"211":0,"213":0,"215":0,"216":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"240":0,"242":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":243,"column":-3391}},"locations":[{"start":{"line":1,"column":0},"end":{"line":243,"column":-3391}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":243,"column":-3391}},"loc":{"start":{"line":1,"column":0},"end":{"line":243,"column":-3391}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\VikingPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\VikingPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":66}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":51}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":53}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":77}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":56}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":60}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":99}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":34}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":23}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":9}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":51}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":57}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":45}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":60}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":60}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":15}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":26}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":5}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":17}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":9}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":25}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":21}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":9}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":76}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":32}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":33}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":56}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":21}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":73}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":15}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":28}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":5}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":42}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":33}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":32}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":56}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":34}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":31}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":56}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":7}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":22}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":73}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":9}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":10}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":62}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":13}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":83}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":71}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":14}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":14}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":49}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":33}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":77}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":52}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":32}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":32}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":161}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":85}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":14}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":12}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":30}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":124}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":50}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":69}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":72}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":63}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":43}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":107}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":18}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":33}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":89}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":32}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":18}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":14}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":12}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":68}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":38}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":85}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":77}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":13}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":41}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":47}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":47}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":24}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":29}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":125}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":61}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":53}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":18}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":84}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":31}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":82}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":66}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":46}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":20}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":83}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":22}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":74}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":49}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":22}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":20}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":18}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":19}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":42}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":99}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":29}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":99}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":109}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":17}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":32}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":18}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":51}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":49}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":21}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":16}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":14}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":29}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":125}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":90}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":38}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":18}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":25}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":33}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":62}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":68}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":39}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":219}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":14}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":36}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":59}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":139}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":30}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":62}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":46}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":16}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":14}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":36}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":162}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":77}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":52}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":19}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":49}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":64}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":54}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":131}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":83}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":48}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":59}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":97}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":27}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":109}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":36}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":27}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":79}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":55}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":27}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":24}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":39}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":94}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":39}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":102}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":36}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":22}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":20}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":18}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":13}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":14}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":118}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":97}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":75}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":36}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":32}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":34}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":37}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":13}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":12}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":10}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":1}}},"s":{"0":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"98":0,"99":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"151":0,"152":0,"154":0,"156":0,"157":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"193":0,"194":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"223":0,"224":0,"226":0,"227":0,"229":0,"230":0,"231":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"287":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":288,"column":-4921}},"locations":[{"start":{"line":1,"column":0},"end":{"line":288,"column":-4921}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":288,"column":-4921}},"loc":{"start":{"line":1,"column":0},"end":{"line":288,"column":-4921}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowEditor.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowEditor.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":104}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":53}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":65}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":104}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":97}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":70}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":179}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":15}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":33}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":77}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":213}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":48}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":32}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":52}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":48}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":23}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":15}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":14}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":52}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":84}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":96}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":22}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":30}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":135}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":22}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":47}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":32}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":135}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":48}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":87}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":40}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":39}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":15}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":95}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":25}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":37}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":88}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":67}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":215}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":14}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":16}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":15}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":95}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":18}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":25}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":42}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":93}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":63}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":215}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":14}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":73}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":16}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":16}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":15}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":95}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":20}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":77}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":32}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":51}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":27}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":78}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":39}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":63}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":19}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":24}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":59}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":17}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":44}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":22}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":225}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":16}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":116}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":80}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":42}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":57}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":14}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":10}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":1}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":102}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":45}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":53}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":73}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":39}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":53}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":57}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":58}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":32}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":16}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":29}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":49}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":148}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":54}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":183}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":49}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":44}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":30}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":34}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":40}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":16}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":34}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":25}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":11}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":10}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":35}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":12}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":25}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":19}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":5}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":19}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":36}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":43}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":35}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":19}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":6}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":41}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":9}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":86}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":72}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":59}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":57}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":9}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":59}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":28}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":22}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":33}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":86}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":22}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":7}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":61}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":43}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":22}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":33}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":86}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":22}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":7}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":34}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":19}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":23}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":27}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":13}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":29}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":28}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":13}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":56}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":34}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":35}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":13}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":9}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":20}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":26}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":53}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":32}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":31}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":23}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":27}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":33}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":12}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":16}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":19}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":60}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":4}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":27}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":10}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":73}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":10}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":65}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":25}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":8}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":145}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":123}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":51}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":113}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":80}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":18}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":17}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":82}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":48}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":19}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":28}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":91}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":18}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":17}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":29}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":86}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":37}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":19}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":14}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":62}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":21}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":178}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":63}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":21}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":37}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":17}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":97}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":22}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":20}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":27}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":28}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":57}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":35}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":215}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":16}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":18}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":17}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":97}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":22}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":23}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":35}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":64}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":43}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":24}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":215}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":16}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":18}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":16}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":15}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":68}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":92}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":38}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":22}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":21}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":39}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":189}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":44}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":23}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":18}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":35}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":118}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":95}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":77}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":20}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":23}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":41}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":172}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":46}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":25}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":20}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":41}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":45}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":29}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":33}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":31}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":33}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":33}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":64}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":60}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":84}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":103}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":20}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":19}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":20}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":16}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":14}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":125}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":17}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":29}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":169}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":11}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":19}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":17}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":32}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":31}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":205}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":25}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":16}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":60}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":17}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":16}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":44}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":17}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":19}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":14}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":12}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":10}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":1}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":30}}},"s":{"0":0,"67":0,"68":0,"69":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"105":0,"106":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"117":0,"118":0,"119":0,"121":0,"122":0,"123":0,"126":0,"127":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"193":0,"195":0,"197":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"213":0,"214":0,"215":0,"218":0,"219":0,"220":0,"221":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"258":0,"259":0,"260":0,"263":0,"264":0,"265":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"288":0,"289":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"300":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"327":0,"328":0,"330":0,"331":0,"332":0,"333":0,"336":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"371":0,"372":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"385":0,"386":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"409":0,"411":0,"412":0,"414":0,"415":0,"416":0,"417":0,"419":0,"420":0,"421":0,"422":0,"424":0,"426":0,"427":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"444":0,"445":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"461":0,"462":0,"464":0,"466":0,"467":0,"469":0,"471":0,"472":0,"473":0,"474":0,"476":0,"478":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":479,"column":-5829}},"locations":[{"start":{"line":1,"column":0},"end":{"line":479,"column":-5829}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":479,"column":-5829}},"loc":{"start":{"line":1,"column":0},"end":{"line":479,"column":-5829}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowHistory.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowHistory.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":128}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":81}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":83}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":91}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":88}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":79}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":78}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":85}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":90}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":48}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":54}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":68}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":89}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":10}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":104}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":10}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":72}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":50}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":57}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":178}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":17}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":110}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":90}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":39}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":17}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":80}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":28}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":63}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":78}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":26}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":17}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":116}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":14}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":96}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":83}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":50}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":60}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":18}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":26}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":206}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":57}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":54}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":151}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":77}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":71}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":67}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":57}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":54}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":58}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":78}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":44}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":9}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":72}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":13}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":38}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":15}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":17}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":49}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":26}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":9}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":15}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":29}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":17}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":61}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":46}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":30}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":9}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":47}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":21}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":57}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":72}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":15}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":31}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":46}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":63}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":118}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":81}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":10}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":42}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":113}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":49}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":17}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":28}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":158}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":45}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":125}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":76}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":42}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":89}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":29}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":17}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":68}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":38}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":17}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":35}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":35}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":178}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":22}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":85}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":19}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":12}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":60}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":44}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":44}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":83}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":82}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":36}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":117}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":112}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":58}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":40}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":17}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":39}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":48}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":83}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":53}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":59}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":60}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":136}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":69}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":27}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":17}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":18}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":16}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":36}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":112}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":112}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":43}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":40}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":17}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":39}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":48}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":67}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":17}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":18}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":16}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":38}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":112}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":88}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":43}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":17}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":39}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":50}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":67}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":17}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":45}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":45}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":127}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":59}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":18}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":83}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":68}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":16}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":12}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":10}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":1}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":31}}},"s":{"0":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"48":0,"49":0,"50":0,"51":0,"54":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"103":0,"104":0,"106":0,"108":0,"110":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"163":0,"164":0,"165":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"201":0,"203":0,"204":0,"205":0,"206":0,"207":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"272":0,"273":0,"275":0,"276":0,"278":0,"280":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":281,"column":-4552}},"locations":[{"start":{"line":1,"column":0},"end":{"line":281,"column":-4552}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":281,"column":-4552}},"loc":{"start":{"line":1,"column":0},"end":{"line":281,"column":-4552}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowList.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowList.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":97}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":37}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":57}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":67}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":67}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":15}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":7}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":46}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":10}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":73}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":65}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":8}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":117}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":109}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":51}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":115}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":77}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":17}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":82}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":19}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":89}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":17}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":29}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":86}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":29}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":73}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":19}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":211}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":42}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":54}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":12}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":14}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":111}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":169}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":11}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":35}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":34}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":167}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":60}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":44}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":14}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":12}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":10}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":1}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":119}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":40}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":62}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":45}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":127}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":49}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":125}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":78}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":16}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":35}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":80}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":29}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":18}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":81}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":38}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":16}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":11}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":44}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":169}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":26}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":15}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":11}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":73}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":11}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":32}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":61}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":17}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":47}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":34}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":148}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":28}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":58}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":42}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":19}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":44}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":97}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":24}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":40}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":17}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":47}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":95}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":27}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":43}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":19}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":17}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":46}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":33}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":142}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":27}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":58}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":44}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":19}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":14}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":11}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":9}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":1}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":32}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":57}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":65}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":69}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":67}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":67}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":67}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":57}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":61}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":86}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":84}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":82}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":66}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":54}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":56}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":80}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":50}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":20}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":22}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":92}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":31}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":39}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":15}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":35}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":5}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":66}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":30}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":9}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":58}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":33}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":24}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":66}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":57}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":41}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":11}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":42}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":23}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":59}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":77}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":17}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":36}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":7}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":23}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":61}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":34}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":25}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":9}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":47}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":29}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":24}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":9}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":55}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":9}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":9}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":28}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":55}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":14}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":35}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":7}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":28}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":15}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":25}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":71}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":47}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":25}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":29}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":9}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":46}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":31}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":30}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":9}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":44}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":12}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":39}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":79}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":77}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":12}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":10}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":31}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":62}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":13}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":78}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":15}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":73}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":14}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":15}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":41}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":30}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":122}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":24}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":60}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":49}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":12}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":17}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":12}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":57}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":87}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":17}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":47}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":101}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":33}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":85}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":94}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":15}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":44}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":19}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":17}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":49}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":101}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":35}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":85}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":94}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":15}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":49}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":19}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":14}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":15}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":37}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":137}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":38}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":17}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":12}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":30}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":34}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":43}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":127}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":61}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":18}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":73}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":16}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":73}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":16}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":19}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":41}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":148}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":42}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":21}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":16}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":124}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":38}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":21}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":109}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":136}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":23}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":138}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":23}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":136}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":23}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":137}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":23}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":21}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":22}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":21}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":46}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":30}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":37}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":39}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":50}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":39}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":43}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":45}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":69}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":67}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":20}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":19}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":22}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":20}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":16}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":122}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":125}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":59}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":16}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":71}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":14}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":66}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":14}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":14}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":28}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":21}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":37}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":35}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":36}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":35}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":67}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":10}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":21}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":47}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":27}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":35}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":35}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":27}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":8}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":28}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":24}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":37}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":30}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":26}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":34}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":38}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":12}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":10}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":10}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":1}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":28}}},"s":{"0":0,"40":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"58":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"106":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"122":0,"124":0,"125":0,"127":0,"129":0,"130":0,"131":0,"132":0,"134":0,"148":0,"150":0,"151":0,"152":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"176":0,"177":0,"178":0,"179":0,"180":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"196":0,"197":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"222":0,"223":0,"225":0,"227":0,"228":0,"229":0,"230":0,"232":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"254":0,"255":0,"256":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":0,"268":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"277":0,"278":0,"279":0,"280":0,"281":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"300":0,"302":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"332":0,"333":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"343":0,"345":0,"346":0,"348":0,"349":0,"350":0,"352":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"362":0,"363":0,"365":0,"366":0,"368":0,"369":0,"372":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"383":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"394":0,"396":0,"397":0,"400":0,"401":0,"402":0,"404":0,"406":0,"407":0,"410":0,"411":0,"413":0,"414":0,"415":0,"416":0,"417":0,"419":0,"420":0,"422":0,"423":0,"424":0,"425":0,"427":0,"429":0,"430":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"440":0,"442":0,"443":0,"445":0,"446":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"470":0,"471":0,"472":0,"473":0,"474":0,"476":0,"477":0,"479":0,"480":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"514":0,"516":0,"518":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":519,"column":-9721}},"locations":[{"start":{"line":1,"column":0},"end":{"line":519,"column":-9721}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":519,"column":-9721}},"loc":{"start":{"line":1,"column":0},"end":{"line":519,"column":-9721}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowRecommendations.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowRecommendations.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":56}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":9}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":14}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":10}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":78}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":14}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":12}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":88}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":73}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":14}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":77}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":55}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":12}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":10}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":86}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":46}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":42}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":97}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":38}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":43}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":38}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":93}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":80}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":18}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":39}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":45}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":35}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":38}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":63}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":65}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":17}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":26}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":16}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":15}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":86}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":46}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":35}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":101}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":34}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":95}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":70}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":38}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":40}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":26}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":32}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":33}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":59}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":30}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":37}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":70}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":16}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":15}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":16}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":10}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":2}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":64}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":17}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":11}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":12}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":72}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":54}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":51}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":52}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":29}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":15}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":12}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":38}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":36}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":40}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":116}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":62}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":40}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":56}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":60}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":42}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":65}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":41}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":34}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":16}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":79}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":71}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":34}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":77}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":52}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":69}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":37}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":25}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":31}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":90}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":57}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":27}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":18}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":18}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":58}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":74}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":45}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":110}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":11}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":19}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":31}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":113}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":14}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":73}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":32}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":54}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":31}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":44}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":30}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":48}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":31}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":13}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":10}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":12}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":17}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":2}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":50}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":10}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":13}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":10}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":7}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":70}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":64}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":22}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":30}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":51}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":29}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":52}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":33}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":53}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":26}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":54}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":14}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":46}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":5}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":4}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":90}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":65}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":10}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":15}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":12}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":23}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":75}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":18}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":51}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":69}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":57}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":49}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":49}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":65}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":14}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":49}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":50}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":37}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":17}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":15}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":44}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":39}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":34}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":35}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":32}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":17}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":14}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":12}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":23}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":24}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":21}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":47}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":52}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":44}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":77}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":47}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":19}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":63}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":66}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":30}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":23}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":20}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":19}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":71}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":48}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":75}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":23}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":20}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":19}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":70}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":48}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":74}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":23}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":42}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":21}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":69}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":81}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":22}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":18}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":24}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":17}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":2}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":39}}},"s":{"0":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"27":0,"29":0,"30":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"49":0,"50":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"61":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"100":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"122":0,"123":0,"125":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"167":0,"168":0,"169":0,"171":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"187":0,"188":0,"189":0,"193":0,"194":0,"195":0,"196":0,"198":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"214":0,"215":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"233":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"264":0,"265":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"331":0,"332":0,"334":0,"335":0,"337":0,"339":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":340,"column":-5720}},"locations":[{"start":{"line":1,"column":0},"end":{"line":340,"column":-5720}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":340,"column":-5720}},"loc":{"start":{"line":1,"column":0},"end":{"line":340,"column":-5720}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\ApprovalQueue.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\ApprovalQueue.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":45}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":90}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":86}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":22}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":17}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":78}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":12}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":79}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":24}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":2}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":91}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":64}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":55}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":57}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":48}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":31}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":31}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":13}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":33}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":31}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":52}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":35}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":50}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":48}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":48}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":48}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":34}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":48}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":50}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":106}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":67}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":49}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":102}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":58}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":50}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":69}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":43}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":17}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":28}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":71}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":29}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":29}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":87}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":29}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":71}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":33}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":70}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":78}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":70}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":76}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":16}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":14}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":27}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":19}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":61}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":36}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":171}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":14}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":41}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":49}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":17}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":31}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":35}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":191}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":29}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":64}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":53}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":14}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":19}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":17}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":34}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":35}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":187}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":29}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":64}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":49}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":14}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":14}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":65}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":66}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":64}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":48}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":70}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":14}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":10}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":31}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":12}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":11}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":24}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":31}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":51}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":59}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":67}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":51}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":86}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":77}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":69}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":36}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":67}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":61}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":9}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":49}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":52}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":28}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":19}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":72}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":42}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":15}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":32}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":35}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":33}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":20}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":9}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":44}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":82}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":61}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":9}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":58}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":52}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":27}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":19}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":72}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":42}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":15}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":32}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":35}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":33}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":20}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":9}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":43}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":50}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":15}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":55}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":17}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":66}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":68}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":68}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":66}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":4}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":10}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":42}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":113}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":55}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":78}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":33}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":148}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":33}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":14}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":15}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":90}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":30}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":123}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":20}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":80}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":17}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":12}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":23}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":121}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":12}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":69}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":71}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":71}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":67}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":27}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":19}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":32}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":85}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":119}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":45}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":46}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":124}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":17}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":28}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":130}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":32}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":21}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":21}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":13}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":14}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":72}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":48}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":65}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":72}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":16}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":46}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":86}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":60}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":68}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":66}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":16}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":16}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":37}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":48}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":27}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":33}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":35}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":57}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":69}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":61}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":16}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":15}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":16}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":12}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":10}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":1}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":29}}},"s":{"0":0,"23":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"125":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"158":0,"159":0,"161":0,"162":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"173":0,"174":0,"176":0,"177":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"188":0,"190":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"203":0,"204":0,"205":0,"206":0,"209":0,"210":0,"213":0,"214":0,"215":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"256":0,"257":0,"258":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"271":0,"272":0,"273":0,"274":0,"276":0,"277":0,"278":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"349":0,"351":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":352,"column":-4658}},"locations":[{"start":{"line":1,"column":0},"end":{"line":352,"column":-4658}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":352,"column":-4658}},"loc":{"start":{"line":1,"column":0},"end":{"line":352,"column":-4658}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\AutomationCard.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\AutomationCard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":47}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":86}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":29}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":4}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":12}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":17}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":82}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":42}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":90}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":30}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":24}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":10}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":78}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":18}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":79}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":28}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":17}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":90}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":4}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":86}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":11}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":79}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":2}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":64}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":68}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":27}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":122}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":84}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":74}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":11}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":1}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":61}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":52}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":84}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":76}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":8}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":31}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":11}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":60}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":77}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":112}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":20}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":11}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":1}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":7}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":22}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":11}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":25}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":54}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":78}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":77}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":70}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":79}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":48}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":26}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":51}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":36}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":43}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":44}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":9}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":31}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":5}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":24}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":48}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":39}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":13}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":5}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":40}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":48}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":40}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":29}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":48}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":70}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":62}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":11}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":9}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":9}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":43}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":31}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":15}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":7}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":54}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":25}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":23}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":95}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":88}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":24}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":33}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":20}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":20}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":23}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":24}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":25}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":22}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":20}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":17}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":8}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":40}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":46}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":4}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":28}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":10}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":124}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":20}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":56}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":101}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":11}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":25}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":14}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":25}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":30}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":41}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":91}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":44}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":10}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":70}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":40}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":51}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":95}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":42}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":16}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":97}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":44}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":49}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":17}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":29}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":34}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":35}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":14}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":50}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":171}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":28}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":16}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":64}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":17}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":16}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":48}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":17}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":17}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":46}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":88}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":48}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":19}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":14}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":12}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":3}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":10}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":8}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":88}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":18}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":54}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":99}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":9}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":23}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":45}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":14}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":25}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":30}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":41}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":91}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":44}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":10}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":12}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":32}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":69}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":59}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":74}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":95}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":16}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":46}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":14}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":104}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":54}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":40}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":52}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":38}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":95}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":43}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":19}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":14}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":73}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":75}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":27}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":61}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":34}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":39}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":34}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":36}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":51}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":14}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":49}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":17}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":29}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":34}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":35}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":14}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":50}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":193}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":28}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":16}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":64}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":17}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":30}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":16}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":48}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":17}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":16}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":47}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":17}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":19}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":17}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":46}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":88}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":24}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":48}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":19}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":14}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":36}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":73}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":75}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":16}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":12}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":10}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":1}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":30}}},"s":{"0":0,"28":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"104":0,"106":0,"107":0,"109":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"137":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"196":0,"197":0,"198":0,"199":0,"202":0,"203":0,"204":0,"205":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"246":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"258":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"270":0,"271":0,"272":0,"274":0,"276":0,"277":0,"279":0,"281":0,"282":0,"283":0,"284":0,"286":0,"287":0,"288":0,"289":0,"291":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"315":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"326":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"336":0,"338":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"364":0,"365":0,"366":0,"368":0,"369":0,"370":0,"371":0,"373":0,"375":0,"376":0,"378":0,"380":0,"381":0,"382":0,"383":0,"384":0,"386":0,"387":0,"388":0,"391":0,"392":0,"393":0,"394":0,"396":0,"397":0,"399":0,"401":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":402,"column":-3829}},"locations":[{"start":{"line":1,"column":0},"end":{"line":402,"column":-3829}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":402,"column":-3829}},"loc":{"start":{"line":1,"column":0},"end":{"line":402,"column":-3829}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\AutomationFilters.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\AutomationFilters.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":61}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":27}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":2}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":35}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":74}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":86}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":35}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":23}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":71}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":79}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":14}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":51}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":6}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":60}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":10}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":87}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":47}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":41}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":95}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":16}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":42}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":31}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":41}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":291}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":12}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":114}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":52}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":33}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":44}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":119}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":15}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":24}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":40}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":17}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":52}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":30}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":33}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":44}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":119}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":24}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":40}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":14}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":78}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":51}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":42}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":53}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":18}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":50}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":135}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":46}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":124}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":46}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":29}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":113}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":27}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":23}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":11}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":42}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":15}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":72}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":191}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":51}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":60}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":50}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":17}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":47}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":63}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":54}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":16}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":112}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":17}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":34}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":186}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":55}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":46}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":57}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":26}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":57}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":91}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":30}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":97}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":98}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":59}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":48}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":40}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":24}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":83}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":25}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":15}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":12}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":10}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":1}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":33}}},"s":{"0":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"63":0,"64":0,"65":0,"68":0,"69":0,"70":0,"71":0,"74":0,"75":0,"76":0,"77":0,"80":0,"82":0,"83":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"150":0,"151":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"198":0,"199":0,"201":0,"203":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":204,"column":-2396}},"locations":[{"start":{"line":1,"column":0},"end":{"line":204,"column":-2396}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":204,"column":-2396}},"loc":{"start":{"line":1,"column":0},"end":{"line":204,"column":-2396}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\AutomationPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\AutomationPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":112}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":58}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":46}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":59}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":2}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":33}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":26}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":45}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":57}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":55}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":63}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":51}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":53}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":65}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":57}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":69}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":72}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":90}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":53}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":61}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":73}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":75}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":70}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":72}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":31}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":16}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":59}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":52}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":25}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":54}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":51}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":57}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":68}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":29}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":56}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":32}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":57}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":43}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":61}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":66}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":71}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":28}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":33}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":14}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":24}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":7}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":7}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":9}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":45}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":64}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":22}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":47}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":30}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":9}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":50}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":32}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":9}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":51}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":33}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":103}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":56}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":9}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":33}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":43}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":14}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":47}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":44}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":19}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":72}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":55}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":15}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":31}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":35}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":29}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":20}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":9}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":5}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":44}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":54}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":82}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":25}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":40}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":11}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":35}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":37}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":41}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":9}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":23}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":15}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":20}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":7}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":27}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":51}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":5}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":24}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":45}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":30}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":72}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":49}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":54}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":30}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":40}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":34}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":12}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":44}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":115}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":51}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":57}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":80}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":17}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":16}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":89}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":61}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":21}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":25}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":49}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":117}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":35}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":89}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":101}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":19}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":44}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":23}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":15}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":28}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":14}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":12}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":3}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":10}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":42}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":113}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":49}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":53}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":78}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":15}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":69}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":38}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":17}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":14}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":49}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":94}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":61}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":21}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":25}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":49}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":117}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":35}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":89}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":101}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":19}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":44}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":23}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":23}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":15}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":16}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":17}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":35}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":32}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":125}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":22}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":82}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":19}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":17}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":42}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":105}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":25}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":40}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":19}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":43}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":105}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":44}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":19}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":14}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":12}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":24}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":43}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":46}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":33}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":39}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":27}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":38}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":37}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":8}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":50}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":54}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":65}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":72}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":16}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":42}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":86}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":61}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":68}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":53}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":16}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":16}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":26}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":31}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":70}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":37}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":40}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":29}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":29}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":27}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":35}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":53}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":55}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":72}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":67}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":48}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":16}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":15}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":16}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":52}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":23}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":42}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":43}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":39}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":43}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":45}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":34}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":39}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":12}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":10}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":30}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":89}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":95}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":113}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":92}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":21}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":60}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":90}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":41}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":23}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":18}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":33}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":41}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":21}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":101}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":26}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":24}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":31}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":44}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":211}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":20}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":22}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":21}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":101}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":26}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":27}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":47}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":28}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":223}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":20}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":22}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":20}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":18}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":102}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":21}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":60}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":130}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":15}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":23}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":21}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":32}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":46}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":47}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":18}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":137}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":15}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":23}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":18}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":16}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":14}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":31}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":89}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":95}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":113}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":91}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":21}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":61}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":90}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":41}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":23}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":18}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":33}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":81}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":74}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":32}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":67}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":20}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":18}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":96}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":21}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":61}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":130}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":15}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":23}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":18}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":16}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":14}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":10}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":1}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":31}}},"s":{"0":0,"57":0,"58":0,"59":0,"60":0,"61":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"95":0,"96":0,"97":0,"98":0,"101":0,"102":0,"103":0,"106":0,"107":0,"108":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"147":0,"148":0,"149":0,"151":0,"152":0,"153":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"204":0,"205":0,"208":0,"209":0,"210":0,"211":0,"214":0,"215":0,"216":0,"218":0,"219":0,"220":0,"221":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"245":0,"246":0,"247":0,"248":0,"250":0,"253":0,"254":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"334":0,"335":0,"336":0,"337":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"353":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"423":0,"424":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"453":0,"454":0,"455":0,"456":0,"458":0,"460":0,"462":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":463,"column":-6239}},"locations":[{"start":{"line":1,"column":0},"end":{"line":463,"column":-6239}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":463,"column":-6239}},"loc":{"start":{"line":1,"column":0},"end":{"line":463,"column":-6239}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\BatchActionBar.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\BatchActionBar.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":74}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":14}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":16}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":17}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":16}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":56}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":58}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":49}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":25}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":9}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":29}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":15}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":49}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":25}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":27}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":31}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":30}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":7}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":23}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":48}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":11}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":17}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":30}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":22}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":10}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":147}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":49}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":73}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":70}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":17}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":51}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":19}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":35}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":86}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":75}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":37}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":86}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":16}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":49}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":17}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":35}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":34}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":180}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":44}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":19}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":37}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":36}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":180}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":47}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":29}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":19}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":36}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":36}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":176}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":43}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":31}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":39}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":36}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":270}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":47}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":51}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":38}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":21}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":62}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":129}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":54}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":32}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":182}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":40}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":38}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":43}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":47}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":24}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":156}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":50}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":29}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":37}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":27}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":38}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":40}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":47}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":154}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":52}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":35}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":125}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":24}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":43}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":14}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":12}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":10}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":1}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":30}}},"s":{"0":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"113":0,"115":0,"116":0,"117":0,"118":0,"120":0,"122":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"133":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"145":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"157":0,"161":0,"162":0,"163":0,"164":0,"165":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"194":0,"196":0,"198":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"215":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":216,"column":-3045}},"locations":[{"start":{"line":1,"column":0},"end":{"line":216,"column":-3045}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":216,"column":-3045}},"loc":{"start":{"line":1,"column":0},"end":{"line":216,"column":-3045}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\ExecutionResult.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\ExecutionResult.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":23}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":14}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":16}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":22}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":32}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":48}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":11}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":16}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":18}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":30}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":44}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":12}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":20}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":46}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":50}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":17}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":31}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":46}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":2}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":74}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":46}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":73}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":44}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":43}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":41}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":40}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":102}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":29}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":58}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":82}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":24}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":98}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":20}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":25}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":13}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":20}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":35}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":62}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":28}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":24}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":9}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":45}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":13}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":28}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":1}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":60}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":46}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":31}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":46}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":44}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":46}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":45}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":28}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":44}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":44}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":58}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":42}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":42}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":17}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":76}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":14}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":29}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":55}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":12}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":32}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":12}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":22}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":43}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":59}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":17}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":57}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":78}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":48}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":19}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":14}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":12}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":3}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":45}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":10}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":30}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":130}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":17}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":12}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":57}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":15}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":79}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":102}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":17}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":15}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":34}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":79}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":42}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":10}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":1}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":33}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":6}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":11}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":11}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":10}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":18}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":26}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":53}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":106}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":39}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":48}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":64}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":5}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":16}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":4}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":41}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":79}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":34}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":48}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":43}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":60}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":5}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":16}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":53}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":12}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":10}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":99}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":41}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":70}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":40}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":51}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":81}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":19}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":66}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":16}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":24}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":71}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":28}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":19}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":14}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":57}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":12}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":3}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":10}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":118}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":10}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":78}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":64}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":49}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":72}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":53}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":74}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":26}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":21}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":117}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":36}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":21}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":73}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":54}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":21}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":18}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":27}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":73}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":33}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":21}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":16}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":14}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":49}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":24}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":71}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":28}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":23}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":59}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":14}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":12}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":45}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":19}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":43}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":20}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":75}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":95}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":88}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":15}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":63}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":17}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":70}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":92}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":99}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":73}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":81}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":75}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":84}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":44}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":20}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":68}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":18}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":92}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":54}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":43}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":67}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":19}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":33}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":20}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":71}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":21}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":16}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":56}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":25}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":21}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":33}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":127}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":53}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":23}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":31}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":21}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":39}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":199}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":56}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":23}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":16}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":14}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":10}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":1}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":31}}},"s":{"0":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"98":0,"100":0,"101":0,"102":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"140":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"191":0,"194":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"219":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"233":0,"234":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"276":0,"277":0,"278":0,"280":0,"282":0,"283":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"311":0,"312":0,"313":0,"314":0,"315":0,"317":0,"318":0,"320":0,"321":0,"324":0,"325":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"335":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"365":0,"368":0,"369":0,"370":0,"371":0,"372":0,"374":0,"376":0,"378":0,"379":0,"380":0,"381":0,"383":0,"385":0,"387":0,"388":0,"390":0,"392":0,"394":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":395,"column":-4383}},"locations":[{"start":{"line":1,"column":0},"end":{"line":395,"column":-4383}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":395,"column":-4383}},"loc":{"start":{"line":1,"column":0},"end":{"line":395,"column":-4383}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\ScheduleEditor.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\ScheduleEditor.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":26}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":52}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":49}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":54}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":55}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":59}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":52}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":41}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":54}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":64}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":73}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":104}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":88}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":22}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":46}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":17}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":42}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":18}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":76}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":48}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":61}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":18}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":44}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":12}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":19}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":32}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":11}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":11}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":25}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":31}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":88}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":77}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":98}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":74}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":82}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":66}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":75}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":68}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":56}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":25}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":24}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":31}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":6}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":9}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":40}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":60}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":36}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":48}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":40}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":5}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":39}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":14}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":11}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":66}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":67}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":66}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":36}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":6}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":24}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":32}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":103}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":33}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":34}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":14}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":16}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":11}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":17}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":17}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":17}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":15}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":7}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":79}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":10}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":73}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":10}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":65}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":8}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":144}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":108}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":51}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":80}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":83}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":18}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":17}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":82}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":86}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":18}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":17}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":30}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":86}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":52}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":62}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":61}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":17}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":79}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":18}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":70}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":18}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":19}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":50}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":102}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":74}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":17}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":104}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":61}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":16}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":15}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":92}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":20}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":52}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":47}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":48}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":49}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":50}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":50}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":31}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":23}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":36}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":73}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":98}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":46}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":68}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":174}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":32}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":25}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":17}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":18}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":38}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":53}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":38}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":96}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":24}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":57}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":33}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":28}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":37}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":105}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":169}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":20}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":77}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":33}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":27}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":28}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":107}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":169}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":22}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":20}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":38}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":96}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":24}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":34}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":63}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":157}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":47}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":79}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":21}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":25}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":20}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":18}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":38}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":17}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":94}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":22}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":55}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":48}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":25}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":31}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":58}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":95}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":48}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":52}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":130}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":23}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":25}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":27}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":19}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":20}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":18}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":39}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":94}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":21}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":34}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":73}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":155}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":73}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":67}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":19}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":23}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":18}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":38}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":17}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":94}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":22}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":27}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":34}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":63}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":51}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":173}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":16}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":99}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":44}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":18}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":36}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":17}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":94}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":22}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":20}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":27}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":31}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":60}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":155}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":16}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":18}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":70}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":79}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":90}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":16}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":14}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":111}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":17}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":30}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":169}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":11}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":19}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":17}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":32}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":97}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":11}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":19}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":14}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":12}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":10}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":30}}},"s":{"0":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"35":0,"36":0,"49":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"101":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"150":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"160":0,"161":0,"162":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"175":0,"177":0,"178":0,"179":0,"181":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"201":0,"202":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"222":0,"223":0,"224":0,"225":0,"226":0,"229":0,"230":0,"231":0,"232":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"274":0,"275":0,"276":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"298":0,"299":0,"300":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"311":0,"312":0,"316":0,"317":0,"318":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"331":0,"332":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"351":0,"352":0,"353":0,"354":0,"355":0,"358":0,"359":0,"360":0,"361":0,"362":0,"364":0,"365":0,"366":0,"367":0,"368":0,"370":0,"371":0,"372":0,"373":0,"375":0,"377":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":-5376}},"locations":[{"start":{"line":1,"column":0},"end":{"line":378,"column":-5376}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":378,"column":-5376}},"loc":{"start":{"line":1,"column":0},"end":{"line":378,"column":-5376}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Automation\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":720},"end":{"line":26,"column":32}},"locations":[{"start":{"line":1,"column":720},"end":{"line":26,"column":32}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":720},"end":{"line":26,"column":32}},"loc":{"start":{"line":1,"column":720},"end":{"line":26,"column":32}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\BrowserHandCard.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\BrowserHandCard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":75}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":9}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":14}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":14}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":10}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":22}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":23}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":18}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":15}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":28}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":60}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":52}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":26}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":39}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":41}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":43}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":56}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":34}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":73}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":66}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":5}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":30}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":65}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":26}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":72}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":70}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":10}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":118}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":107}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":49}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":74}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":74}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":16}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":15}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":72}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":68}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":14}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":49}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":80}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":17}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":12}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":73}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":26}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":43}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":54}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":28}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":31}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":13}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":59}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":10}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":57}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":112}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":36}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":99}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":48}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":78}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":35}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":14}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":101}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":44}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":66}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":20}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":100}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":20}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":76}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":61}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":18}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":20}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":15}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":17}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":108}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":61}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":84}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":49}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":54}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":75}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":45}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":21}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":16}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":46}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":39}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":75}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":26}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":113}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":53}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":100}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":100}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":40}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":17}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":63}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":75}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":26}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":101}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":53}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":130}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":108}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":14}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":22}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":42}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":17}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":36}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":46}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":15}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":75}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":26}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":101}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":53}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":130}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":108}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":14}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":24}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":45}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":30}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":19}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":38}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":221}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":24}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":46}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":21}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":12}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":36}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":41}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":69}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":47}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":10}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":8}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":10}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":1}}},"s":{"0":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"75":0,"76":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"176":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"217":0,"219":0,"220":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"233":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":234,"column":-4147}},"locations":[{"start":{"line":1,"column":0},"end":{"line":234,"column":-4147}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":234,"column":-4147}},"loc":{"start":{"line":1,"column":0},"end":{"line":234,"column":-4147}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\ScreenshotPreview.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\ScreenshotPreview.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":35}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":9}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":12}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":10}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":17}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":28}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":64}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":25}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":47}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":7}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":23}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":56}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":72}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":5}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":12}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":10}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":22}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":113}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":52}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":63}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":16}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":26}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":8}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":20}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":89}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":8}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":92}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":65}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":64}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":54}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":10}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":31}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":99}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":24}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":45}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":19}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":31}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":97}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":22}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":40}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":12}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":10}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":77}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":10}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":49}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":34}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":24}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":85}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":52}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":12}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":27}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":10}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":12}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":24}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":89}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":48}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":14}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":75}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":48}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":12}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":50}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":122}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":37}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":19}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}}},"s":{"0":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"58":0,"59":0,"60":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"79":0,"80":0,"81":0,"82":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"99":0,"101":0,"102":0,"103":0,"104":0,"106":0,"107":0,"108":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"144":0,"145":0,"146":0,"148":0,"150":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":151,"column":-1577}},"locations":[{"start":{"line":1,"column":0},"end":{"line":151,"column":-1577}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":151,"column":-1577}},"loc":{"start":{"line":1,"column":0},"end":{"line":151,"column":-1577}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\TaskTemplateModal.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\TaskTemplateModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":83}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":16}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":21}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":58}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":23}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":30}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":2}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":35}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":9}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":86}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":86}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":68}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":73}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":57}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":63}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":67}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":19}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":18}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":32}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":20}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":30}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":60}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":62}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":53}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":65}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":34}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":79}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":28}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":67}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":13}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":82}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":45}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":14}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":50}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":69}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":11}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":24}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":11}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":12}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":11}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":12}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":15}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":20}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":11}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":6}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":50}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":49}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":77}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":10}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":62}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":8}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":122}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":44}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":109}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":78}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":17}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":97}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":37}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":19}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":14}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":86}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":90}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":57}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":20}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":21}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":30}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":61}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":30}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":79}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":47}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":85}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":97}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":18}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":58}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":54}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":50}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":53}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":56}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":23}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":13}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":14}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":53}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":99}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":52}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":63}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":69}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":35}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":35}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":23}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":35}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":64}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":32}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":69}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":56}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":72}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":111}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":20}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":59}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":24}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":36}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":52}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":57}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":24}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":55}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":26}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":52}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":88}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":39}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":27}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":85}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":46}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":26}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":26}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":24}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":25}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":17}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":99}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":33}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":41}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":62}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":22}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":34}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":50}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":63}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":22}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":61}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":24}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":23}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":78}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":45}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":25}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":76}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":52}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":24}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":24}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":57}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":61}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":98}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":35}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":86}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":28}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":43}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":78}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":43}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":26}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":83}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":96}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":80}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":19}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":49}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":126}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":92}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":57}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":63}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":26}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":102}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":59}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":48}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":25}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":25}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":24}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":113}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":51}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":35}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":20}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":16}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":14}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":139}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":17}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":29}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":136}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":11}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":19}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":34}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":40}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":26}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":91}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":30}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":60}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":100}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":14}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":40}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":19}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":14}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":12}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":10}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":1}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":26}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":27}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":17}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":49}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":3}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":39}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":215}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":23}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":15}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":14}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":14}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":22}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":54}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":41}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":63}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":41}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":38}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":10}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":18}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":14}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":14}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":22}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":23}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":58}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":100}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":41}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":25}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":25}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":38}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":10}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":14}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":66}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":16}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":24}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":27}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":79}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":67}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":110}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":12}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":69}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":39}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":17}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":16}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":18}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":14}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":15}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":22}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":41}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":63}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":38}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":42}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":43}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":60}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":28}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":21}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":13}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":17}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":20}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":16}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":14}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":17}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":22}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":41}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":63}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":41}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":46}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":61}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":10}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":12}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":14}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":14}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":22}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":21}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":41}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":63}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":41}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":38}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":10}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":3}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":1}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":33}}},"s":{"0":0,"42":0,"43":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"78":0,"79":0,"80":0,"81":0,"82":0,"85":0,"86":0,"87":0,"88":0,"91":0,"92":0,"95":0,"96":0,"97":0,"98":0,"99":0,"102":0,"103":0,"104":0,"105":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"140":0,"141":0,"142":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0,"181":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"260":0,"262":0,"263":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"283":0,"284":0,"285":0,"286":0,"288":0,"289":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"309":0,"311":0,"312":0,"313":0,"314":0,"316":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"413":0,"414":0,"416":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":417,"column":-5937}},"locations":[{"start":{"line":1,"column":0},"end":{"line":417,"column":-5937}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":417,"column":-5937}},"loc":{"start":{"line":1,"column":0},"end":{"line":417,"column":-5937}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":819},"end":{"line":42,"column":21}},"locations":[{"start":{"line":1,"column":819},"end":{"line":42,"column":21}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":819},"end":{"line":42,"column":21}},"loc":{"start":{"line":1,"column":819},"end":{"line":42,"column":21}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\automation.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\automation.ts","all":true,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":43}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":16}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":16}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":47}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":43}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":224}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":6}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":21}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":18}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":32}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":105}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":6}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":20}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":57}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":51}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":47}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":47}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":45}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":70}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":34}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":37}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":33}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":62}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":60}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":81}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":61}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":81}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":30}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":59}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":52}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":62}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":57}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":40}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":46}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":66}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":65}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":11}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":30}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":23}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":34}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":56}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":56}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":51}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":71}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":13}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":50}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":56}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":56}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":70}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":22}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":34}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":57}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":13}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":18}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":26}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":29}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":52}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":13}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":18}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":28}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":34}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":58}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":82}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":9}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":65}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":73}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":88}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":7}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":45}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":15}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":36}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":39}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":6}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":30}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":36}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":52}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":44}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":5}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":4}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":2}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":41}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":24}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":25}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":17}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":11}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":18}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":22}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":23}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":21}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":74}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":30}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":6}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":21}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":21}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":32}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":46}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":6}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":31}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":21}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":20}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":13}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":17}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":6}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":4}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":57}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":51}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":43}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":75}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":45}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":75}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":26}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":12}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":43}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":26}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":58}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":62}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":34}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":11}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":32}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":79}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":53}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":39}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":32}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":30}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":60}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":54}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":36}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":49}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":38}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":42}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":20}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":25}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":36}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":53}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":15}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":20}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":24}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":36}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":58}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":15}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":20}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":11}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":9}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":61}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":40}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":23}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":68}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":67}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":7}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":5}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":26}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":12}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":25}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":58}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":55}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":14}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":6}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":4}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":2}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":39}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":21}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":17}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":28}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":25}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":19}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":11}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":5}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":20}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":18}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":21}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":47}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":6}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":5}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":20}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":19}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":21}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":28}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":31}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":6}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":24}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":21}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":22}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":14}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":6}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":24}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":21}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":17}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":13}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":15}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":6}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":5}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":27}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":21}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":22}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":22}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":20}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":6}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":4}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":57}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":51}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":37}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":47}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":55}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":58}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":58}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":28}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":44}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":42}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":57}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":59}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":11}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":32}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":44}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":49}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":40}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":81}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":47}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":27}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":46}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":30}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":18}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":10}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":39}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":77}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":56}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":50}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":46}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":9}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":33}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":37}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":33}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":79}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":9}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":23}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":41}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":24}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":27}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":46}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":22}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":25}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":11}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":7}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":26}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":12}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":10}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":15}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":30}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":65}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":16}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":6}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":4}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":2}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":44}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":27}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":17}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":30}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":25}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":24}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":11}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":17}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":20}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":18}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":21}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":48}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":6}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":5}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":19}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":20}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":19}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":21}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":18}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":34}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":96}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":5}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":31}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":20}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":22}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":22}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":31}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":6}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":4}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":57}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":51}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":37}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":41}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":66}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":34}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":32}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":28}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":30}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":12}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":44}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":28}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":67}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":67}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":11}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":42}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":51}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":51}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":84}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":9}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":99}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":46}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":41}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":32}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":68}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":9}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":26}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":22}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":24}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":35}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":11}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":23}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":51}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":26}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":22}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":25}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":35}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":31}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":11}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":7}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":5}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":26}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":12}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":20}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":36}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":31}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":67}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":18}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":6}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":4}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":2}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":42}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":24}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":15}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":27}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":25}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":24}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":11}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":5}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":17}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":20}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":18}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":21}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":46}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":6}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":5}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":26}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":21}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":19}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":21}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":27}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":6}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":5}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":27}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":20}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":19}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":21}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":18}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":60}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":6}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":5}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":32}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":21}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":19}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":21}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":32}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":6}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":5}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":22}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":20}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":21}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":22}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":17}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":13}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":15}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":6}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":4}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":57}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":51}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":37}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":55}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":73}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":67}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":54}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":34}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":32}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":28}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":57}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":24}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":37}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":65}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":56}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":46}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":40}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":77}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":27}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":63}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":11}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":63}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":52}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":34}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":16}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":9}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":48}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":66}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":22}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":15}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":33}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":14}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":7}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":5}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":38}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":26}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":12}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":10}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":32}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":35}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":50}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":22}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":6}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":4}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":2}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":52}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":22}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":20}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":18}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":23}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":21}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":2}}},"s":{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"63":0,"69":0,"72":0,"73":0,"74":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"86":0,"87":0,"88":0,"91":0,"92":0,"94":0,"97":0,"99":0,"100":0,"101":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"217":0,"219":0,"224":0,"226":0,"227":0,"228":0,"230":0,"231":0,"233":0,"234":0,"235":0,"237":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"347":0,"353":0,"355":0,"357":0,"358":0,"360":0,"362":0,"363":0,"364":0,"366":0,"368":0,"370":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"387":0,"388":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"459":0,"461":0,"462":0,"463":0,"465":0,"470":0,"472":0,"473":0,"474":0,"476":0,"478":0,"480":0,"481":0,"482":0,"483":0,"484":0,"487":0,"488":0,"489":0,"491":0,"492":0,"493":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"509":0,"510":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"581":0,"582":0,"583":0,"585":0,"586":0,"588":0,"589":0,"590":0,"593":0,"596":0,"608":0,"610":0,"611":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"630":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":18756},"end":{"line":654,"column":2}},"locations":[{"start":{"line":1,"column":18756},"end":{"line":654,"column":2}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":18756},"end":{"line":654,"column":2}},"loc":{"start":{"line":1,"column":18756},"end":{"line":654,"column":2}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\basic.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\basic.ts","all":true,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":50}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":34}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":18}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":17}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":41}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":32}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":6}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":5}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":25}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":22}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":13}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":32}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":57}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":51}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":37}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":57}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":57}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":34}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":34}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":33}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":46}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":46}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":36}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":41}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":34}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":68}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":34}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":50}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":64}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":12}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":31}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":35}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":36}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":32}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":6}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":2}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":40}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":29}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":11}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":17}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":46}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":6}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":20}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":18}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":51}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":92}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":6}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":28}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":22}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":43}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":34}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":6}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":31}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":22}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":22}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":6}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":57}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":51}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":37}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":79}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":71}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":66}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":32}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":32}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":38}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":45}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":30}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":63}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":64}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":71}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":11}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":49}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":62}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":52}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":31}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":11}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":7}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":31}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":34}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":6}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":34}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":49}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":11}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":44}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":32}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":32}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":38}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":68}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":9}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":51}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":31}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":11}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":26}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":18}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":2}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":45}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":29}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":15}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":29}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":20}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":28}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":11}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":20}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":18}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":21}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":41}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":6}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":22}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":20}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":19}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":21}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":36}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":37}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":6}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":5}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":25}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":30}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":28}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":20}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":22}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":57}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":51}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":37}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":47}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":59}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":60}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":34}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":32}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":28}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":34}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":41}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":40}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":30}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":39}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":32}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":67}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":45}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":19}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":33}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":35}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":6}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":25}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":32}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":52}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":44}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":30}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":26}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":18}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":4}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":2}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":43}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":28}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":17}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":34}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":20}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":15}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":11}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":17}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":20}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":18}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":21}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":41}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":23}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":21}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":23}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":22}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":50}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":42}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":6}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":4}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":57}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":51}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":37}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":65}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":35}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":70}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":11}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":32}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":32}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":28}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":34}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":45}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":31}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":35}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":6}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":31}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":36}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":51}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":41}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":13}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":43}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":25}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":21}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":49}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":55}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":11}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":25}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":45}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":9}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":7}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":35}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":26}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":18}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":4}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":2}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":41}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":25}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":24}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":41}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":20}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":15}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":11}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":5}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":17}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":20}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":18}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":21}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":41}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":6}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":5}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":20}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":29}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":23}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":21}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":44}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":40}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":6}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":4}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":57}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":51}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":37}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":43}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":32}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":32}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":28}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":41}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":66}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":9}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":48}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":82}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":28}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":39}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":21}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":39}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":28}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":54}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":5}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":4}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":2}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":47}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":29}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":19}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":24}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":22}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":20}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":2}}},"s":{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"56":0,"57":0,"58":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"71":0,"72":0,"73":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"185":0,"186":0,"187":0,"188":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"312":0,"314":0,"315":0,"316":0,"317":0,"319":0,"320":0,"321":0,"323":0,"324":0,"325":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"343":0,"344":0,"345":0,"346":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"380":0,"381":0,"382":0,"384":0,"385":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":11188},"end":{"line":411,"column":2}},"locations":[{"start":{"line":1,"column":11188},"end":{"line":411,"column":2}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":11188},"end":{"line":411,"column":2}},"loc":{"start":{"line":1,"column":11188},"end":{"line":411,"column":2}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":50}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":25}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":53}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":52}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":65}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":30}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":33}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":35}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":51}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":37}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":94}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":41}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":59}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":23}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":80}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":46}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":7}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":42}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":42}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":38}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":10}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":15}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":13}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":8}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":11}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":57}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":39}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":21}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":39}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":39}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":44}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":84}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":19}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":9}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":15}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":64}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":25}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":62}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":23}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":29}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":49}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":13}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":14}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":39}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":30}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":23}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":29}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":44}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":16}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":64}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":31}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":58}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":11}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":64}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":25}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":31}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":58}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":15}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":11}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":9}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":18}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":40}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":15}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":30}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":31}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":52}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":15}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":11}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":9}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":14}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":18}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":57}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":50}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":35}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":25}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":31}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":46}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":15}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":11}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":9}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":14}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":31}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":11}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":4}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":1}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":43}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":7}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":29}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":65}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":11}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":17}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":3}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":1}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":96}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":47}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":39}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":38}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":42}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":3}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":1}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":40}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":38}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":41}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":28}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":52}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":44}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":1}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":68}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":69}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":43}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":63}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":96}}},"s":{"0":0,"28":0,"29":0,"30":0,"31":0,"32":0,"38":0,"39":0,"40":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"93":0,"102":0,"103":0,"104":0,"105":0,"106":0,"108":0,"109":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"187":0,"188":0,"189":0,"190":0,"191":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"235":0,"236":0,"237":0,"238":0,"239":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":6688},"end":{"line":240,"column":96}},"locations":[{"start":{"line":1,"column":6688},"end":{"line":240,"column":96}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":6688},"end":{"line":240,"column":96}},"loc":{"start":{"line":1,"column":6688},"end":{"line":240,"column":96}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\scraping.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\scraping.ts","all":true,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":20}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":17}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":30}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":23}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":19}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":5}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":20}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":41}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":6}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":50}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":35}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":5}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":21}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":22}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":33}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":57}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":37}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":53}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":57}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":85}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":32}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":28}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":34}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":42}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":41}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":5}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":32}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":57}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":36}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":68}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":67}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":11}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":51}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":38}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":65}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":45}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":16}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":32}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":46}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":9}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":30}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":70}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":7}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":26}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":54}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":2}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":42}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":33}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":23}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":15}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":11}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":5}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":17}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":50}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":6}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":26}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":21}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":35}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":36}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":20}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":19}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":39}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":78}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":6}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":20}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":21}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":22}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":18}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":15}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":31}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":6}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":57}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":51}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":37}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":55}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":73}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":49}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":32}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":32}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":28}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":32}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":44}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":34}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":28}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":56}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":20}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":12}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":58}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":45}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":31}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":26}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":18}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":4}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":2}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":44}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":17}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":30}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":23}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":16}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":11}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":17}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":20}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":18}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":21}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":49}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":6}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":27}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":21}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":19}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":21}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":39}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":35}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":6}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":5}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":22}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":22}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":19}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":32}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":6}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":5}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":23}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":20}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":22}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":19}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":32}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":6}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":4}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":57}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":51}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":37}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":68}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":56}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":58}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":32}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":32}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":28}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":32}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":55}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":20}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":15}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":16}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":8}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":36}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":45}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":26}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":12}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":31}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":27}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":13}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":4}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":2}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":43}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":21}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":17}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":28}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":23}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":15}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":11}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":17}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":41}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":6}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":5}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":26}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":21}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":19}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":22}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":25}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":29}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":35}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":6}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":27}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":22}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":19}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":22}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":33}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":33}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":6}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":28}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":20}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":19}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":22}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":32}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":6}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":4}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":57}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":51}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":37}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":70}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":69}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":71}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":32}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":32}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":28}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":32}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":27}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":55}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":19}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":20}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":21}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":8}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":66}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":44}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":26}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":12}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":31}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":26}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":12}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":6}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":4}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":2}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":43}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":21}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":17}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":32}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":23}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":16}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":11}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":5}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":17}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":20}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":18}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":21}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":46}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":6}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":5}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":27}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":21}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":19}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":22}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":23}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":38}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":35}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":6}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":5}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":23}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":19}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":21}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":22}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":17}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":13}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":14}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":36}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":6}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":4}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":57}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":51}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":37}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":70}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":56}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":32}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":32}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":28}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":34}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":27}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":89}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":78}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":26}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":12}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":31}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":30}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":35}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":24}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":6}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":4}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":2}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":50}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":21}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":21}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":23}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":22}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":22}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":2}}},"s":{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"63":0,"64":0,"65":0,"67":0,"69":0,"71":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"158":0,"159":0,"161":0,"163":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"266":0,"267":0,"268":0,"270":0,"272":0,"295":0,"296":0,"297":0,"298":0,"299":0,"301":0,"308":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"370":0,"371":0,"372":0,"374":0,"376":0,"409":0,"410":0,"411":0,"412":0,"413":0,"415":0,"416":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"471":0,"472":0,"473":0,"475":0,"477":0,"507":0,"512":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":14279},"end":{"line":535,"column":2}},"locations":[{"start":{"line":1,"column":14279},"end":{"line":535,"column":2}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":14279},"end":{"line":535,"column":2}},"loc":{"start":{"line":1,"column":14279},"end":{"line":535,"column":2}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\BrowserHand\\templates\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":6949},"end":{"line":240,"column":1}},"locations":[{"start":{"line":1,"column":6949},"end":{"line":240,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":6949},"end":{"line":240,"column":1}},"loc":{"start":{"line":1,"column":6949},"end":{"line":240,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\FeedbackButton.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\FeedbackButton.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":84}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":110}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":10}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":15}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":34}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":25}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":130}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":45}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":49}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":43}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":22}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":34}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":34}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":139}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":52}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":24}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}}},"s":{"0":0,"10":0,"11":0,"12":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"33":0,"34":0,"36":0,"37":0,"39":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":-504}},"locations":[{"start":{"line":1,"column":0},"end":{"line":40,"column":-504}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":40,"column":-504}},"loc":{"start":{"line":1,"column":0},"end":{"line":40,"column":-504}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\FeedbackHistory.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\FeedbackHistory.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":103}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":93}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":103}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":111}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":107}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":102}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":44}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":29}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":30}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":48}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":15}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":2}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":90}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":85}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":68}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":45}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":59}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":40}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":68}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":73}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":40}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":35}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":12}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":73}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":43}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":96}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":10}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":31}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":40}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":54}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":57}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":44}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":42}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":41}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":120}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":127}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":76}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":55}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":47}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":120}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":125}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":125}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":22}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":48}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":96}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":36}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":23}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":74}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":82}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":22}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":22}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":129}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":53}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":24}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":20}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":55}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":23}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":35}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":40}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":67}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":67}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":104}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":25}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":20}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":30}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":27}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":53}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":58}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":50}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":85}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":45}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":25}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":112}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":98}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":46}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":26}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":57}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":27}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":98}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":69}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":29}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":67}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":67}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":33}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":39}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":96}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":40}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":30}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":28}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":112}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":90}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":74}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":74}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":28}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":26}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":122}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":63}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":96}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":43}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":44}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":31}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":63}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":31}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":49}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":109}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":133}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":66}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":70}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":76}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":74}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":68}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":33}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":31}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":41}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":35}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":67}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":69}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":33}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":28}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":24}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":29}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":30}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":23}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":9}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":1}}},"s":{"0":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"141":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"187":0,"188":0,"190":0,"191":0,"193":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":194,"column":-5005}},"locations":[{"start":{"line":1,"column":0},"end":{"line":194,"column":-5005}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":194,"column":-5005}},"loc":{"start":{"line":1,"column":0},"end":{"line":194,"column":-5005}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\FeedbackModal.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\FeedbackModal.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":86}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":75}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":90}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":95}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":86}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":57}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":65}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":58}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":2}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":66}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":54}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":56}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":41}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":53}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":71}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":61}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":36}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":47}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":63}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":13}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":73}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":39}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":61}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":42}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":33}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":30}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":37}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":8}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":28}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":40}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":17}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":42}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":33}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":32}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":9}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":59}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":19}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":25}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":28}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":69}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":5}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":72}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":60}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":29}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":47}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":62}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":4}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":53}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":70}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":54}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":4}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":10}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":32}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":32}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":29}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":87}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":25}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":54}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":47}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":44}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":44}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":101}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":23}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":42}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":117}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":103}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":31}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":106}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":32}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":39}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":16}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":47}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":97}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":22}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":42}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":43}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":25}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":35}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":54}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":131}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":40}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":117}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":137}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":30}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":19}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":17}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":128}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":22}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":41}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":27}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":29}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":58}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":60}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":197}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":31}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":16}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":17}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":127}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":23}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":40}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":35}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":64}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":108}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":209}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":24}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":16}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":97}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":22}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":42}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":47}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":25}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":35}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":58}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":92}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":44}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":92}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":104}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":36}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":31}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":27}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":19}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":18}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":17}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":97}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":22}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":34}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":27}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":24}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":32}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":43}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":34}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":21}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":61}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":229}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":46}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":23}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":42}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":48}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":53}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":24}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":33}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":121}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":82}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":65}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":29}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":29}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":63}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":68}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":58}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":26}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":21}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":22}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":18}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":126}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":51}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":23}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":137}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":31}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":31}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":34}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":13}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":21}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":31}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":92}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":33}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":61}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":47}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":21}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":16}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":21}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":19}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":22}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"15":0,"16":0,"18":0,"19":0,"20":0,"21":0,"22":0,"24":0,"25":0,"26":0,"27":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"89":0,"90":0,"91":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"138":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"195":0,"196":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"214":0,"217":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"233":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"282":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":291,"column":-4553}},"locations":[{"start":{"line":1,"column":0},"end":{"line":291,"column":-4553}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":291,"column":-4553}},"loc":{"start":{"line":1,"column":0},"end":{"line":291,"column":-4553}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\feedbackStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\feedbackStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":45}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":24}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":74}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":26}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":82}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":67}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":56}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":23}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":18}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":50}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":52}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":58}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":40}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":46}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":13}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":51}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":24}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":37}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":34}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":34}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":35}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":34}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":14}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":65}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":92}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":15}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":40}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":29}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":31}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":13}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":23}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":15}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":29}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":84}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":13}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":9}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":8}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":45}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":40}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":54}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":24}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":56}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":10}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":45}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":31}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":40}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":70}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":11}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":8}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":7}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":5}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":2}}},"s":{"0":0,"51":0,"52":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"80":0,"81":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"98":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3788},"end":{"line":141,"column":2}},"locations":[{"start":{"line":1,"column":3788},"end":{"line":141,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3788},"end":{"line":141,"column":2}},"loc":{"start":{"line":1,"column":3788},"end":{"line":141,"column":2}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Feedback\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":50}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":330},"end":{"line":11,"column":25}},"locations":[{"start":{"line":1,"column":330},"end":{"line":11,"column":25}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":330},"end":{"line":11,"column":25}},"loc":{"start":{"line":1,"column":330},"end":{"line":11,"column":25}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\About.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\About.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":10}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":31}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":52}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":110}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":14}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":68}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":63}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":14}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":116}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":61}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":146}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":45}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":19}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":116}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":66}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":68}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":117}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":19}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":14}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":12}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":63}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":67}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":43}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":56}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":80}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":80}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":14}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":12}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":10}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}}},"s":{"0":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"35":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":48,"column":-1810}},"locations":[{"start":{"line":1,"column":0},"end":{"line":48,"column":-1810}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":48,"column":-1810}},"loc":{"start":{"line":1,"column":0},"end":{"line":48,"column":-1810}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Credits.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Credits.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":27}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":74}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":16}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":80}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":80}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":80}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":80}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":4}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":10}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":62}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":63}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":36}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":136}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":124}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":14}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":12}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":40}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":61}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":68}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":12}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":92}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":42}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":179}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":46}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":183}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":17}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":180}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":17}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":101}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":28}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":78}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":71}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":74}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":98}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":53}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":18}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":16}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":11}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":1}}},"s":{"0":0,"2":0,"3":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"38":0,"39":0,"40":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":68,"column":-1694}},"locations":[{"start":{"line":1,"column":0},"end":{"line":68,"column":-1694}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":68,"column":-1694}},"loc":{"start":{"line":1,"column":0},"end":{"line":68,"column":-1694}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\General.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\General.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":27}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":71}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":69}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":51}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":55}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":61}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":59}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":67}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":59}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":85}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":77}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":89}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":76}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":52}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":92}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":28}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":34}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":42}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":50}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":50}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":76}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":19}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":53}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":56}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":67}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":49}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":5}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":59}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":24}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":9}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":50}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":15}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":25}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":63}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":28}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":22}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":54}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":15}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":5}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":31}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":87}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":51}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":10}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":9}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":69}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":100}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":64}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":59}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":59}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":51}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":146}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":135}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":112}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":19}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":16}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":59}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":59}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":87}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":14}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":59}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":62}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":27}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":32}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":30}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":46}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":52}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":47}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":134}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":14}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":28}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":61}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":61}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":75}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":59}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":61}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":85}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":86}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":24}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":40}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":111}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":37}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":121}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":52}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":14}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":95}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":59}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":59}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":15}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":73}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":74}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":38}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":19}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":56}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":33}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":187}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":55}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":33}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":189}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":14}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":14}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":59}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":15}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":73}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":78}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":16}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":93}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":14}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":59}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":15}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":75}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":83}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":101}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":14}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":10}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":1}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":124}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":10}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":11}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":53}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":25}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":178}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":143}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":13}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":1}}},"s":{"0":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"198":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":199,"column":-3775}},"locations":[{"start":{"line":1,"column":0},"end":{"line":199,"column":-3775}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":199,"column":-3775}},"loc":{"start":{"line":1,"column":0},"end":{"line":199,"column":-3775}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\IMChannels.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\IMChannels.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":47}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":14}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":14}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":13}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":16}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":135}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":11}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":92}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":105}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":106}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":104}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":10}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":103}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":104}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":13}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":108}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":10}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":95}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":96}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":11}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":92}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":96}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":98}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":73}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":66}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":59}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":65}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":63}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":60}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":2}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":115}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":67}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":58}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":77}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":19}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":26}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":58}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":20}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":43}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":54}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":23}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":57}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":39}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":15}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":7}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":9}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":16}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":60}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":4}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":71}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":10}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":85}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":91}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":109}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":78}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":89}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":17}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":29}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":76}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":51}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":19}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":14}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":64}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":27}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":68}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":39}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":34}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":79}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":73}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":38}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":63}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":35}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":35}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":99}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":31}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":82}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":24}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":22}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":35}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":49}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":89}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":49}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":215}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":18}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":20}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":14}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":21}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":154}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":33}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":45}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":21}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":29}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":33}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":172}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":29}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":35}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":155}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":29}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":20}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":66}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":20}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":49}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":21}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":23}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":15}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":12}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":1}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":30}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":53}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":61}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":63}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":63}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":71}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":68}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":56}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":83}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":76}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":50}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":56}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":52}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":126}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":19}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":20}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":52}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":31}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":50}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":4}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":53}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":32}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":36}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":4}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":46}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":29}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":28}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":25}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":26}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":4}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":70}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":9}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":28}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":60}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":34}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":80}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":29}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":31}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":53}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":11}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":7}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":27}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":15}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":5}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":4}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":50}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":69}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":4}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":10}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":31}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":62}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":82}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":36}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":68}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":90}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":17}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":17}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":35}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":33}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":161}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":48}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":19}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":14}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":12}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":21}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":182}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":55}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":67}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":14}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":167}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":60}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":74}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":120}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":43}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":67}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":46}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":66}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":52}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":18}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":86}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":20}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":46}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":104}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":48}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":45}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":58}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":48}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":56}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":39}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":20}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":116}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":110}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":20}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":56}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":160}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":49}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":18}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":16}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":89}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":18}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":14}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":53}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":30}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":66}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":81}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":38}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":21}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":60}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":141}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":49}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":31}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":156}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":55}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":27}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":40}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":68}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":170}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":126}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":60}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":29}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":27}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":104}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":90}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":28}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":29}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":21}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":22}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":18}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":16}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":14}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":11}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":85}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":46}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":47}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":17}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":32}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":116}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":29}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":19}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":13}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":46}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":96}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":43}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":18}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":14}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":12}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":118}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":48}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":67}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":68}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":52}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":53}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":136}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":16}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":14}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":12}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":25}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":33}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":36}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":28}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":24}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":32}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":35}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":34}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":10}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":33}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":27}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":8}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":10}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"66":0,"67":0,"68":0,"70":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"83":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"124":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"151":0,"152":0,"153":0,"154":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"175":0,"177":0,"178":0,"180":0,"182":0,"183":0,"185":0,"186":0,"187":0,"189":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"199":0,"200":0,"201":0,"202":0,"203":0,"205":0,"206":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"218":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"309":0,"310":0,"311":0,"312":0,"313":0,"315":0,"317":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"351":0,"352":0,"353":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"372":0,"374":0,"375":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"404":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":405,"column":-6157}},"locations":[{"start":{"line":1,"column":0},"end":{"line":405,"column":-6157}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":405,"column":-6157}},"loc":{"start":{"line":1,"column":0},"end":{"line":405,"column":-6157}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\MCPServices.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\MCPServices.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":47}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":31}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":59}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":67}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":49}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":47}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":50}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":77}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":6}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":57}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":4}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":10}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":31}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":62}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":67}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":79}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":12}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":50}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":12}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":106}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":54}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":78}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":53}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":38}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":64}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":19}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":71}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":74}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":20}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":18}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":53}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":141}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":45}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":21}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":99}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":116}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":43}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":18}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":65}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":73}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":12}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}}},"s":{"0":0,"4":0,"5":0,"6":0,"8":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"54":0,"56":0,"58":0,"60":0,"61":0,"63":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":64,"column":-1359}},"locations":[{"start":{"line":1,"column":0},"end":{"line":64,"column":-1359}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":64,"column":-1359}},"loc":{"start":{"line":1,"column":0},"end":{"line":64,"column":-1359}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\ModelsAPI.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\ModelsAPI.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":93}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":101}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":109}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":79}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":88}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":101}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":79}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":73}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":79}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":45}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":2}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":42}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":44}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":7}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":53}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":17}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":32}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":5}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":11}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":12}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":56}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":62}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":29}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":71}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":55}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":61}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":59}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":57}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":59}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":70}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":104}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":70}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":58}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":77}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":54}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":44}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":22}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":27}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":20}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":15}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":63}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":52}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":92}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":40}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":9}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":67}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":73}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":57}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":29}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":72}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":73}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":51}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":4}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":36}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":24}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":18}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":17}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":28}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":46}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":26}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":55}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":17}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":31}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":24}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":30}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":33}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":37}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":35}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":27}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":26}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":33}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":41}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":35}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":34}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":67}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":34}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":37}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":40}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":109}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":69}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":6}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":37}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":23}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":85}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":12}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":50}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":35}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":36}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":27}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":26}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":17}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":50}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":69}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":35}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":36}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":4}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":49}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":29}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":50}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":11}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":34}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":8}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":35}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":36}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":56}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":72}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":17}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":39}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":7}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":4}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":10}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":31}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":62}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":84}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":15}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":35}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":31}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":212}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":42}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":12}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":28}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":124}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":130}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":61}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":82}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":123}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":65}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":16}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":61}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":82}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":96}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":14}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":28}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":118}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":120}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":61}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":88}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":73}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":16}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":14}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":12}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":28}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":64}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":116}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":17}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":40}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":93}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":40}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":14}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":38}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":134}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":79}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":95}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":16}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":164}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":42}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":30}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":143}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":48}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":59}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":110}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":51}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":152}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":24}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":83}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":100}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":72}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":24}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":22}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":65}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":49}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":64}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":89}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":50}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":29}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":25}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":62}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":104}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":50}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":27}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":25}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":63}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":84}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":50}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":27}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":22}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":20}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":15}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":16}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":12}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":24}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":81}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":97}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":130}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":157}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":78}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":48}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":21}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":54}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":86}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":41}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":18}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":43}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":197}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":72}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":53}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":20}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":19}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":112}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":23}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":43}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":72}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":219}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":51}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":69}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":21}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":25}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":20}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":19}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":114}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":22}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":29}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":42}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":89}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":66}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":240}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":18}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":58}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":20}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":20}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":19}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":111}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":22}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":29}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":46}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":93}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":44}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":240}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":18}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":20}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":19}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":114}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":42}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":24}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":59}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":43}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":90}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":45}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":248}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":20}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":25}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":33}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":62}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":107}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":95}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":27}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":22}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":20}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":19}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":113}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":23}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":46}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":130}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":219}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":56}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":62}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":53}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":25}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":20}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":19}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":115}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":22}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":29}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":42}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":89}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":58}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":240}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":18}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":20}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":18}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":144}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":21}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":54}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":130}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":15}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":23}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":21}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":41}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":51}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":149}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":44}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":23}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":18}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":16}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":14}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":10}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":1}}},"s":{"0":0,"22":0,"24":0,"25":0,"26":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"48":0,"49":0,"50":0,"53":0,"54":0,"55":0,"56":0,"58":0,"59":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"72":0,"73":0,"74":0,"75":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"87":0,"88":0,"91":0,"92":0,"93":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"137":0,"138":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"153":0,"154":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"165":0,"166":0,"169":0,"170":0,"171":0,"172":0,"173":0,"176":0,"177":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"206":0,"207":0,"208":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"248":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"257":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"281":0,"283":0,"285":0,"286":0,"287":0,"289":0,"291":0,"292":0,"293":0,"294":0,"296":0,"298":0,"299":0,"300":0,"301":0,"302":0,"304":0,"307":0,"308":0,"309":0,"310":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"321":0,"322":0,"325":0,"327":0,"328":0,"329":0,"330":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"358":0,"359":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"389":0,"390":0,"391":0,"392":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"402":0,"403":0,"404":0,"405":0,"406":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"422":0,"423":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"431":0,"432":0,"434":0,"435":0,"436":0,"437":0,"438":0,"440":0,"442":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":443,"column":-8250}},"locations":[{"start":{"line":1,"column":0},"end":{"line":443,"column":-8250}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":443,"column":-8250}},"loc":{"start":{"line":1,"column":0},"end":{"line":443,"column":-8250}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Privacy.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Privacy.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":27}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":59}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":63}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":71}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":61}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":50}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":10}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":31}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":69}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":80}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":85}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":66}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":90}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":106}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":123}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":14}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":12}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":85}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":61}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":141}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":61}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":12}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":80}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":64}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":43}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":32}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":81}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":73}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":74}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":53}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":70}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":70}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":32}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":77}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":80}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":71}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":98}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":98}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":48}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":1}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":94}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":10}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":11}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":40}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":132}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":146}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":1}}},"s":{"0":0,"5":0,"6":0,"7":0,"8":0,"9":0,"11":0,"12":0,"13":0,"15":0,"17":0,"18":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"73":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"84":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":85,"column":-2239}},"locations":[{"start":{"line":1,"column":0},"end":{"line":85,"column":-2239}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":85,"column":-2239}},"loc":{"start":{"line":1,"column":0},"end":{"line":85,"column":-2239}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\SecureStorage.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\SecureStorage.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":20}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":72}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":99}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":86}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":76}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":91}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":85}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":94}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":33}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":71}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":64}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":51}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":47}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":74}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":83}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":50}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":68}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":99}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":38}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":23}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":9}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":57}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":32}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":35}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":42}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":60}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":19}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":28}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":94}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":11}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":7}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":21}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":58}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":26}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":21}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":47}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":33}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":25}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":58}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":49}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":18}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":65}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":59}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":7}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":5}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":4}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":36}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":45}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":55}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":22}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":62}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":53}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":20}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":22}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":28}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":29}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":102}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":25}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":4}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":50}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":50}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":23}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":21}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":53}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":35}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":33}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":29}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":102}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":15}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":26}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":5}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":4}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":40}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":56}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":37}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":4}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":46}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":56}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":30}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":4}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":10}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":31}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":62}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":13}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":83}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":71}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":49}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":36}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":117}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":30}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":18}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":59}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":18}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":60}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":17}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":36}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":161}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":85}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":19}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":14}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":33}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":124}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":50}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":69}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":72}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":56}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":34}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":18}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":19}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":71}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":36}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":83}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":75}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":41}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":47}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":24}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":14}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":119}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":22}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":87}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":63}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":37}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":73}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":39}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":50}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":57}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":91}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":33}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":84}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":68}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":22}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":47}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":24}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":50}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":87}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":45}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":26}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":85}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":63}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":26}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":39}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":95}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":87}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":53}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":24}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":59}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":39}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":24}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":31}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":64}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":170}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":67}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":50}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":58}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":55}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":33}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":31}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":67}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":60}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":188}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":36}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":54}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":74}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":58}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":33}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":25}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":40}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":96}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":24}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":22}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":20}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":15}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":16}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":87}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":16}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":12}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":28}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":25}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":17}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":48}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":241}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":40}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":50}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":19}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":122}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":93}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":39}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":19}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":99}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":24}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":22}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":29}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":32}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":61}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":52}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":223}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":18}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":19}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":99}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":24}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":22}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":33}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":34}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":63}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":37}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":223}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":18}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":47}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":23}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":34}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":42}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":34}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":36}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":37}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":20}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":182}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":17}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":25}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":23}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":40}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":75}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":165}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":31}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":22}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":68}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":23}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":22}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":57}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":23}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":25}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":20}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":18}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":16}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":12}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":113}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":90}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":75}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":41}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":42}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":76}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":51}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":13}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":12}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":10}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":1}}},"s":{"0":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"74":0,"75":0,"76":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"169":0,"170":0,"171":0,"173":0,"175":0,"176":0,"177":0,"178":0,"180":0,"181":0,"182":0,"183":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"195":0,"196":0,"197":0,"198":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"213":0,"214":0,"218":0,"219":0,"220":0,"221":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"248":0,"250":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"264":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"276":0,"278":0,"279":0,"281":0,"282":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"292":0,"294":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"304":0,"305":0,"307":0,"308":0,"309":0,"310":0,"311":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"345":0,"346":0,"347":0,"348":0,"349":0,"351":0,"352":0,"353":0,"355":0,"357":0,"358":0,"360":0,"362":0,"363":0,"364":0,"365":0,"367":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"381":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":382,"column":-6092}},"locations":[{"start":{"line":1,"column":0},"end":{"line":382,"column":-6092}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":382,"column":-6092}},"loc":{"start":{"line":1,"column":0},"end":{"line":382,"column":-6092}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\SettingsLayout.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\SettingsLayout.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":81}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":77}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":74}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":72}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":72}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":71}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":67}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":76}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":78}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":74}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":70}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":74}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":74}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":78}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":70}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":74}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":78}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":67}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":2}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":65}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":72}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":67}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":28}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":25}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":41}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":41}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":41}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":39}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":45}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":41}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":47}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":31}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":35}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":74}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":30}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":16}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":15}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":80}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":32}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":41}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":27}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":32}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":37}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":16}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":14}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":14}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":46}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":35}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":72}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":84}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":16}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":32}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":42}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":29}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":14}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":44}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":43}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":37}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":34}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":10}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":83}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":94}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":54}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":17}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":28}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":99}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":45}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":85}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":36}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":19}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":27}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":52}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":107}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":38}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":59}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":72}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":39}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":13}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":14}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":77}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":13}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":10}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":1}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":21}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":39}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":46}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":34}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":53}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":20}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":10}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":31}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":68}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":80}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":99}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":28}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":25}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":31}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":13}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":12}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":45}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":134}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":10}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":15}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":87}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":33}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":166}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":37}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":17}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":12}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":1}}},"s":{"0":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"140":0,"142":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"174":0,"175":0,"176":0,"177":0,"179":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"216":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":217,"column":-4850}},"locations":[{"start":{"line":1,"column":0},"end":{"line":217,"column":-4850}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":217,"column":-4850}},"loc":{"start":{"line":1,"column":0},"end":{"line":217,"column":-4850}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Skills.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Skills.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":23}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":3}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":17}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":19}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":4}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":3}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":17}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":4}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":30}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":4}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":19}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":15}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":21}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":19}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":24}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":21}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":29}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":24}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":18}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":2}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":71}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":59}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":63}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":71}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":67}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":52}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":47}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":98}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":19}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":62}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":54}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":36}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":36}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":25}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":66}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":57}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":20}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":30}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":57}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":44}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":70}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":66}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":16}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":5}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":31}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":62}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":63}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":86}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":127}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":9}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":17}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":12}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":126}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":14}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":28}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":80}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":48}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":41}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":36}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":18}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":30}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":118}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":56}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":149}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":59}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":24}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":50}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":61}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":93}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":103}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":40}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":29}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":26}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":85}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":13}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":12}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":85}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":66}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":114}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":36}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":23}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":28}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":57}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":34}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":112}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":12}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":17}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":83}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":127}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":11}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":19}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":14}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":34}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":42}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":37}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":118}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":21}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":20}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":15}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":16}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":12}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":28}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":64}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":77}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":51}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":58}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":28}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":78}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":77}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":41}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":49}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":55}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":78}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":23}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":15}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":16}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":14}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":101}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":70}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":69}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":19}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":85}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":88}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":20}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":154}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":58}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":21}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":18}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":16}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":14}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":65}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":57}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":79}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":12}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":10}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":1}}},"s":{"0":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"112":0,"113":0,"115":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"222":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":223,"column":-3691}},"locations":[{"start":{"line":1,"column":0},"end":{"line":223,"column":-3691}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":223,"column":-3691}},"loc":{"start":{"line":1,"column":0},"end":{"line":223,"column":-3691}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\UsageStats.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\UsageStats.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":30}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":56}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":64}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":71}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":73}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":5}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":24}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":98}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":53}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":39}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":66}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":58}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":88}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":90}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":10}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":31}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":62}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":65}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":49}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":74}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":61}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":51}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":77}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":37}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":57}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":78}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":23}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":15}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":129}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":79}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":51}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":17}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":26}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":21}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":37}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":31}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":10}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":37}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":27}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":26}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":48}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":10}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":22}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":49}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":33}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":12}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":85}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":80}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":49}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":34}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":77}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":29}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":29}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":79}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":18}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":94}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":117}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":18}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":96}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":118}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":16}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":18}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":16}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":52}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":100}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":59}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":16}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":14}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":12}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":71}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":101}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":32}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":43}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":110}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":61}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":59}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":72}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":63}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":75}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":77}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":47}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":72}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":76}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":84}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":88}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":92}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":93}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":22}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":76}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":67}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":68}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":56}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":20}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":12}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":10}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":1}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":19}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":13}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":8}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":8}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":8}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":4}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":10}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":78}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":52}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":47}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":62}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":12}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":69}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":1}}},"s":{"0":0,"5":0,"6":0,"7":0,"8":0,"9":0,"11":0,"12":0,"13":0,"14":0,"15":0,"17":0,"18":0,"20":0,"21":0,"22":0,"23":0,"24":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"149":0,"151":0,"152":0,"154":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":177,"column":-3601}},"locations":[{"start":{"line":1,"column":0},"end":{"line":177,"column":-3601}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":177,"column":-3601}},"loc":{"start":{"line":1,"column":0},"end":{"line":177,"column":-3601}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Workspace.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\Settings\\Workspace.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":29}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":59}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":63}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":71}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":67}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":78}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":19}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":63}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":9}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":100}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":54}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":43}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":73}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":29}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":55}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":30}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":62}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":8}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":58}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":62}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":56}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":10}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":67}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":74}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":85}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":86}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":78}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":36}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":16}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":23}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":30}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":59}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":92}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":112}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":117}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":62}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":66}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":97}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":90}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":58}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":74}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":67}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":16}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":147}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":89}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":73}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":82}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":151}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":14}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":89}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":15}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":70}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":81}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":16}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":145}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":14}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":12}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":10}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":94}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":10}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":11}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":40}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":132}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":141}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}}},"s":{"0":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"33":0,"34":0,"35":0,"37":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"70":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"93":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"102":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":105,"column":-2220}},"locations":[{"start":{"line":1,"column":0},"end":{"line":105,"column":-2220}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":105,"column":-2220}},"loc":{"start":{"line":1,"column":0},"end":{"line":105,"column":-2220}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\SkillMarket\\SkillCard.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\SkillMarket\\SkillCard.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":77}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":105}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":98}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":111}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":101}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":105}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":104}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":113}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":106}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":103}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":48}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":20}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":18}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":12}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":17}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":18}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":2}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":27}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":21}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":13}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":52}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":46}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":47}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":10}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":15}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":37}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":36}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":34}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":45}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":44}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":23}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":60}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":125}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":9}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":61}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":49}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":105}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":69}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":16}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":83}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":17}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":68}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":36}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":16}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":14}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":37}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":36}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":27}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":32}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":22}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":29}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":120}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":98}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":13}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":30}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":54}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":43}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":19}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":24}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":12}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":80}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":27}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":10}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":49}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":54}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":21}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":113}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":17}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":17}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":11}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":43}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":118}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":44}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":17}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":12}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":108}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":13}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":101}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":60}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":15}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":90}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":42}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":54}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":71}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":39}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":72}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":47}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":33}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":54}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":43}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":64}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":14}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":12}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":17}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":32}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":42}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":15}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":32}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":27}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":159}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":48}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":17}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":19}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":1}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":26}}},"s":{"0":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"93":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"130":0,"132":0,"133":0,"135":0,"137":0,"138":0,"141":0,"142":0,"143":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"160":0,"163":0,"164":0,"165":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"177":0,"178":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"205":0,"206":0,"208":0,"210":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":211,"column":-2569}},"locations":[{"start":{"line":1,"column":0},"end":{"line":211,"column":-2569}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":211,"column":-2569}},"loc":{"start":{"line":1,"column":0},"end":{"line":211,"column":-2569}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\NodePalette.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\NodePalette.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":80}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":46}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":48}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":47}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":54}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":45}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":87}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":63}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":62}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":46}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":22}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":31}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":16}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":4}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":10}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":76}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":62}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":69}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":12}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":72}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":45}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":46}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":60}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":18}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":49}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":77}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":23}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":41}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":38}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":22}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":70}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":45}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":64}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":52}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":73}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":36}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":28}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":70}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":42}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":26}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":11}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":12}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":10}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":27}}},"s":{"0":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"43":0,"44":0,"46":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"89":0,"91":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":92,"column":-909}},"locations":[{"start":{"line":1,"column":0},"end":{"line":92,"column":-909}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":92,"column":-909}},"loc":{"start":{"line":1,"column":0},"end":{"line":92,"column":-909}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\PropertyPanel.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\PropertyPanel.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":31}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":11}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":11}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":10}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":24}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":76}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":59}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":53}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":62}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":10}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":76}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":92}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":67}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":27}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":55}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":9}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":17}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":37}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":13}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":74}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":18}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":23}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":41}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":67}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":129}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":74}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":55}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":30}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":113}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":11}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":14}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":12}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":10}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":34}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":15}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":51}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":17}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":17}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":10}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":76}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":20}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":18}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":25}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":54}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":72}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":86}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":15}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":76}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":54}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":32}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":60}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":51}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":59}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":17}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":94}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":22}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":16}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":11}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":15}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":14}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":10}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":15}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":76}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":21}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":50}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":68}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":94}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":14}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":16}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":15}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":76}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":47}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":65}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":76}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":39}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":14}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":76}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":20}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":18}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":21}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":21}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":24}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":53}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":83}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":76}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":14}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":51}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":29}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":55}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":70}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":55}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":70}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":16}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":11}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":17}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":14}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":15}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":76}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":18}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":25}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":49}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":67}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":86}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":14}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":16}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":15}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":76}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":80}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":32}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":21}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":60}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":52}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":25}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":17}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":16}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":94}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":22}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":14}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":16}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":14}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":15}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":76}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":20}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":18}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":48}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":66}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":86}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":14}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":16}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":15}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":76}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":20}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":18}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":25}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":48}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":66}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":76}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":14}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":16}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":11}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":14}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":10}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":15}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":76}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":20}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":39}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":76}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":72}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":24}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":35}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":76}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":38}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":66}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":45}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":66}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":30}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":89}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":22}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":61}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":84}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":17}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":15}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":76}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":20}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":18}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":25}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":51}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":69}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":76}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":36}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":14}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":16}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":11}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":12}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":14}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":54}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":14}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":1}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":29}}},"s":{"0":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"27":0,"28":0,"29":0,"31":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"49":0,"50":0,"53":0,"55":0,"56":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"68":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"178":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"213":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"284":0,"285":0,"286":0,"288":0,"290":0,"291":0,"293":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":294,"column":-5045}},"locations":[{"start":{"line":1,"column":0},"end":{"line":294,"column":-5045}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":294,"column":-5045}},"loc":{"start":{"line":1,"column":0},"end":{"line":294,"column":-5045}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\WorkflowBuilder.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\WorkflowBuilder.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":17}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":25}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":35}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":2}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":56}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":50}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":11}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":12}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":15}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":12}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":15}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":15}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":26}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":15}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":17}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":32}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":85}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":67}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":39}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":29}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":41}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":11}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":39}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":17}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":25}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":25}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":34}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":11}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":12}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":19}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":40}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":56}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":37}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":60}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":59}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":11}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":39}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":57}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":6}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":38}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":4}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":40}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":32}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":29}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":6}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":4}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":32}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":33}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":51}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":59}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":18}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":28}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":30}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":15}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":11}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":10}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":7}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":6}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":28}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":34}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":47}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":6}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":16}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":41}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":19}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":62}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":27}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":43}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":9}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":29}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":33}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":29}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":91}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":24}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":45}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":25}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":25}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":9}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":30}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":6}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":4}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":53}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":84}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":35}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":66}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":31}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":7}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":6}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":54}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":70}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":49}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":16}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":74}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":37}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":66}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":17}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":96}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":82}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":11}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":19}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":14}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":12}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":10}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":38}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":28}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":28}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":10}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":26}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":29}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":10}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":8}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":44}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":24}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":36}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":27}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":33}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":31}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":31}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":10}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":55}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":20}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":25}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":25}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":45}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":45}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":33}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":37}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":37}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":35}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":27}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":33}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":19}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":22}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":31}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":33}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":29}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":14}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":20}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":36}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":36}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":31}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":37}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":37}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":31}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":37}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":30}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":37}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":32}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":37}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":26}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":37}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":17}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":16}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":44}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":14}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":77}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":22}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":14}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":26}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":22}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":33}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":87}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":63}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":53}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":42}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":10}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":10}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":1}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":35}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":10}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":23}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":33}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":24}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":1}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":31}}},"s":{"0":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"66":0,"67":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"86":0,"87":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"112":0,"113":0,"114":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"169":0,"170":0,"171":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"184":0,"185":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"198":0,"199":0,"201":0,"202":0,"203":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"230":0,"232":0,"233":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"310":0,"312":0,"315":0,"316":0,"317":0,"318":0,"319":0,"321":0,"323":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":324,"column":-2094}},"locations":[{"start":{"line":1,"column":0},"end":{"line":324,"column":-2094}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":324,"column":-2094}},"loc":{"start":{"line":1,"column":0},"end":{"line":324,"column":-2094}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\WorkflowToolbar.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\WorkflowToolbar.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":15}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":10}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":13}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":9}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":60}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":53}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":64}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":35}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":17}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":40}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":27}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":29}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":5}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":38}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":9}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":55}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":41}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":44}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":36}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":64}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":42}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":42}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":75}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":10}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":6}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":101}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":49}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":73}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":23}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":77}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":82}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":24}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":51}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":33}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":79}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":77}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":53}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":48}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":55}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":55}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":16}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":49}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":32}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":106}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":11}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":19}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":106}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":11}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":17}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":28}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":60}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":64}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":11}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":14}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":89}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":96}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":98}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":76}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":55}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":23}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":42}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":92}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":17}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":25}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":23}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":46}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":92}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":17}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":57}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":83}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":17}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":25}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":18}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":62}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":83}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":29}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":20}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":7}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":1}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":31}}},"s":{"0":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"69":0,"72":0,"73":0,"74":0,"75":0,"77":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"88":0,"92":0,"93":0,"94":0,"95":0,"96":0,"98":0,"100":0,"101":0,"102":0,"103":0,"105":0,"107":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"117":0,"119":0,"120":0,"121":0,"124":0,"125":0,"126":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"163":0,"165":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":166,"column":-2183}},"locations":[{"start":{"line":1,"column":0},"end":{"line":166,"column":-2183}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":166,"column":-2183}},"loc":{"start":{"line":1,"column":0},"end":{"line":166,"column":-2183}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":777},"end":{"line":21,"column":62}},"locations":[{"start":{"line":1,"column":777},"end":{"line":21,"column":62}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":777},"end":{"line":21,"column":62}},"loc":{"start":{"line":1,"column":777},"end":{"line":21,"column":62}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\ConditionNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\ConditionNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":89}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":71}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":74}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":63}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":8}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":52}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":43}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":73}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":12}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":94}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":42}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":12}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":89}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":73}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":38}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":41}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":38}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":78}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":71}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":16}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":18}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":77}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":43}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":11}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":29}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":61}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":19}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":27}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":26}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":67}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":14}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":66}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":12}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":44}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}}},"s":{"0":0,"12":0,"13":0,"15":0,"16":0,"17":0,"20":0,"24":0,"25":0,"26":0,"27":0,"28":0,"31":0,"32":0,"33":0,"34":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"76":0,"78":0,"80":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":-1443}},"locations":[{"start":{"line":1,"column":0},"end":{"line":81,"column":-1443}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":81,"column":-1443}},"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":-1443}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\ExportNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\ExportNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":89}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":17}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":25}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":4}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":10}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":8}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":70}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":21}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":32}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":8}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":13}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":21}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":33}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":61}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":8}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":52}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":43}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":71}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":44}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":39}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":77}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":44}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":61}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":14}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":10}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":26}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"24":0,"28":0,"29":0,"30":0,"31":0,"32":0,"35":0,"36":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"45":0,"48":0,"49":0,"50":0,"51":0,"52":0,"54":0,"55":0,"56":0,"57":0,"60":0,"61":0,"62":0,"63":0,"65":0,"67":0,"69":0,"71":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":-738}},"locations":[{"start":{"line":1,"column":0},"end":{"line":72,"column":-738}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":72,"column":-738}},"loc":{"start":{"line":1,"column":0},"end":{"line":72,"column":-738}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\HandNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\HandNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":79}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":41}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":10}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":8}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":70}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":32}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":61}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":61}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":52}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":42}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":71}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":89}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":74}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":44}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":23}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":49}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":68}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":47}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":52}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":52}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}}},"s":{"0":0,"12":0,"13":0,"14":0,"16":0,"17":0,"18":0,"21":0,"25":0,"26":0,"27":0,"28":0,"29":0,"32":0,"33":0,"34":0,"35":0,"36":0,"39":0,"40":0,"41":0,"42":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"54":0,"56":0,"57":0,"58":0,"59":0,"61":0,"64":0,"65":0,"66":0,"67":0,"69":0,"71":0,"73":0,"75":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":76,"column":-954}},"locations":[{"start":{"line":1,"column":0},"end":{"line":76,"column":-954}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":76,"column":-954}},"loc":{"start":{"line":1,"column":0},"end":{"line":76,"column":-954}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\HttpNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\HttpNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":46}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":36}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":39}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":36}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":41}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":85}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":35}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":10}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":8}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":18}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":72}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":13}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":32}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":8}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":13}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":33}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":62}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":52}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":43}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":72}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":52}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":95}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":23}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":138}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":48}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":48}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":53}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":53}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"18":0,"19":0,"21":0,"22":0,"23":0,"26":0,"30":0,"31":0,"32":0,"33":0,"34":0,"37":0,"38":0,"39":0,"40":0,"41":0,"44":0,"45":0,"46":0,"47":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"59":0,"62":0,"63":0,"64":0,"65":0,"69":0,"70":0,"72":0,"74":0,"76":0,"78":0,"80":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":-996}},"locations":[{"start":{"line":1,"column":0},"end":{"line":81,"column":-996}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":81,"column":-996}},"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":-996}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\InputNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\InputNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":87}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":76}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":33}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":64}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":52}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":43}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":74}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":12}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":48}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":73}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":15}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":43}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":55}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":57}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":48}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":36}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"16":0,"20":0,"21":0,"22":0,"23":0,"24":0,"27":0,"28":0,"29":0,"30":0,"33":0,"34":0,"35":0,"36":0,"37":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"49":0,"51":0,"53":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":54,"column":-702}},"locations":[{"start":{"line":1,"column":0},"end":{"line":54,"column":-702}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":54,"column":-702}},"loc":{"start":{"line":1,"column":0},"end":{"line":54,"column":-702}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\LlmNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\LlmNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":83}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":51}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":40}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":37}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":74}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":13}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":63}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":8}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":13}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":33}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":63}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":8}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":52}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":43}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":73}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":88}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":17}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":12}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":89}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":42}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":25}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":58}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":65}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":58}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":46}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":49}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":14}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":23}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"20":0,"24":0,"25":0,"26":0,"27":0,"28":0,"31":0,"32":0,"33":0,"34":0,"35":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"46":0,"49":0,"50":0,"51":0,"52":0,"55":0,"56":0,"57":0,"58":0,"59":0,"61":0,"63":0,"65":0,"67":0,"69":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":70,"column":-883}},"locations":[{"start":{"line":1,"column":0},"end":{"line":70,"column":-883}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":70,"column":-883}},"loc":{"start":{"line":1,"column":0},"end":{"line":70,"column":-883}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\OrchestrationNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\OrchestrationNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":103}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":43}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":39}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":60}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":10}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":8}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":74}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":13}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":21}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":32}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":63}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":8}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":33}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":63}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":8}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":52}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":43}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":73}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":111}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":85}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":47}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":69}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":85}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":47}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":57}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":31}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":26}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":54}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":39}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":14}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":28}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":67}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":28}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":14}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":52}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"15":0,"16":0,"17":0,"21":0,"25":0,"26":0,"27":0,"28":0,"29":0,"32":0,"33":0,"34":0,"35":0,"36":0,"39":0,"40":0,"41":0,"42":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"59":0,"62":0,"63":0,"64":0,"65":0,"69":0,"70":0,"71":0,"72":0,"74":0,"76":0,"78":0,"80":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":-1198}},"locations":[{"start":{"line":1,"column":0},"end":{"line":81,"column":-1198}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":81,"column":-1198}},"loc":{"start":{"line":1,"column":0},"end":{"line":81,"column":-1198}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\ParallelNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\ParallelNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":93}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":10}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":18}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":70}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":32}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":61}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":13}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":21}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":33}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":61}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":8}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":52}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":42}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":71}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":85}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":46}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":50}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":38}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":10}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":42}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"16":0,"20":0,"21":0,"22":0,"23":0,"24":0,"27":0,"28":0,"29":0,"30":0,"31":0,"34":0,"35":0,"36":0,"37":0,"40":0,"41":0,"42":0,"45":0,"46":0,"47":0,"48":0,"50":0,"52":0,"54":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":55,"column":-709}},"locations":[{"start":{"line":1,"column":0},"end":{"line":55,"column":-709}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":55,"column":-709}},"loc":{"start":{"line":1,"column":0},"end":{"line":55,"column":-709}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\SkillNode.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\WorkflowBuilder\\nodes\\SkillNode.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":87}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":10}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":8}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":18}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":72}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":13}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":21}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":62}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":8}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":13}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":21}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":33}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":62}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":8}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":42}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":72}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":12}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":90}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":73}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":44}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":17}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":54}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":53}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":67}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":10}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":36}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":25}}},"s":{"0":0,"10":0,"11":0,"13":0,"14":0,"15":0,"18":0,"22":0,"23":0,"24":0,"25":0,"26":0,"29":0,"30":0,"31":0,"32":0,"33":0,"36":0,"37":0,"38":0,"39":0,"42":0,"43":0,"44":0,"45":0,"46":0,"48":0,"50":0,"53":0,"54":0,"55":0,"56":0,"58":0,"60":0,"62":0,"64":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":65,"column":-813}},"locations":[{"start":{"line":1,"column":0},"end":{"line":65,"column":-813}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":65,"column":-813}},"loc":{"start":{"line":1,"column":0},"end":{"line":65,"column":-813}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Badge.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Badge.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":53}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":75}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":43}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":82}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":86}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":72}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":75}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":81}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":10}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":9}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":80}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":17}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":8}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":1}}},"s":{"0":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"28":0,"29":0,"31":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":32,"column":-18}},"locations":[{"start":{"line":1,"column":0},"end":{"line":32,"column":-18}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":32,"column":-18}},"loc":{"start":{"line":1,"column":0},"end":{"line":32,"column":-18}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Button.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Button.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":35}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":54}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":58}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":118}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":85}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":51}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":130}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":48}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":39}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":37}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":39}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":65}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":100}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":12}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":34}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":22}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":96}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":107}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":60}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":33}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":27}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":19}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":10}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":38}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":70}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":18}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}}},"s":{"0":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"23":0,"24":0,"25":0,"26":0,"27":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"46":0,"47":0,"48":0,"50":0,"51":0,"53":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":54,"column":-99}},"locations":[{"start":{"line":1,"column":0},"end":{"line":54,"column":-99}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":54,"column":-99}},"loc":{"start":{"line":1,"column":0},"end":{"line":54,"column":-99}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Card.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Card.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":56}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":87}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":10}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":15}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":20}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":67}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":48}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":69}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":17}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":8}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":51}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":70}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":10}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":43}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":16}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":10}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":68}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":10}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":92}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":9}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":72}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":10}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":79}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":16}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}}},"s":{"0":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"21":0,"22":0,"24":0,"31":0,"32":0,"33":0,"34":0,"35":0,"37":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"57":0,"58":0,"59":0,"60":0,"61":0,"63":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":64,"column":-644}},"locations":[{"start":{"line":1,"column":0},"end":{"line":64,"column":-644}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":64,"column":-644}},"loc":{"start":{"line":1,"column":0},"end":{"line":64,"column":-644}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\EmojiPicker.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\EmojiPicker.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":55}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":12}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":16}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":16}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":20}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":2}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":79}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":77}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":71}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":24}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":41}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":4}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":54}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":10}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":78}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":77}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":17}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":26}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":55}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":84}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":41}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":68}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":97}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":38}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":12}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":42}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":42}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":34}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":26}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":25}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":20}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":50}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":48}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":47}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":45}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":45}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":28}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":93}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":59}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":89}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":70}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":28}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":17}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":40}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":40}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":73}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":51}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":69}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":17}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}}},"s":{"0":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"26":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"97":0,"98":0,"100":0,"102":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":103,"column":-583}},"locations":[{"start":{"line":1,"column":0},"end":{"line":103,"column":-583}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":103,"column":-583}},"loc":{"start":{"line":1,"column":0},"end":{"line":103,"column":-583}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\EmptyState.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\EmptyState.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":28}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":7}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":8}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":14}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":9}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":21}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":24}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":22}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":23}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":29}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":9}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":31}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":22}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":29}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":6}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":23}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":31}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":23}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":31}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":34}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":10}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":95}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":44}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":12}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":87}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":30}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":42}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":95}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":17}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":86}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":23}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":12}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":16}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":12}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":10}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":85}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":15}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":50}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":29}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":70}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":21}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":17}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":90}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":42}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":63}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":21}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":27}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":17}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":6}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":118}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":43}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":30}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":98}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":27}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":6}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":1}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":82}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":42}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":22}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":53}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":21}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":27}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":17}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":6}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":84}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":10}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":15}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":57}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":21}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":63}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":27}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":17}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":6}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":1}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":83}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":10}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":15}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":40}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":23}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":83}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":27}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":17}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":6}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":1}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":35}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":29}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":60}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":19}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":9}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":12}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":7}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":30}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":10}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":15}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":50}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":19}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":80}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":17}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":1}}},"s":{"0":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"69":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"125":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"157":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"173":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"200":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":201,"column":-1982}},"locations":[{"start":{"line":1,"column":0},"end":{"line":201,"column":-1982}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":201,"column":-1982}},"loc":{"start":{"line":1,"column":0},"end":{"line":201,"column":-1982}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\ErrorAlert.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\ErrorAlert.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":15}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":50}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":21}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":9}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":44}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":28}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":15}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":50}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":24}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":22}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":50}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":4}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":12}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":16}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":48}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":21}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":44}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":11}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":22}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":27}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":46}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":20}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":11}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":27}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":27}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":11}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":44}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":20}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":2}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":166}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":56}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":69}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":61}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":28}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":30}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":12}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":55}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":23}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":48}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":41}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":32}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":32}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":18}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":9}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":13}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":10}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":21}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":18}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":14}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":15}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":70}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":36}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":53}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":51}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":9}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":48}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":33}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":58}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":58}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":17}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":42}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":53}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":34}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":28}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":32}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":50}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":7}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":17}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":43}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":61}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":9}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":41}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":16}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":16}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":10}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":15}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":38}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":44}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":47}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":17}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":8}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":82}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":62}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":67}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":14}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":40}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":51}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":70}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":28}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":19}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":52}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":46}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":16}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":84}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":19}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":15}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":23}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":17}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":31}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":86}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":32}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":91}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":108}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":18}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":19}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":12}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":25}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":45}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":54}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":11}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":19}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":12}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":50}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":42}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":104}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":49}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":16}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":38}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":63}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":108}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":58}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":36}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":49}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":27}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":43}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":72}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":34}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":29}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":21}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":17}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":17}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":66}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":32}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":19}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":37}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":135}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":36}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":49}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":51}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":16}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":21}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":29}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":37}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":27}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":53}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":58}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":50}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":45}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":168}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":38}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":24}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":29}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":30}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":16}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":12}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":150}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":49}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":17}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":27}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":21}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":31}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":29}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":16}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":56}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":17}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":49}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":17}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":19}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":17}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":27}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":21}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":34}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":31}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":53}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":19}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":14}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":36}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":17}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":33}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":31}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":11}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":19}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":12}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":17}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":1}}},"s":{"0":0,"46":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"111":0,"112":0,"113":0,"118":0,"119":0,"120":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"231":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"243":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"260":0,"262":0,"263":0,"264":0,"265":0,"269":0,"270":0,"271":0,"272":0,"273":0,"275":0,"276":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"295":0,"296":0,"298":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"309":0,"310":0,"311":0,"313":0,"315":0,"316":0,"318":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"327":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"339":0,"341":0,"342":0,"344":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":345,"column":-3265}},"locations":[{"start":{"line":1,"column":0},"end":{"line":345,"column":-3265}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":345,"column":-3265}},"loc":{"start":{"line":1,"column":0},"end":{"line":345,"column":-3265}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\ErrorBoundary.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\ErrorBoundary.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":74}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":74}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":97}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":37}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":68}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":44}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":9}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":22}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":63}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":56}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":28}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":29}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":61}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":77}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":32}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":26}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":7}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":27}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":46}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":71}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":32}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":20}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":25}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":28}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":50}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":44}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":68}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":34}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":26}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":55}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":9}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":65}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":48}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":94}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":70}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":53}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":68}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":32}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":4}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":1}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":92}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":60}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":42}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":17}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":22}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":22}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":25}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":6}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":78}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":42}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":12}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":12}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":15}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":6}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":23}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":60}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":59}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":33}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":52}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":23}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":25}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":93}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":11}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":7}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":40}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":6}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":35}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":3}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":62}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":35}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":42}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":50}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":47}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":47}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":68}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":6}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":35}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":7}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":32}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":24}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":60}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":34}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":7}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":3}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":23}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":35}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":19}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":22}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":18}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":22}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":21}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":25}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":7}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":4}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":24}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":29}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":4}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":24}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":31}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":24}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":44}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":16}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":26}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":63}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":54}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":63}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":9}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":60}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":5}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":4}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":25}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":64}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":4}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":12}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":72}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":77}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":28}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":21}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":24}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":7}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":76}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":107}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":54}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":52}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":14}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":103}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":21}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":49}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":46}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":42}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":102}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":125}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":55}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":144}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":37}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":67}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":70}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":22}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":21}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":86}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":27}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":23}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":79}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":29}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":22}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":22}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":20}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":18}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":33}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":28}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":62}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":81}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":121}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":106}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":108}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":83}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":22}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":80}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":25}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":44}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":150}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":27}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":80}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":84}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":92}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":23}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":44}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":78}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":114}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":82}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":55}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":27}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":23}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":22}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":21}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":44}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":142}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":78}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":28}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":61}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":48}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":17}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":30}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":23}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":31}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":27}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":53}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":58}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":50}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":50}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":177}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":100}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":100}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":24}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":29}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":51}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":44}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":25}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":37}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":29}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":46}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":38}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":59}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":27}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":25}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":39}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":29}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":47}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":38}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":19}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":27}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":22}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":44}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":25}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":35}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":29}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":47}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":38}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":52}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":27}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":25}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":35}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":29}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":47}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":38}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":53}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":27}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":22}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":20}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":18}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":23}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":14}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":5}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":20}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":3}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":1}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":86}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":42}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":17}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":18}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":22}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":18}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":22}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":21}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":25}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":6}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":78}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":42}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":12}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":21}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":12}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":15}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":6}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":62}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":35}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":50}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":47}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":47}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":68}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":6}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":19}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":35}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":7}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":18}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":32}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":5}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":24}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":60}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":28}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":34}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":7}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":3}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":23}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":35}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":19}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":22}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":18}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":22}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":21}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":25}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":7}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":18}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":16}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":5}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":4}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":12}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":46}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":53}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":28}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":21}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":24}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":7}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":14}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":111}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":50}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":83}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":44}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":81}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":44}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":19}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":73}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":52}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":18}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":21}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":31}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":25}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":42}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":106}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":55}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":23}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":18}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":16}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":14}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":5}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":20}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":3}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":1}}},"s":{"0":0,"48":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"67":0,"69":0,"70":0,"71":0,"72":0,"73":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"84":0,"85":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"110":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"151":0,"153":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"178":0,"179":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"193":0,"194":0,"197":0,"198":0,"199":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"209":0,"210":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"222":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"231":0,"232":0,"233":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"256":0,"258":0,"259":0,"260":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"277":0,"278":0,"279":0,"280":0,"281":0,"283":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"298":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"313":0,"315":0,"319":0,"320":0,"321":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"346":0,"347":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"357":0,"358":0,"359":0,"360":0,"361":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"392":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"401":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"410":0,"412":0,"413":0,"414":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"443":0,"444":0,"447":0,"448":0,"449":0,"450":0,"451":0,"453":0,"454":0,"455":0,"458":0,"459":0,"460":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"484":0,"485":0,"486":0,"488":0,"489":0,"490":0,"491":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"511":0,"513":0,"514":0,"515":0,"516":0,"518":0,"520":0,"521":0,"522":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":526,"column":-4384}},"locations":[{"start":{"line":1,"column":0},"end":{"line":526,"column":-4384}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":526,"column":-4384}},"loc":{"start":{"line":1,"column":0},"end":{"line":526,"column":-4384}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Input.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Input.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":56}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":62}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":55}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":68}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":12}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":30}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":19}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":29}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":75}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":19}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":24}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":73}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":80}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":71}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":90}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":57}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":21}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":12}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":10}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":62}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":12}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":3}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":2}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":28}}},"s":{"0":0,"8":0,"9":0,"10":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"39":0,"41":0,"42":0,"44":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":45,"column":-386}},"locations":[{"start":{"line":1,"column":0},"end":{"line":45,"column":-386}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":45,"column":-386}},"loc":{"start":{"line":1,"column":0},"end":{"line":45,"column":-386}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\LoadingSpinner.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\LoadingSpinner.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":21}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":16}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":16}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":87}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":10}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":62}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":100}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":88}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":10}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":98}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":28}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":10}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":8}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":20}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":76}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":48}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":8}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":56}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":68}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":80}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":12}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":10}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":62}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":10}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":62}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":11}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":84}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":41}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":11}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":84}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":43}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":8}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":11}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":84}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":43}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":8}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":87}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":10}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":105}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":21}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":45}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":10}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"15":0,"16":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"28":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"86":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"105":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":106,"column":-1632}},"locations":[{"start":{"line":1,"column":0},"end":{"line":106,"column":-1632}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":106,"column":-1632}},"loc":{"start":{"line":1,"column":0},"end":{"line":106,"column":-1632}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Skeleton.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Skeleton.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":56}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":10}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":8}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":61}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":17}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":8}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":6}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":10}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":106}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":10}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":65}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":10}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":31}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":52}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":55}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":34}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":50}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":45}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":16}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":14}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":9}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":10}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":75}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":10}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":10}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":45}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":93}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":57}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":59}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":12}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":24}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":30}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":18}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":53}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":89}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":12}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":50}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":49}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":44}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":14}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":12}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":1}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":72}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":10}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":52}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":56}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":44}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":10}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":100}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":63}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":38}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":48}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":41}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":12}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":10}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":77}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":10}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":42}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":113}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":41}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":48}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":12}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":46}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":54}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":46}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":11}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":10}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":38}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":10}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":137}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":47}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":41}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":41}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":53}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":53}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":12}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":1}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":37}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":97}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":41}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":134}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":50}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":39}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":47}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":16}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":51}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":55}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":14}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":51}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":14}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":10}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":1}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":83}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":10}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":42}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":28}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":46}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":52}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":12}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":27}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":10}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":1}}},"s":{"0":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"15":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"25":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"74":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"103":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"165":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"180":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":181,"column":-3388}},"locations":[{"start":{"line":1,"column":0},"end":{"line":181,"column":-3388}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":181,"column":-3388}},"loc":{"start":{"line":1,"column":0},"end":{"line":181,"column":-3388}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Toast.tsx": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\Toast.tsx","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":73}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":66}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":43}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":17}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":68}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":17}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":53}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":62}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":51}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":65}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":45}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":85}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":75}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":78}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":89}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":2}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":76}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":52}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":76}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":37}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":58}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":22}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":59}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":13}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":51}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":57}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":9}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":10}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":45}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":61}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":30}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":23}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":24}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":45}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":44}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":28}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":80}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":44}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":31}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":91}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":21}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":49}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":66}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":34}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":41}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":25}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":12}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":28}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}}},"s":{"0":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"41":0,"42":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"88":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":89,"column":-1074}},"locations":[{"start":{"line":1,"column":0},"end":{"line":89,"column":-1074}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":89,"column":-1074}},"loc":{"start":{"line":1,"column":0},"end":{"line":89,"column":-1074}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\components\\ui\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":34}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":896},"end":{"line":45,"column":50}},"locations":[{"start":{"line":1,"column":896},"end":{"line":45,"column":50}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":896},"end":{"line":45,"column":50}},"loc":{"start":{"line":1,"column":896},"end":{"line":45,"column":50}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\constants\\api-urls.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\constants\\api-urls.ts","all":true,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":34}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":38}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":41}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":61}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":42}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":48}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":62}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":37}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":48}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":58}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":57}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":38}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":40}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":35}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":11}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":29}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":41}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":40}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":41}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":40}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":58}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":90}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":60}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":51}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":61}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":1}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":50}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":89}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}}},"s":{"12":0,"14":0,"17":0,"20":0,"23":0,"26":0,"27":0,"30":0,"31":0,"34":0,"35":0,"38":0,"41":0,"42":0,"43":0,"44":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"63":0,"64":0,"65":0,"66":0,"71":0,"72":0,"73":0,"78":0,"79":0,"80":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2029},"end":{"line":81,"column":1}},"locations":[{"start":{"line":1,"column":2029},"end":{"line":81,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2029},"end":{"line":81,"column":1}},"loc":{"start":{"line":1,"column":2029},"end":{"line":81,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\constants\\hands.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\constants\\hands.ts","all":true,"statementMap":{"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":25}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":21}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":27}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":25}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":25}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":15}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":25}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":19}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":15}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":27}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":11}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":32}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":23}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":27}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":33}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":21}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":31}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":11}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":68}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":47}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":50}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":45}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":45}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":42}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":49}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":52}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":43}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":48}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":45}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":48}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":54}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":2}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":67}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":67}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":61}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":60}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}}},"s":{"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"19":0,"20":0,"21":0,"22":0,"23":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"62":0,"63":0,"64":0,"69":0,"70":0,"71":0,"76":0,"77":0,"78":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2118},"end":{"line":79,"column":1}},"locations":[{"start":{"line":1,"column":2118},"end":{"line":79,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2118},"end":{"line":79,"column":1}},"loc":{"start":{"line":1,"column":2118},"end":{"line":79,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\constants\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\constants\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":25}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}}},"s":{"0":0,"6":0,"7":0,"8":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":188},"end":{"line":9,"column":27}},"locations":[{"start":{"line":1,"column":188},"end":{"line":9,"column":27}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":188},"end":{"line":9,"column":27}},"loc":{"start":{"line":1,"column":188},"end":{"line":9,"column":27}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\constants\\models.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\constants\\models.ts","all":false,"statementMap":{"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":55}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":50}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":48}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":76}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":79}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":34}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":11}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":41}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":32}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":4}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":14}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":41}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":45}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":10}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":52}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":32}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":59}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":32}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":42}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":46}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":36}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":9}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":65}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":16}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":37}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":13}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":11}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":64}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":37}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":41}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":4}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":11}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":56}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":57}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":37}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":35}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":4}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":61}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":69}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}}},"s":{"13":1,"18":1,"23":1,"28":1,"33":1,"38":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"96":1,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"109":1,"110":0,"111":0},"branchMap":{},"b":{},"fnMap":{"0":{"name":"getProviderDefaults","decl":{"start":{"line":97,"column":7},"end":{"line":105,"column":1}},"loc":{"start":{"line":97,"column":7},"end":{"line":105,"column":1}},"line":97},"1":{"name":"isCodingProvider","decl":{"start":{"line":110,"column":7},"end":{"line":112,"column":1}},"loc":{"start":{"line":110,"column":7},"end":{"line":112,"column":1}},"line":110}},"f":{"0":0,"1":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\hooks.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\hooks.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":32}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":32}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":31}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":46}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":43}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":49}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":50}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":29}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":44}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":36}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":36}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":51}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":50}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":43}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":50}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":34}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":1}}},"s":{"0":0,"14":0,"15":0,"16":0,"22":0,"23":0,"24":0,"25":0,"31":0,"32":0,"33":0,"34":0,"39":0,"40":0,"41":0,"42":0,"47":0,"48":0,"49":0,"50":0,"55":0,"56":0,"57":0,"58":0,"63":0,"64":0,"65":0,"66":0,"73":0,"74":0,"75":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1707},"end":{"line":76,"column":1}},"locations":[{"start":{"line":1,"column":1707},"end":{"line":76,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1707},"end":{"line":76,"column":1}},"loc":{"start":{"line":1,"column":1707},"end":{"line":76,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":960},"end":{"line":48,"column":17}},"locations":[{"start":{"line":1,"column":960},"end":{"line":48,"column":17}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":960},"end":{"line":48,"column":17}},"loc":{"start":{"line":1,"column":960},"end":{"line":48,"column":17}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\store.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\store.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":10}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":13}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":56}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":11}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":35}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":72}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":58}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":18}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":42}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":63}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":63}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":10}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":76}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":58}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":39}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":13}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":4}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":15}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":26}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":30}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":37}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":37}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":61}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":58}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":34}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":5}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":34}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":65}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":42}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":38}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":35}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":4}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":49}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":32}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":41}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":12}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":51}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":4}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":39}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":35}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":41}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":38}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":42}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":31}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":4}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":26}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":40}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":42}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":64}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":42}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":41}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":52}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":30}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":30}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":8}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":62}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":53}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":8}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":31}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":62}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":54}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":7}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":28}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":32}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":34}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":43}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":4}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":39}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":64}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":15}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":42}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":43}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":66}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":49}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":44}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":43}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":54}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":32}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":32}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":10}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":64}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":55}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":33}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":63}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":16}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":55}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":9}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":7}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":46}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":45}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":48}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":4}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":39}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":70}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":47}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":51}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":36}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":47}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":7}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":24}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":28}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":4}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":26}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":33}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":45}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":1}}},"s":{"0":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"22":0,"23":0,"24":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"89":0,"90":0,"91":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"157":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"178":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"190":0,"191":0,"192":0,"193":0,"194":0,"196":0,"197":0,"198":0,"199":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"217":0,"218":0,"219":0,"220":0,"221":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":6028},"end":{"line":222,"column":1}},"locations":[{"start":{"line":1,"column":6028},"end":{"line":222,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":6028},"end":{"line":222,"column":1}},"loc":{"start":{"line":1,"column":6028},"end":{"line":222,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\chat\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1573},"end":{"line":81,"column":1}},"locations":[{"start":{"line":1,"column":1573},"end":{"line":81,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1573},"end":{"line":81,"column":1}},"loc":{"start":{"line":1,"column":1573},"end":{"line":81,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\hooks.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\hooks.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":1}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":34}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":37}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":44}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":1}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":36}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":53}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":31}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":47}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":40}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":39}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":43}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":44}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":48}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":19}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":48}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":44}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":35}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":20}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}}},"s":{"0":0,"12":0,"13":0,"14":0,"19":0,"20":0,"21":0,"22":0,"27":0,"28":0,"29":0,"30":0,"35":0,"36":0,"37":0,"38":0,"43":0,"44":0,"45":0,"46":0,"51":0,"52":0,"53":0,"54":0,"59":0,"60":0,"61":0,"62":0,"67":0,"68":0,"69":0,"70":0,"76":0,"77":0,"78":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1699},"end":{"line":79,"column":1}},"locations":[{"start":{"line":1,"column":1699},"end":{"line":79,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1699},"end":{"line":79,"column":1}},"loc":{"start":{"line":1,"column":1699},"end":{"line":79,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":867},"end":{"line":51,"column":17}},"locations":[{"start":{"line":1,"column":867},"end":{"line":51,"column":17}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":867},"end":{"line":51,"column":17}},"loc":{"start":{"line":1,"column":867},"end":{"line":51,"column":17}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\machine.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\machine.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":10}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":31}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":29}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":4}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":12}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":60}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":7}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":60}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":7}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":23}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":7}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":25}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":69}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":24}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":18}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":7}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":18}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":18}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":19}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":18}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":7}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":4}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":11}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":54}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":56}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":12}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":15}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":17}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":16}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":11}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":11}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":20}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":29}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":59}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":12}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":10}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":8}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":6}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":14}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":10}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":19}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":30}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":87}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":12}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":10}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":26}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":20}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":29}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":83}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":10}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":17}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":30}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":10}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":8}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":6}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":21}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":11}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":27}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":23}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":23}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":6}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":11}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":16}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":25}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":34}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":10}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":16}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":28}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":20}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":29}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":59}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":12}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":10}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":8}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":6}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":12}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":11}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":25}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":34}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":10}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":28}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":29}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":59}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":12}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":10}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":6}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":16}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":11}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":16}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":34}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":10}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":16}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":28}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":29}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":59}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":12}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":10}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":8}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":6}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":4}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":90}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":23}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":16}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":19}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":23}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":26}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":30}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":19}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":49}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":17}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":21}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":20}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":12}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":20}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":3}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":1}}},"s":{"0":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3690},"end":{"line":166,"column":1}},"locations":[{"start":{"line":1,"column":3690},"end":{"line":166,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3690},"end":{"line":166,"column":1}},"loc":{"start":{"line":1,"column":3690},"end":{"line":166,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\store.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\store.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":45}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":12}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":15}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":20}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":14}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":32}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":29}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":55}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":57}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":35}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":4}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":29}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":37}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":60}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":33}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":53}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":41}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":35}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":61}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":63}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":46}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":75}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":18}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":45}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":5}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":35}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":71}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":21}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":48}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":5}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":25}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":37}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":35}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":39}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":29}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":26}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":34}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":46}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}}},"s":{"0":0,"27":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"49":0,"50":0,"51":0,"53":0,"54":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"70":0,"72":0,"73":0,"74":0,"75":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"93":0,"94":0,"95":0,"96":0,"100":0,"101":0,"102":0,"103":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2596},"end":{"line":105,"column":1}},"locations":[{"start":{"line":1,"column":2596},"end":{"line":105,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2596},"end":{"line":105,"column":1}},"loc":{"start":{"line":1,"column":2596},"end":{"line":105,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\hands\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2236},"end":{"line":123,"column":1}},"locations":[{"start":{"line":1,"column":2236},"end":{"line":123,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2236},"end":{"line":123,"column":1}},"loc":{"start":{"line":1,"column":2236},"end":{"line":123,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\cache.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\cache.ts","all":true,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":32}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":57}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":37}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":26}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":29}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":21}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":68}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":43}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":80}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":33}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":67}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":17}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":18}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":51}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":29}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":65}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":20}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":18}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":63}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":22}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":52}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":30}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":65}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":76}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":49}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":22}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":7}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":5}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":25}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":11}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":7}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":31}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":29}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":38}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":29}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":51}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":29}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":65}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":16}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":32}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":30}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":29}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":65}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":18}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":17}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":23}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":42}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":31}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":26}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":49}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":22}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":20}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":3}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":41}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":22}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":27}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":75}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":40}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":39}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":43}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":49}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":15}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":35}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":1}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":54}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":31}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":1}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":61}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":39}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":1}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":46}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":28}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":1}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":51}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":59}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":43}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":19}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":45}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":7}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":3}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":23}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":1}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":48}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":22}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":26}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":1}}},"s":{"12":0,"13":0,"14":0,"15":0,"16":0,"19":0,"20":0,"22":0,"23":0,"24":0,"25":0,"30":0,"31":0,"33":0,"34":0,"35":0,"36":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"47":0,"48":0,"50":0,"51":0,"52":0,"57":0,"59":0,"60":0,"61":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"93":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"110":0,"111":0,"112":0,"114":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"132":0,"133":0,"134":0,"135":0,"140":0,"141":0,"142":0,"147":0,"148":0,"149":0,"150":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"169":0,"170":0,"171":0,"176":0,"177":0,"178":0,"183":0,"184":0,"185":0,"189":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"207":0,"208":0,"209":0,"210":0,"211":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":4620},"end":{"line":212,"column":1}},"locations":[{"start":{"line":1,"column":4620},"end":{"line":212,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":4620},"end":{"line":212,"column":1}},"loc":{"start":{"line":1,"column":4620},"end":{"line":212,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\hooks.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\hooks.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":54}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":44}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":1}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":34}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":57}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":21}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":45}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":61}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":25}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":38}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":61}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":39}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":62}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":26}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":1}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":48}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":64}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":28}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":37}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":60}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":24}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":38}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":61}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":38}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":61}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":25}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":37}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":60}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":24}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":31}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":61}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":25}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":1}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":39}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":62}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":26}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":1}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":45}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":56}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":51}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":72}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":38}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":1}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":55}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":51}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":15}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":1}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":40}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":40}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":1}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":42}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":1}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":39}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":33}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":39}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":33}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":43}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":10}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":13}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":39}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":37}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":39}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":39}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":4}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":1}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":42}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":38}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":42}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":40}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":43}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":10}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":11}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":14}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":12}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":32}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":34}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":32}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":32}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":4}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":1}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":43}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":45}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":37}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":43}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":10}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":19}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":10}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":44}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":29}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":4}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":1}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":43}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":37}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":45}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":43}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":10}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":10}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":19}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":51}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":41}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":29}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":1}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":41}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":33}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":49}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":43}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":10}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":13}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":39}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":37}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":49}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":45}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":43}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":4}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":1}}},"s":{"0":0,"15":0,"16":0,"17":0,"18":0,"23":0,"24":0,"25":0,"26":0,"31":0,"32":0,"33":0,"34":0,"41":0,"42":0,"43":0,"44":0,"49":0,"50":0,"51":0,"52":0,"57":0,"58":0,"59":0,"60":0,"67":0,"68":0,"69":0,"70":0,"75":0,"76":0,"77":0,"78":0,"85":0,"86":0,"87":0,"88":0,"93":0,"94":0,"95":0,"96":0,"103":0,"104":0,"105":0,"106":0,"111":0,"112":0,"113":0,"114":0,"121":0,"122":0,"123":0,"124":0,"131":0,"132":0,"133":0,"134":0,"139":0,"140":0,"141":0,"142":0,"147":0,"148":0,"149":0,"156":0,"157":0,"158":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":253,"column":-1688}},"locations":[{"start":{"line":1,"column":0},"end":{"line":253,"column":-1688}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":253,"column":-1688}},"loc":{"start":{"line":1,"column":0},"end":{"line":253,"column":-1688}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2458},"end":{"line":118,"column":17}},"locations":[{"start":{"line":1,"column":2458},"end":{"line":118,"column":17}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2458},"end":{"line":118,"column":17}},"loc":{"start":{"line":1,"column":2458},"end":{"line":118,"column":17}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\store.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\store.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":41}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":15}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":25}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":24}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":23}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":28}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":23}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":24}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":24}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":23}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":15}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":12}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":15}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":14}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":2}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":59}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":72}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":41}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":68}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":49}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":42}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":54}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":13}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":45}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":9}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":66}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":33}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":27}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":27}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":29}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":45}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":9}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":61}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":17}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":27}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":27}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":41}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":31}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":35}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":41}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":10}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":44}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":54}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":95}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":48}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":4}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":50}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":41}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":9}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":56}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":32}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":32}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":31}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":37}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":29}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":25}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":46}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":64}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":94}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":16}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":4}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":54}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":41}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":9}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":49}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":20}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":95}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":5}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":4}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":47}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":9}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":63}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":34}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":44}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":32}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":34}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":42}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":42}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":57}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":8}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":44}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":99}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":5}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":4}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":127}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":9}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":63}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":19}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":51}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":19}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":96}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":4}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":61}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":9}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":56}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":50}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":19}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":97}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":5}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":4}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":60}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":9}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":55}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":51}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":19}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":96}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":5}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":4}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":112}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":9}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":70}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":44}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":15}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":59}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":8}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":20}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":19}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":93}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":16}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":5}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":4}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":182}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":9}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":54}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":40}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":27}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":10}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":91}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":48}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":19}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":19}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":95}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":16}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":5}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":4}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":18}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":88}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":20}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":27}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":76}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":9}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":54}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":40}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":27}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":31}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":10}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":64}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":28}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":16}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":22}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":8}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":48}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":20}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":19}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":89}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":16}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":5}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":4}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":50}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":9}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":63}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":19}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":78}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":5}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":4}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":48}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":9}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":59}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":13}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":5}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":4}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":107}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":9}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":63}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":16}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":18}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":25}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":9}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":51}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":17}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":28}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":27}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":33}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":32}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":36}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":21}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":10}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":92}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":48}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":37}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":20}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":19}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":89}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":16}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":5}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":4}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":59}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":41}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":37}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":90}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":17}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":49}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":54}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":13}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":9}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":70}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":64}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":51}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":54}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":19}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":95}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":5}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":4}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":84}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":9}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":77}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":19}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":94}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":16}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":4}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":32}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":20}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":34}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":20}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":18}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":82}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":9}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":71}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":16}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":13}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":14}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":8}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":56}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":22}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":19}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":96}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":16}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":5}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":4}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":65}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":9}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":85}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":85}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":32}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":8}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":51}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":37}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":19}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":98}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":16}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":5}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":4}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":64}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":9}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":67}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":85}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":32}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":8}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":19}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":97}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":16}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":5}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":4}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":27}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":35}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":69}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":4}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":36}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":45}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":4}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":27}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":35}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":4}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":22}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":51}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":35}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":4}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":3}}},"s":{"0":0,"26":0,"28":0,"29":0,"30":0,"33":0,"34":0,"35":0,"38":0,"39":0,"42":0,"43":0,"46":0,"47":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"58":0,"59":0,"60":0,"64":0,"65":0,"69":0,"70":0,"71":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"134":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"143":0,"144":0,"146":0,"147":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"299":0,"300":0,"303":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"314":0,"315":0,"316":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"394":0,"395":0,"396":0,"397":0,"399":0,"400":0,"401":0,"405":0,"406":0,"407":0,"409":0,"410":0,"411":0,"412":0,"413":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":12035},"end":{"line":416,"column":34}},"locations":[{"start":{"line":1,"column":12035},"end":{"line":416,"column":34}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":12035},"end":{"line":416,"column":34}},"loc":{"start":{"line":1,"column":12035},"end":{"line":416,"column":34}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\domains\\intelligence\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":4641},"end":{"line":184,"column":1}},"locations":[{"start":{"line":1,"column":4641},"end":{"line":184,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":4641},"end":{"line":184,"column":1}},"loc":{"start":{"line":1,"column":4641},"end":{"line":184,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\hooks\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\hooks\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":291},"end":{"line":16,"column":31}},"locations":[{"start":{"line":1,"column":291},"end":{"line":16,"column":31}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":291},"end":{"line":16,"column":31}},"loc":{"start":{"line":1,"column":291},"end":{"line":16,"column":31}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\hooks\\useAutomationEvents.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\hooks\\useAutomationEvents.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":60}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":99}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":68}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":105}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":1}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":68}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":96}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":1}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":36}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":31}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":9}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":31}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":33}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":20}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":20}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":14}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":51}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":57}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":59}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":63}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":69}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":53}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":57}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":18}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":55}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":34}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":48}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":37}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":46}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":66}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":34}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":20}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":7}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":29}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":42}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":73}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":51}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":53}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":60}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":42}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":20}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":55}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":23}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":73}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":40}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":44}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":44}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":34}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":11}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":71}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":61}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":23}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":84}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":32}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":40}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":44}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":38}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":34}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":11}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":7}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":55}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":33}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":31}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":6}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":52}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":41}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":50}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":70}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":34}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":24}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":7}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":48}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":77}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":46}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":48}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":30}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":55}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":46}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":59}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":27}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":80}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":32}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":44}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":52}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":43}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":34}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":11}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":7}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":35}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":6}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":52}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":41}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":50}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":70}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":35}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":6}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":57}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":69}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":69}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":73}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":18}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":57}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":36}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":6}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":6}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":11}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":24}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":26}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":14}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":17}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":21}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":15}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":16}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":20}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":20}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":5}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":1}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":30}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":31}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":19}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":41}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":9}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":37}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":40}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":80}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":41}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":7}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":6}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":45}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":17}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":1}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":34}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":31}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":21}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":45}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":9}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":19}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":39}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":40}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":92}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":45}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":7}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":6}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":49}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":17}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":36}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":1}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":35}}},"s":{"0":0,"64":0,"65":0,"66":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"117":0,"119":0,"120":0,"121":0,"122":0,"125":0,"126":0,"129":0,"130":0,"132":0,"133":0,"136":0,"137":0,"138":0,"141":0,"142":0,"143":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"185":0,"186":0,"189":0,"190":0,"192":0,"193":0,"196":0,"197":0,"198":0,"201":0,"202":0,"203":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"226":0,"227":0,"230":0,"231":0,"233":0,"234":0,"237":0,"240":0,"241":0,"244":0,"245":0,"246":0,"248":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"284":0,"285":0,"286":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"306":0,"307":0,"308":0,"309":0,"310":0,"312":0,"313":0,"314":0,"315":0,"317":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":9243},"end":{"line":318,"column":35}},"locations":[{"start":{"line":1,"column":9243},"end":{"line":318,"column":35}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":9243},"end":{"line":318,"column":35}},"loc":{"start":{"line":1,"column":9243},"end":{"line":318,"column":35}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\active-learning.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\active-learning.ts","all":true,"statementMap":{"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":24}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":41}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":36}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":67}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":1}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":67}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":100}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":101}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":81}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":81}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":67}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":39}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":89}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":89}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":24}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":90}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":89}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":22}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":20}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":89}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":33}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":52}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":52}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":51}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":25}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":33}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":52}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":53}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":54}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":26}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":18}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":39}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":43}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":39}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":17}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":28}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":42}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":28}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":28}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":14}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":84}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":20}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":42}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":40}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":27}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":6}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":56}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":73}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":30}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":22}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":37}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":15}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":28}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":28}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":26}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":22}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":6}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":31}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":35}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":42}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":51}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":5}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":3}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":20}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":22}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":21}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":20}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":20}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":49}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":44}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":29}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":11}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":14}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":42}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":28}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":14}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":63}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":88}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":3}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":55}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":79}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":23}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":48}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":34}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":38}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":24}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":31}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":9}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":38}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":40}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":35}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":38}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":24}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":31}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":9}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":24}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":24}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":33}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":37}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":34}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":24}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":31}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":9}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":73}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":44}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":32}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":38}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":35}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":6}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":88}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":50}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":38}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":12}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":26}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":19}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":30}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":9}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":5}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":3}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":62}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":75}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":42}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":85}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":65}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":70}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":24}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":71}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":16}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":27}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":33}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":60}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":39}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":23}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":59}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":25}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":5}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":23}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":71}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":47}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":35}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":39}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":27}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":39}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":20}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":42}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":6}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":69}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":3}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":29}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":71}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":75}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":61}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":20}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":20}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":17}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":18}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":18}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":18}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":6}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":38}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":33}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":5}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":12}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":38}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":19}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":42}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":45}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":88}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":12}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":6}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":48}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":18}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":60}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":28}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":3}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":52}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":18}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":62}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":5}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":30}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":43}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":58}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":16}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":32}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":38}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":65}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":69}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":3}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":1}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":55}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":65}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":24}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":48}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":3}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":24}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":1}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":51}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":24}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":1}}},"s":{"18":0,"19":0,"20":0,"24":0,"25":0,"26":0,"30":0,"31":0,"32":0,"34":0,"36":0,"37":0,"38":0,"39":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"81":0,"82":0,"83":0,"85":0,"86":0,"88":0,"89":0,"90":0,"93":0,"94":0,"95":0,"98":0,"99":0,"100":0,"105":0,"106":0,"107":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"136":0,"137":0,"138":0,"140":0,"141":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"234":0,"235":0,"236":0,"239":0,"241":0,"243":0,"244":0,"247":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"279":0,"280":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"345":0,"346":0,"347":0,"348":0,"349":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"362":0,"363":0,"364":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":9252},"end":{"line":365,"column":1}},"locations":[{"start":{"line":1,"column":9252},"end":{"line":365,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":9252},"end":{"line":365,"column":1}},"loc":{"start":{"line":1,"column":9252},"end":{"line":365,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\agent-swarm.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\agent-swarm.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":50}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":28}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":28}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":30}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":2}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":48}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":25}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":36}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":48}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":46}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":57}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":46}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":29}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":24}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":15}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":16}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":80}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":83}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":28}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":59}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":51}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":33}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":34}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":36}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":43}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":10}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":12}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":64}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":29}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":25}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":32}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":42}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":34}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":6}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":65}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":25}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":81}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":5}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":33}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":30}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":9}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":40}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":26}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":45}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":16}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":24}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":43}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":16}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":22}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":41}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":7}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":34}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":52}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":27}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":50}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":19}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":29}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":85}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":50}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":51}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":35}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":45}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":5}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":9}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":45}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":42}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":158}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":22}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":49}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":34}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":42}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":38}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":75}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":22}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":6}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":16}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":85}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":81}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":6}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":67}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":28}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":42}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":33}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":51}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":11}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":38}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":65}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":15}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":67}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":32}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":32}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":21}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":34}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":73}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":7}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":53}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":3}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":65}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":59}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":33}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":51}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":11}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":58}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":32}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":32}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":21}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":34}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":73}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":7}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":53}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":7}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":39}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":63}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":50}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":70}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":54}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":36}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":50}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":13}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":59}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":67}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":34}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":24}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":30}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":40}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":28}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":46}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":16}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":10}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":13}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":36}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":30}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":76}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":72}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":34}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":34}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":23}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":36}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":75}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":9}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":55}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":36}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":46}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":66}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":79}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":14}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":7}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":31}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":21}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":27}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":22}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":55}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":57}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":62}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":3}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":24}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":19}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":24}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":29}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":16}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":48}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":35}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":15}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":30}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":44}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":20}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":26}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":9}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":29}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":44}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":33}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":33}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":62}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":43}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":17}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":10}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":5}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":31}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":44}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":33}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":33}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":58}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":43}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":10}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":42}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":31}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":31}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":26}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":48}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":59}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":41}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":8}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":3}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":74}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":47}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":65}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":6}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":46}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":42}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":89}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":52}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":67}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":7}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":57}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":3}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":67}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":38}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":72}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":27}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":46}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":43}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":81}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":6}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":48}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":72}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":87}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":41}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":5}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":16}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":61}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":89}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":76}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":41}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":38}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":67}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":16}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":5}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":34}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":50}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":125}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":47}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":77}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":43}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":74}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":38}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":42}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":41}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":89}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":77}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":11}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":9}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":7}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":12}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":42}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":85}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":74}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":7}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":5}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":36}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":63}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":39}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":55}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":7}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":5}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":31}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":3}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":47}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":38}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":3}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":50}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":51}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":3}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":39}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":40}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":3}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":52}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":94}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":24}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":53}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":12}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":47}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":5}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":3}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":43}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":89}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":3}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":28}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":73}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":3}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":53}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":49}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":3}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":31}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":9}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":58}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":46}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":13}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":24}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":5}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":3}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":31}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":9}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":87}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":28}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":3}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":1}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":40}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":74}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":19}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":39}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":3}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":19}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":1}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":41}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":19}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":1}}},"s":{"0":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"88":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"106":0,"107":0,"108":0,"116":0,"117":0,"118":0,"123":0,"124":0,"125":0,"127":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"153":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"193":0,"194":0,"195":0,"196":0,"197":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"218":0,"219":0,"220":0,"221":0,"223":0,"224":0,"231":0,"232":0,"234":0,"235":0,"236":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"259":0,"260":0,"261":0,"262":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"276":0,"277":0,"283":0,"284":0,"285":0,"287":0,"288":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"303":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"318":0,"320":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"339":0,"340":0,"341":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"353":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"363":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"374":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"395":0,"396":0,"397":0,"398":0,"400":0,"402":0,"403":0,"404":0,"405":0,"406":0,"408":0,"409":0,"411":0,"412":0,"413":0,"414":0,"416":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"427":0,"429":0,"430":0,"436":0,"437":0,"438":0,"440":0,"441":0,"442":0,"443":0,"444":0,"446":0,"447":0,"448":0,"450":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"477":0,"478":0,"482":0,"483":0,"484":0,"486":0,"487":0,"488":0,"490":0,"491":0,"492":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"503":0,"504":0,"505":0,"509":0,"510":0,"511":0,"513":0,"514":0,"515":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"537":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"546":0,"547":0,"548":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":16125},"end":{"line":549,"column":1}},"locations":[{"start":{"line":1,"column":16125},"end":{"line":549,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":16125},"end":{"line":549,"column":1}},"loc":{"start":{"line":1,"column":16125},"end":{"line":549,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\animations.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\animations.ts","all":true,"statementMap":{"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":39}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":33}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":32}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":31}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":43}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":33}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":32}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":25}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":12}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":15}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":17}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":28}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":6}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":4}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":9}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":15}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":17}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":20}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":6}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":4}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":2}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":41}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":26}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":23}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":83}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":46}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":25}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":2}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":43}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":2}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":43}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":2}}},"s":{"3":0,"4":0,"5":0,"6":0,"7":0,"10":0,"11":0,"12":0,"13":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"33":0,"34":0,"35":0,"36":0,"37":0,"40":0,"43":0,"46":0,"47":0,"48":0,"49":0,"52":0,"53":0,"54":0,"55":0,"58":0,"59":0,"60":0,"61":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":92},"end":{"line":62,"column":-344}},"locations":[{"start":{"line":1,"column":92},"end":{"line":62,"column":-344}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":92},"end":{"line":62,"column":-344}},"loc":{"start":{"line":1,"column":92},"end":{"line":62,"column":-344}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\api-fallbacks.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\api-fallbacks.ts","all":false,"statementMap":{"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":63}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":10}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":23}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":19}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":19}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":27}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":40}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":24}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":24}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":4}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":67}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":51}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":84}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":10}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":22}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":30}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":17}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":17}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":4}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":1}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":93}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":37}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":21}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":16}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":35}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":53}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":35}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":55}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":57}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":42}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":35}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":45}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":36}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":82}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":67}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":50}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":52}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":7}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":15}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":1}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":97}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":28}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":12}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":84}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":85}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":84}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":6}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":33}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":17}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":21}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":60}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":35}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":6}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":1}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":102}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":17}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":29}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":24}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":21}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":39}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":30}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":32}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":60}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":8}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":1}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":69}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":43}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":69}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":72}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":66}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":67}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":66}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":63}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":66}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":64}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":71}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":68}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":70}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":73}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":66}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":65}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":71}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":63}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":4}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":62}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":76}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":10}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":11}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":17}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":30}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":18}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":4}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":1}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":115}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":37}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":42}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":56}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":56}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":54}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":54}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":1}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":58}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":31}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":48}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":68}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":52}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":57}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":26}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":15}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":1}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":57}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":31}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":48}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":12}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":36}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":39}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":36}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":31}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":3}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":15}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":1}}},"s":{"109":1,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"129":1,"131":0,"132":0,"133":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"147":1,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"158":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"175":0,"176":0,"182":1,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"203":1,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"219":1,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"239":0,"240":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"267":1,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"282":1,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"291":0,"292":0,"293":0},"branchMap":{},"b":{},"fnMap":{"0":{"name":"getQuickConfigFallback","decl":{"start":{"line":110,"column":7},"end":{"line":124,"column":1}},"loc":{"start":{"line":110,"column":7},"end":{"line":124,"column":1}},"line":110},"1":{"name":"getWorkspaceInfoFallback","decl":{"start":{"line":130,"column":7},"end":{"line":143,"column":1}},"loc":{"start":{"line":130,"column":7},"end":{"line":143,"column":1}},"line":130},"2":{"name":"getUsageStatsFallback","decl":{"start":{"line":148,"column":7},"end":{"line":177,"column":1}},"loc":{"start":{"line":148,"column":7},"end":{"line":177,"column":1}},"line":148},"3":{"name":"getPluginStatusFallback","decl":{"start":{"line":183,"column":7},"end":{"line":199,"column":1}},"loc":{"start":{"line":183,"column":7},"end":{"line":199,"column":1}},"line":183},"4":{"name":"getScheduledTasksFallback","decl":{"start":{"line":204,"column":7},"end":{"line":214,"column":1}},"loc":{"start":{"line":204,"column":7},"end":{"line":214,"column":1}},"line":204},"5":{"name":"getSecurityStatusFallback","decl":{"start":{"line":220,"column":7},"end":{"line":249,"column":1}},"loc":{"start":{"line":220,"column":7},"end":{"line":249,"column":1}},"line":220},"6":{"name":"calculateSecurityLevel","decl":{"start":{"line":254,"column":0},"end":{"line":261,"column":1}},"loc":{"start":{"line":254,"column":0},"end":{"line":261,"column":1}},"line":254},"7":{"name":"isNotFoundError","decl":{"start":{"line":268,"column":7},"end":{"line":278,"column":1}},"loc":{"start":{"line":268,"column":7},"end":{"line":278,"column":1}},"line":268},"8":{"name":"isNetworkError","decl":{"start":{"line":283,"column":7},"end":{"line":294,"column":1}},"loc":{"start":{"line":283,"column":7},"end":{"line":294,"column":1}},"line":283}},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\api-key-storage.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\api-key-storage.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":40}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":6}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":11}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":39}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":14}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":43}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":18}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":4}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":11}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":39}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":4}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":13}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":37}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":18}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":19}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":20}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":4}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":10}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":37}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":13}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":18}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":19}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":20}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":4}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":11}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":23}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":4}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":2}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":70}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":43}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":40}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":58}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":32}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":44}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":12}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":19}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":73}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":6}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":44}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":19}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":72}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":3}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":40}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":12}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":56}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":6}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":74}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":12}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":69}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":6}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":25}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":1}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":60}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":53}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":32}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":34}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":14}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":13}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":28}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":53}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":26}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":38}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":32}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":25}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":50}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":9}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":45}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":38}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":19}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":19}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":43}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":4}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":43}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":50}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":23}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":31}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":28}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":4}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":72}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":18}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":1}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":75}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":43}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":50}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":13}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":16}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":68}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":17}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":9}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":60}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":51}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":45}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":80}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":60}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":7}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":39}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":81}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":13}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":3}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":49}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":13}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":1}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":76}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":68}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":16}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":7}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":50}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":11}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":16}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":1}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":56}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":40}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":49}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":36}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":47}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":11}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":65}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":28}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":15}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":7}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":3}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":18}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":1}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":69}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":43}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":41}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":54}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":48}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":1}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":37}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":19}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":64}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":9}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":68}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":18}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":68}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":56}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":62}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":77}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":1}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":69}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":36}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":22}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":1}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":71}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":4}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":36}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":13}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":56}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":3}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":41}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":1}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":95}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":27}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":36}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":36}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":58}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":5}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":1}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":78}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":69}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":1}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":59}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":36}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":1}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":49}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":29}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":26}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":15}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":34}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":9}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":7}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":47}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":52}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":6}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":17}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":11}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":28}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":14}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":7}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":42}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":56}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":5}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":67}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":11}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":1}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":51}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":7}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":70}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":11}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":14}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":3}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":1}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":42}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":44}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":1}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":62}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":43}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":38}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":81}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":15}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":48}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":26}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":3}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":45}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":66}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":3}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":13}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":1}}},"s":{"0":0,"18":0,"19":0,"59":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"114":0,"117":0,"118":0,"120":0,"121":0,"122":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"162":0,"164":0,"165":0,"166":0,"175":0,"176":0,"177":0,"178":0,"182":0,"184":0,"185":0,"186":0,"187":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"205":0,"206":0,"209":0,"210":0,"211":0,"212":0,"215":0,"217":0,"218":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"235":0,"236":0,"237":0,"238":0,"239":0,"241":0,"242":0,"243":0,"244":0,"245":0,"248":0,"249":0,"250":0,"252":0,"253":0,"255":0,"256":0,"257":0,"265":0,"266":0,"267":0,"268":0,"269":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"283":0,"284":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0,"295":0,"296":0,"298":0,"299":0,"306":0,"307":0,"308":0,"309":0,"311":0,"312":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"329":0,"330":0,"332":0,"333":0,"341":0,"342":0,"343":0,"344":0,"352":0,"355":0,"356":0,"357":0,"358":0,"359":0,"361":0,"362":0,"370":0,"372":0,"375":0,"376":0,"377":0,"378":0,"379":0,"385":0,"386":0,"387":0,"392":0,"393":0,"394":0,"406":0,"407":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"423":0,"424":0,"425":0,"428":0,"429":0,"430":0,"432":0,"433":0,"435":0,"436":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"452":0,"453":0,"454":0,"460":0,"461":0,"462":0,"463":0,"465":0,"466":0,"467":0,"468":0,"470":0,"471":0,"472":0,"474":0,"475":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":11183},"end":{"line":476,"column":1}},"locations":[{"start":{"line":1,"column":11183},"end":{"line":476,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":11183},"end":{"line":476,"column":1}},"loc":{"start":{"line":1,"column":11183},"end":{"line":476,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\audit-logger.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\audit-logger.ts","all":true,"statementMap":{"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":39}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":31}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":81}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":74}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":33}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":34}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":48}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":7}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":53}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":27}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":60}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":43}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":11}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":14}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":1}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":58}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":7}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":52}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":67}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":17}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":77}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":19}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":42}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":30}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":24}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":33}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":32}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":28}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":68}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":39}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":23}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":32}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":29}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":29}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":27}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":31}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":27}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":6}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":26}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":29}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":96}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":3}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":24}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":37}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":68}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":3}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":19}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":24}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":18}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":37}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":34}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":75}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":35}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":26}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":3}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":62}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":58}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":3}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":19}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":41}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":46}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":1}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":45}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":81}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":34}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":32}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":22}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":17}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":35}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":32}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":57}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":1}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":32}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":22}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":17}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":16}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":35}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":32}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":64}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":1}}},"s":{"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"100":0,"102":0,"103":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"135":0,"136":0,"137":0,"138":0,"140":0,"142":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3840},"end":{"line":162,"column":1}},"locations":[{"start":{"line":1,"column":3840},"end":{"line":162,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3840},"end":{"line":162,"column":1}},"loc":{"start":{"line":1,"column":3840},"end":{"line":162,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\autonomy-manager.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\autonomy-manager.ts","all":true,"statementMap":{"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":56}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":21}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":26}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":30}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":26}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":28}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":26}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":25}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":24}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":2}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":47}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":9}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":12}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":10}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":2}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":80}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":15}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":21}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":28}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":32}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":30}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":28}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":28}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":6}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":24}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":23}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":6}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":26}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":4}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":22}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":21}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":27}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":32}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":30}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":30}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":27}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":27}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":24}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":23}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":21}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":6}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":26}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":4}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":15}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":24}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":21}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":27}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":31}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":79}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":27}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":27}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":6}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":64}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":26}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":2}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":52}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":49}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":30}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":33}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":41}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":70}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":49}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":36}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":50}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":24}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":11}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":15}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":23}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":48}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":45}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":56}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":44}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":60}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":50}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":24}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":32}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":20}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":30}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":44}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":84}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":22}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":30}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":41}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":12}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":85}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":96}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":57}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":52}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":23}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":33}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":60}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":33}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":32}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":154}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":14}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":24}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":32}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":42}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":7}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":40}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":13}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":23}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":13}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":16}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":17}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":42}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":6}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":38}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":57}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":5}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":20}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":56}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":90}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":36}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":48}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":44}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":30}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":40}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":42}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":26}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":41}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":25}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":33}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":39}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":39}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":6}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":40}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":33}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":58}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":55}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":90}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":52}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":35}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":94}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":22}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":40}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":59}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":20}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":74}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":19}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":5}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":28}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":38}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":46}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":45}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":35}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":54}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":61}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":16}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":3}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":39}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":59}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":74}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":19}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":45}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":35}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":53}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":61}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":16}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":76}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":81}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":9}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":15}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":8}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":3}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":91}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":34}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":74}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":30}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":15}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":14}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":55}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":36}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":6}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":30}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":37}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":48}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":5}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":24}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":106}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":82}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":16}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":30}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":26}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":5}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":3}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":38}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":60}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":17}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":74}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":19}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":5}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":42}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":72}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":19}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":5}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":34}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":50}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":24}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":61}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":16}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":3}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":52}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":39}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":25}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":23}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":24}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":3}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":31}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":30}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":3}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":56}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":49}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":22}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":3}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":40}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":64}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":22}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":64}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":40}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":9}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":60}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":16}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":39}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":67}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":7}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":13}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":5}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":45}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":30}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":9}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":77}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":13}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":5}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":3}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":32}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":9}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":54}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":16}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":40}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":7}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":13}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":25}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":5}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":3}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":32}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":9}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":85}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":13}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":5}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":3}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":43}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":9}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":66}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":79}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":13}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":5}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":3}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":1}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":45}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":87}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":19}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":44}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":3}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":19}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":1}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":46}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":19}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":1}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":31}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":21}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":24}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":56}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":39}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":60}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":10}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":63}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":13}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":4}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":1}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":45}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":21}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":21}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":29}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":77}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":96}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":39}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":60}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":55}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":9}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":38}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":50}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":21}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":73}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":43}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":5}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":3}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":55}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":43}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":51}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":1}}},"s":{"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"91":0,"92":0,"93":0,"94":0,"95":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"155":0,"156":0,"160":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"178":0,"179":0,"180":0,"185":0,"186":0,"187":0,"188":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"200":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"242":0,"243":0,"244":0,"246":0,"247":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"279":0,"280":0,"281":0,"284":0,"286":0,"287":0,"288":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"301":0,"302":0,"303":0,"306":0,"307":0,"310":0,"312":0,"313":0,"314":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"327":0,"328":0,"331":0,"333":0,"334":0,"335":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"359":0,"362":0,"363":0,"364":0,"366":0,"367":0,"369":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"388":0,"389":0,"390":0,"391":0,"394":0,"395":0,"396":0,"398":0,"399":0,"400":0,"405":0,"406":0,"407":0,"412":0,"413":0,"414":0,"415":0,"419":0,"420":0,"421":0,"423":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"431":0,"432":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"445":0,"446":0,"447":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"468":0,"469":0,"470":0,"471":0,"473":0,"474":0,"476":0,"477":0,"478":0,"479":0,"480":0,"482":0,"483":0,"484":0,"488":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"497":0,"498":0,"499":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"531":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"543":0,"544":0,"546":0,"547":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":14730},"end":{"line":548,"column":1}},"locations":[{"start":{"line":1,"column":14730},"end":{"line":548,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":14730},"end":{"line":548,"column":1}},"loc":{"start":{"line":1,"column":14730},"end":{"line":548,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\browser-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\browser-client.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":47}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":35}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":43}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":40}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":32}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":38}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":38}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":40}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":5}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":70}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":56}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":69}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":41}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":82}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":54}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":31}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":20}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":13}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":37}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":56}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":1}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":62}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":47}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":65}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":50}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":1}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":65}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":50}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":1}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":73}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":50}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":1}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":68}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":52}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":1}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":34}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":20}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":18}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":32}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":65}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":35}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":20}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":18}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":34}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":66}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":1}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":81}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":58}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":1}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":31}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":19}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":15}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":22}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":75}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":1}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":85}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":61}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":1}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":35}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":20}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":19}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":27}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":77}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":1}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":37}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":20}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":32}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":45}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":14}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":13}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":34}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":1}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":36}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":20}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":17}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":18}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":21}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":71}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":1}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":87}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":53}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":1}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":40}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":20}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":18}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":37}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":71}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":1}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":69}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":53}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":1}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":33}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":20}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":22}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":19}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":20}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":38}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":40}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":14}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":14}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":12}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":14}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":1}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":31}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":20}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":26}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":25}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":18}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":76}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":1}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":22}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":42}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":25}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":23}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":48}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":39}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":26}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":3}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":32}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":25}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":41}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":28}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":5}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":33}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":26}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":3}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":61}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":25}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":42}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":3}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":58}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":25}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":50}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":3}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":61}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":25}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":51}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":48}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":25}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":44}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":3}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":81}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":25}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":65}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":3}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":80}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":25}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":64}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":3}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":56}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":25}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":39}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":3}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":66}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":25}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":56}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":3}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":35}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":25}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":38}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":3}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":32}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":25}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":42}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":34}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":25}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":37}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":3}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":15}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":24}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":21}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":22}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":40}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":25}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":70}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":83}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":25}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":61}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":3}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":33}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":26}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":74}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":5}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":3}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":1}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":23}}},"s":{"0":0,"68":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"87":0,"88":0,"89":0,"94":0,"95":0,"96":0,"101":0,"102":0,"103":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"122":0,"123":0,"124":0,"129":0,"130":0,"131":0,"136":0,"137":0,"138":0,"143":0,"144":0,"145":0,"150":0,"151":0,"152":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"181":0,"182":0,"183":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"200":0,"201":0,"202":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"248":0,"249":0,"250":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"265":0,"266":0,"267":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"308":0,"309":0,"314":0,"320":0,"321":0,"322":0,"323":0,"324":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"339":0,"340":0,"341":0,"346":0,"347":0,"348":0,"349":0,"354":0,"355":0,"356":0,"357":0,"362":0,"363":0,"364":0,"365":0,"370":0,"371":0,"372":0,"373":0,"378":0,"379":0,"380":0,"381":0,"386":0,"387":0,"388":0,"389":0,"394":0,"395":0,"396":0,"397":0,"402":0,"403":0,"404":0,"405":0,"410":0,"411":0,"412":0,"413":0,"418":0,"419":0,"420":0,"421":0,"426":0,"427":0,"428":0,"429":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"446":0,"447":0,"448":0,"449":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"459":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10440},"end":{"line":460,"column":23}},"locations":[{"start":{"line":1,"column":10440},"end":{"line":460,"column":23}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10440},"end":{"line":460,"column":23}},"loc":{"start":{"line":1,"column":10440},"end":{"line":460,"column":23}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\config-parser.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\config-parser.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":45}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":14}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":20}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":35}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":5}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":19}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":35}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":56}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":20}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":51}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":46}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":71}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":58}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":64}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":63}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":58}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":62}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":80}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":80}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":54}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":74}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":68}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":2}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":49}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":11}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":22}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":15}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":26}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":22}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":10}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":15}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":41}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":38}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":8}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":36}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":2}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":99}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":66}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":63}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":20}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":44}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":93}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":7}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":33}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":108}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":4}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":64}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":47}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":51}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":56}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":19}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":59}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":26}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":9}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":48}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":50}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":58}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":46}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":32}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":21}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":15}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":60}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":28}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":11}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":7}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":55}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":48}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":88}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":30}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":54}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":11}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":7}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":72}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":21}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":30}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":42}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":28}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":11}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":7}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":53}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":52}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":27}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":100}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":25}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":45}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":47}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":32}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":13}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":9}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":108}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":49}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":53}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":30}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":13}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":9}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":7}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":49}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":39}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":90}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":39}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":54}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":28}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":11}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":7}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":84}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":36}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":51}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":28}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":11}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":7}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":5}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":33}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":13}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":15}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":6}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":4}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":21}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":20}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":48}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":24}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":62}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":55}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":24}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":44}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":93}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":21}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":8}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":5}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":18}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":4}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":56}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":77}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":4}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":75}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":74}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":4}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":79}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":58}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":73}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":12}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":21}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":50}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":14}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":27}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":6}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":4}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":38}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":72}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":4}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":68}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":55}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":24}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":4}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":2}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":78}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":32}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":29}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":29}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":52}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":23}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":5}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":38}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":23}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":57}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":3}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":17}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":1}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":54}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":21}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":20}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":15}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":31}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":57}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":36}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":36}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":8}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":34}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":40}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":29}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":36}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":34}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":40}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":29}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":33}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":7}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":30}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":47}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":46}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":22}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":43}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":46}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":5}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":3}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":16}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":28}}},"s":{"0":1,"24":1,"25":1,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"89":1,"103":1,"104":3,"106":3,"109":3,"110":3,"111":3,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":3,"136":1,"137":9,"138":9,"140":9,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":8,"150":9,"151":80,"152":80,"153":26,"154":26,"155":26,"156":26,"157":26,"158":26,"159":80,"161":9,"162":7,"163":7,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":7,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":7,"179":9,"180":5,"181":5,"182":5,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":5,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":5,"197":5,"199":9,"200":5,"201":5,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":5,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":5,"216":8,"217":8,"218":8,"219":8,"220":8,"221":9,"237":1,"238":2,"239":2,"240":2,"241":2,"242":2,"243":2,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":2,"263":1,"264":1,"265":1,"278":1,"279":1,"280":1,"295":1,"296":2,"297":2,"298":2,"299":2,"300":2,"301":2,"302":2,"303":2,"304":2,"311":1,"312":0,"313":0,"321":1,"322":3,"323":3,"324":3,"325":1,"330":80,"331":80,"332":80,"333":80,"334":146,"335":17,"336":17,"337":146,"338":0,"339":0,"340":129,"341":129,"342":63,"343":63,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"355":2,"356":2,"357":2,"358":2,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":2,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":2,"375":2,"376":2,"377":1},"branchMap":{"0":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":2},"end":{"line":45,"column":3}},"locations":[{"start":{"line":39,"column":2},"end":{"line":45,"column":3}}]},"1":{"type":"branch","line":104,"loc":{"start":{"line":104,"column":15},"end":{"line":121,"column":4}},"locations":[{"start":{"line":104,"column":15},"end":{"line":121,"column":4}}]},"2":{"type":"branch","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":120,"column":5}},"locations":[{"start":{"line":112,"column":4},"end":{"line":120,"column":5}}]},"3":{"type":"branch","line":137,"loc":{"start":{"line":137,"column":18},"end":{"line":222,"column":4}},"locations":[{"start":{"line":137,"column":18},"end":{"line":222,"column":4}}]},"4":{"type":"branch","line":141,"loc":{"start":{"line":141,"column":55},"end":{"line":148,"column":5}},"locations":[{"start":{"line":141,"column":55},"end":{"line":148,"column":5}}]},"5":{"type":"branch","line":148,"loc":{"start":{"line":148,"column":4},"end":{"line":151,"column":57}},"locations":[{"start":{"line":148,"column":4},"end":{"line":151,"column":57}}]},"6":{"type":"branch","line":151,"loc":{"start":{"line":151,"column":57},"end":{"line":160,"column":5}},"locations":[{"start":{"line":151,"column":57},"end":{"line":160,"column":5}}]},"7":{"type":"branch","line":153,"loc":{"start":{"line":153,"column":31},"end":{"line":159,"column":7}},"locations":[{"start":{"line":153,"column":31},"end":{"line":159,"column":7}}]},"8":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":4},"end":{"line":162,"column":22}},"locations":[{"start":{"line":160,"column":4},"end":{"line":162,"column":22}}]},"9":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":12},"end":{"line":162,"column":54}},"locations":[{"start":{"line":162,"column":12},"end":{"line":162,"column":54}}]},"10":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":54},"end":{"line":178,"column":5}},"locations":[{"start":{"line":162,"column":54},"end":{"line":178,"column":5}}]},"11":{"type":"branch","line":164,"loc":{"start":{"line":164,"column":33},"end":{"line":164,"column":87}},"locations":[{"start":{"line":164,"column":33},"end":{"line":164,"column":87}}]},"12":{"type":"branch","line":164,"loc":{"start":{"line":164,"column":87},"end":{"line":170,"column":7}},"locations":[{"start":{"line":164,"column":87},"end":{"line":170,"column":7}}]},"13":{"type":"branch","line":171,"loc":{"start":{"line":171,"column":71},"end":{"line":177,"column":7}},"locations":[{"start":{"line":171,"column":71},"end":{"line":177,"column":7}}]},"14":{"type":"branch","line":178,"loc":{"start":{"line":178,"column":4},"end":{"line":180,"column":21}},"locations":[{"start":{"line":178,"column":4},"end":{"line":180,"column":21}}]},"15":{"type":"branch","line":180,"loc":{"start":{"line":180,"column":12},"end":{"line":180,"column":52}},"locations":[{"start":{"line":180,"column":12},"end":{"line":180,"column":52}}]},"16":{"type":"branch","line":180,"loc":{"start":{"line":180,"column":52},"end":{"line":198,"column":5}},"locations":[{"start":{"line":180,"column":52},"end":{"line":198,"column":5}}]},"17":{"type":"branch","line":183,"loc":{"start":{"line":183,"column":99},"end":{"line":189,"column":9}},"locations":[{"start":{"line":183,"column":99},"end":{"line":189,"column":9}}]},"18":{"type":"branch","line":190,"loc":{"start":{"line":190,"column":107},"end":{"line":196,"column":9}},"locations":[{"start":{"line":190,"column":107},"end":{"line":196,"column":9}}]},"19":{"type":"branch","line":198,"loc":{"start":{"line":198,"column":4},"end":{"line":200,"column":19}},"locations":[{"start":{"line":198,"column":4},"end":{"line":200,"column":19}}]},"20":{"type":"branch","line":200,"loc":{"start":{"line":200,"column":12},"end":{"line":200,"column":48}},"locations":[{"start":{"line":200,"column":12},"end":{"line":200,"column":48}}]},"21":{"type":"branch","line":200,"loc":{"start":{"line":200,"column":48},"end":{"line":216,"column":5}},"locations":[{"start":{"line":200,"column":48},"end":{"line":216,"column":5}}]},"22":{"type":"branch","line":202,"loc":{"start":{"line":202,"column":89},"end":{"line":208,"column":7}},"locations":[{"start":{"line":202,"column":89},"end":{"line":208,"column":7}}]},"23":{"type":"branch","line":209,"loc":{"start":{"line":209,"column":83},"end":{"line":215,"column":7}},"locations":[{"start":{"line":209,"column":83},"end":{"line":215,"column":7}}]},"24":{"type":"branch","line":216,"loc":{"start":{"line":216,"column":4},"end":{"line":221,"column":6}},"locations":[{"start":{"line":216,"column":4},"end":{"line":221,"column":6}}]},"25":{"type":"branch","line":238,"loc":{"start":{"line":238,"column":20},"end":{"line":251,"column":4}},"locations":[{"start":{"line":238,"column":20},"end":{"line":251,"column":4}}]},"26":{"type":"branch","line":244,"loc":{"start":{"line":244,"column":23},"end":{"line":250,"column":18}},"locations":[{"start":{"line":244,"column":23},"end":{"line":250,"column":18}}]},"27":{"type":"branch","line":246,"loc":{"start":{"line":246,"column":62},"end":{"line":246,"column":78}},"locations":[{"start":{"line":246,"column":62},"end":{"line":246,"column":78}}]},"28":{"type":"branch","line":264,"loc":{"start":{"line":264,"column":19},"end":{"line":266,"column":4}},"locations":[{"start":{"line":264,"column":19},"end":{"line":266,"column":4}}]},"29":{"type":"branch","line":279,"loc":{"start":{"line":279,"column":21},"end":{"line":281,"column":4}},"locations":[{"start":{"line":279,"column":21},"end":{"line":281,"column":4}}]},"30":{"type":"branch","line":296,"loc":{"start":{"line":296,"column":19},"end":{"line":305,"column":4}},"locations":[{"start":{"line":296,"column":19},"end":{"line":305,"column":4}}]},"31":{"type":"branch","line":301,"loc":{"start":{"line":301,"column":36},"end":{"line":301,"column":50}},"locations":[{"start":{"line":301,"column":36},"end":{"line":301,"column":50}}]},"32":{"type":"branch","line":322,"loc":{"start":{"line":322,"column":20},"end":{"line":325,"column":4}},"locations":[{"start":{"line":322,"column":20},"end":{"line":325,"column":4}}]},"33":{"type":"branch","line":331,"loc":{"start":{"line":331,"column":0},"end":{"line":344,"column":1}},"locations":[{"start":{"line":331,"column":0},"end":{"line":344,"column":1}}]},"34":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":28},"end":{"line":342,"column":3}},"locations":[{"start":{"line":334,"column":28},"end":{"line":342,"column":3}}]},"35":{"type":"branch","line":335,"loc":{"start":{"line":335,"column":51},"end":{"line":337,"column":5}},"locations":[{"start":{"line":335,"column":51},"end":{"line":337,"column":5}}]},"36":{"type":"branch","line":337,"loc":{"start":{"line":337,"column":4},"end":{"line":338,"column":37}},"locations":[{"start":{"line":337,"column":4},"end":{"line":338,"column":37}}]},"37":{"type":"branch","line":338,"loc":{"start":{"line":338,"column":37},"end":{"line":340,"column":5}},"locations":[{"start":{"line":338,"column":37},"end":{"line":340,"column":5}}]},"38":{"type":"branch","line":340,"loc":{"start":{"line":340,"column":4},"end":{"line":342,"column":3}},"locations":[{"start":{"line":340,"column":4},"end":{"line":342,"column":3}}]},"39":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":2},"end":{"line":344,"column":1}},"locations":[{"start":{"line":342,"column":2},"end":{"line":344,"column":1}}]},"40":{"type":"branch","line":349,"loc":{"start":{"line":349,"column":0},"end":{"line":377,"column":1}},"locations":[{"start":{"line":349,"column":0},"end":{"line":377,"column":1}}]},"41":{"type":"branch","line":359,"loc":{"start":{"line":359,"column":29},"end":{"line":360,"column":29}},"locations":[{"start":{"line":359,"column":29},"end":{"line":360,"column":29}}]},"42":{"type":"branch","line":360,"loc":{"start":{"line":360,"column":22},"end":{"line":361,"column":36}},"locations":[{"start":{"line":360,"column":22},"end":{"line":361,"column":36}}]},"43":{"type":"branch","line":361,"loc":{"start":{"line":361,"column":32},"end":{"line":362,"column":34}},"locations":[{"start":{"line":361,"column":32},"end":{"line":362,"column":34}}]},"44":{"type":"branch","line":362,"loc":{"start":{"line":362,"column":22},"end":{"line":363,"column":40}},"locations":[{"start":{"line":362,"column":22},"end":{"line":363,"column":40}}]},"45":{"type":"branch","line":363,"loc":{"start":{"line":363,"column":29},"end":{"line":364,"column":29}},"locations":[{"start":{"line":363,"column":29},"end":{"line":364,"column":29}}]},"46":{"type":"branch","line":364,"loc":{"start":{"line":364,"column":22},"end":{"line":365,"column":33}},"locations":[{"start":{"line":364,"column":22},"end":{"line":365,"column":33}}]},"47":{"type":"branch","line":366,"loc":{"start":{"line":366,"column":6},"end":{"line":374,"column":5}},"locations":[{"start":{"line":366,"column":6},"end":{"line":374,"column":5}}]}},"b":{"0":[1],"1":[3],"2":[0],"3":[9],"4":[1],"5":[8],"6":[80],"7":[26],"8":[8],"9":[7],"10":[7],"11":[5],"12":[1],"13":[1],"14":[8],"15":[5],"16":[5],"17":[0],"18":[1],"19":[8],"20":[5],"21":[5],"22":[1],"23":[0],"24":[8],"25":[2],"26":[1],"27":[8],"28":[1],"29":[1],"30":[2],"31":[0],"32":[3],"33":[80],"34":[146],"35":[17],"36":[129],"37":[0],"38":[129],"39":[63],"40":[2],"41":[1],"42":[1],"43":[1],"44":[1],"45":[1],"46":[1],"47":[1]},"fnMap":{"0":{"name":"ConfigParseError","decl":{"start":{"line":26,"column":2},"end":{"line":32,"column":3}},"loc":{"start":{"line":26,"column":2},"end":{"line":32,"column":3}},"line":26},"1":{"name":"ConfigValidationFailedError","decl":{"start":{"line":39,"column":2},"end":{"line":45,"column":3}},"loc":{"start":{"line":39,"column":2},"end":{"line":45,"column":3}},"line":39},"2":{"name":"parseConfig","decl":{"start":{"line":104,"column":15},"end":{"line":121,"column":4}},"loc":{"start":{"line":104,"column":15},"end":{"line":121,"column":4}},"line":104},"3":{"name":"validateConfig","decl":{"start":{"line":137,"column":18},"end":{"line":222,"column":4}},"loc":{"start":{"line":137,"column":18},"end":{"line":222,"column":4}},"line":137},"4":{"name":"parseAndValidate","decl":{"start":{"line":238,"column":20},"end":{"line":251,"column":4}},"loc":{"start":{"line":238,"column":20},"end":{"line":251,"column":4}},"line":238},"5":{"name":"stringifyConfig","decl":{"start":{"line":264,"column":19},"end":{"line":266,"column":4}},"loc":{"start":{"line":264,"column":19},"end":{"line":266,"column":4}},"line":264},"6":{"name":"mergeWithDefaults","decl":{"start":{"line":279,"column":21},"end":{"line":281,"column":4}},"loc":{"start":{"line":279,"column":21},"end":{"line":281,"column":4}},"line":279},"7":{"name":"extractMetadata","decl":{"start":{"line":296,"column":19},"end":{"line":305,"column":4}},"loc":{"start":{"line":296,"column":19},"end":{"line":305,"column":4}},"line":296},"8":{"name":"getDefaults","decl":{"start":{"line":312,"column":15},"end":{"line":314,"column":4}},"loc":{"start":{"line":312,"column":15},"end":{"line":314,"column":4}},"line":312},"9":{"name":"isOpenFangConfig","decl":{"start":{"line":322,"column":20},"end":{"line":325,"column":4}},"loc":{"start":{"line":322,"column":20},"end":{"line":325,"column":4}},"line":322},"10":{"name":"getNestedValue","decl":{"start":{"line":331,"column":0},"end":{"line":344,"column":1}},"loc":{"start":{"line":331,"column":0},"end":{"line":344,"column":1}},"line":331},"11":{"name":"deepMerge","decl":{"start":{"line":349,"column":0},"end":{"line":377,"column":1}},"loc":{"start":{"line":349,"column":0},"end":{"line":377,"column":1}},"line":349}},"f":{"0":0,"1":1,"2":3,"3":9,"4":2,"5":1,"6":1,"7":2,"8":0,"9":3,"10":80,"11":2}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\crypto-utils.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\crypto-utils.ts","all":false,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":26}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":51}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":58}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":36}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":18}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":42}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":44}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":22}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":59}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":41}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":46}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":43}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":36}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":15}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":46}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":37}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":55}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":48}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":32}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":5}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":67}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":36}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":82}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":45}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":55}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":81}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":32}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":20}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":25}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":48}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":40}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":64}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":22}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":36}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":52}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":10}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":30}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":13}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":10}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":31}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":4}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":51}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":5}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":11}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":37}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":10}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":26}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":4}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":69}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":20}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":1}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":29}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":30}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":16}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":27}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":36}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":56}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":48}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":28}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":8}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":29}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":4}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":10}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":51}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":32}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":1}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":30}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":27}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":16}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":20}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":36}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":48}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":57}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":8}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":33}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":4}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":35}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":45}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":59}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":30}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":1}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":63}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":56}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":1}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":74}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":30}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":17}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":17}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":38}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":26}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":22}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":1}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":66}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":36}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":37}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":65}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":47}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":30}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":46}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":14}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":1}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":66}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":36}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":37}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":65}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":47}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":30}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":46}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":14}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":1}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":67}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":81}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":63}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":18}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":36}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":45}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":3}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":16}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":1}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":39}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":19}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":1}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":39}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":9}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":16}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":27}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":40}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":33}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":1}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":39}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":27}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":15}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":50}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":36}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":1}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":53}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":32}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":16}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":1}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":46}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":10}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":36}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":43}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":48}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":1}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":76}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":50}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":17}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":3}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":46}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":10}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":33}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":35}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":24}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":23}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":1}}},"s":{"12":1,"13":1,"14":1,"19":1,"20":61,"22":59,"23":61,"24":1468,"25":1468,"26":59,"27":59,"32":1,"33":31,"35":29,"36":29,"37":31,"38":630,"39":630,"40":28,"41":28,"54":1,"59":13,"60":13,"61":13,"62":16,"63":0,"64":0,"65":16,"66":13,"71":13,"72":13,"73":13,"74":13,"75":13,"76":13,"77":13,"87":13,"88":13,"89":13,"90":13,"92":13,"95":13,"96":13,"97":13,"98":8,"99":8,"101":5,"102":5,"103":5,"104":5,"105":5,"106":5,"107":5,"108":5,"110":5,"111":5,"112":5,"113":5,"114":5,"115":5,"116":5,"117":5,"118":5,"119":5,"120":5,"121":5,"124":5,"126":5,"127":5,"142":1,"151":18,"152":18,"153":18,"154":18,"155":18,"156":18,"158":18,"159":18,"160":18,"161":18,"162":18,"164":18,"165":18,"166":18,"167":18,"168":18,"169":18,"178":13,"179":13,"180":13,"181":13,"182":13,"183":13,"184":13,"185":13,"186":13,"187":13,"189":12,"190":12,"198":1,"199":8,"200":8,"201":8,"209":1,"210":0,"211":0,"220":1,"221":3,"222":1,"223":1,"225":2,"226":3,"227":8,"228":8,"230":2,"231":2,"239":2,"240":2,"241":2,"242":2,"243":2,"246":2,"247":2,"248":2,"249":2,"257":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"265":0,"266":0,"274":1,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"287":1,"288":0,"289":0,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"328":1,"329":0,"330":0,"331":0,"336":1,"337":0,"338":0,"339":0,"340":0,"342":0,"347":1,"348":5,"349":1,"350":1,"352":4,"353":4,"354":4,"355":2,"356":1,"357":1,"359":5},"branchMap":{"0":{"type":"branch","line":20,"loc":{"start":{"line":20,"column":7},"end":{"line":28,"column":1}},"locations":[{"start":{"line":20,"column":7},"end":{"line":28,"column":1}}]},"1":{"type":"branch","line":21,"loc":{"start":{"line":21,"column":26},"end":{"line":21,"column":36}},"locations":[{"start":{"line":21,"column":26},"end":{"line":21,"column":36}}]},"2":{"type":"branch","line":21,"loc":{"start":{"line":21,"column":33},"end":{"line":24,"column":41}},"locations":[{"start":{"line":21,"column":33},"end":{"line":24,"column":41}}]},"3":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":41},"end":{"line":26,"column":3}},"locations":[{"start":{"line":24,"column":41},"end":{"line":26,"column":3}}]},"4":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":2},"end":{"line":28,"column":1}},"locations":[{"start":{"line":26,"column":2},"end":{"line":28,"column":1}}]},"5":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":7},"end":{"line":42,"column":1}},"locations":[{"start":{"line":33,"column":7},"end":{"line":42,"column":1}}]},"6":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":15},"end":{"line":34,"column":41}},"locations":[{"start":{"line":34,"column":15},"end":{"line":34,"column":41}}]},"7":{"type":"branch","line":34,"loc":{"start":{"line":34,"column":39},"end":{"line":38,"column":42}},"locations":[{"start":{"line":34,"column":39},"end":{"line":38,"column":42}}]},"8":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":42},"end":{"line":40,"column":3}},"locations":[{"start":{"line":38,"column":42},"end":{"line":40,"column":3}}]},"9":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":2},"end":{"line":42,"column":1}},"locations":[{"start":{"line":40,"column":2},"end":{"line":42,"column":1}}]},"10":{"type":"branch","line":60,"loc":{"start":{"line":60,"column":0},"end":{"line":67,"column":1}},"locations":[{"start":{"line":60,"column":0},"end":{"line":67,"column":1}}]},"11":{"type":"branch","line":62,"loc":{"start":{"line":62,"column":54},"end":{"line":66,"column":3}},"locations":[{"start":{"line":62,"column":54},"end":{"line":66,"column":3}}]},"12":{"type":"branch","line":63,"loc":{"start":{"line":63,"column":47},"end":{"line":65,"column":5}},"locations":[{"start":{"line":63,"column":47},"end":{"line":65,"column":5}}]},"13":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":0},"end":{"line":78,"column":1}},"locations":[{"start":{"line":72,"column":0},"end":{"line":78,"column":1}}]},"14":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":0},"end":{"line":128,"column":1}},"locations":[{"start":{"line":88,"column":0},"end":{"line":128,"column":1}}]},"15":{"type":"branch","line":98,"loc":{"start":{"line":98,"column":6},"end":{"line":98,"column":63}},"locations":[{"start":{"line":98,"column":6},"end":{"line":98,"column":63}}]},"16":{"type":"branch","line":98,"loc":{"start":{"line":98,"column":63},"end":{"line":100,"column":3}},"locations":[{"start":{"line":98,"column":63},"end":{"line":100,"column":3}}]},"17":{"type":"branch","line":100,"loc":{"start":{"line":100,"column":2},"end":{"line":128,"column":1}},"locations":[{"start":{"line":100,"column":2},"end":{"line":128,"column":1}}]},"18":{"type":"branch","line":152,"loc":{"start":{"line":152,"column":0},"end":{"line":170,"column":1}},"locations":[{"start":{"line":152,"column":0},"end":{"line":170,"column":1}}]},"19":{"type":"branch","line":179,"loc":{"start":{"line":179,"column":0},"end":{"line":191,"column":1}},"locations":[{"start":{"line":179,"column":0},"end":{"line":191,"column":1}}]},"20":{"type":"branch","line":188,"loc":{"start":{"line":188,"column":2},"end":{"line":191,"column":1}},"locations":[{"start":{"line":188,"column":2},"end":{"line":191,"column":1}}]},"21":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":7},"end":{"line":202,"column":1}},"locations":[{"start":{"line":199,"column":7},"end":{"line":202,"column":1}}]},"22":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":7},"end":{"line":232,"column":1}},"locations":[{"start":{"line":221,"column":7},"end":{"line":232,"column":1}}]},"23":{"type":"branch","line":222,"loc":{"start":{"line":222,"column":29},"end":{"line":224,"column":3}},"locations":[{"start":{"line":222,"column":29},"end":{"line":224,"column":3}}]},"24":{"type":"branch","line":224,"loc":{"start":{"line":224,"column":2},"end":{"line":227,"column":37}},"locations":[{"start":{"line":224,"column":2},"end":{"line":227,"column":37}}]},"25":{"type":"branch","line":227,"loc":{"start":{"line":227,"column":37},"end":{"line":229,"column":3}},"locations":[{"start":{"line":227,"column":37},"end":{"line":229,"column":3}}]},"26":{"type":"branch","line":229,"loc":{"start":{"line":229,"column":2},"end":{"line":232,"column":1}},"locations":[{"start":{"line":229,"column":2},"end":{"line":232,"column":1}}]},"27":{"type":"branch","line":240,"loc":{"start":{"line":240,"column":0},"end":{"line":250,"column":1}},"locations":[{"start":{"line":240,"column":0},"end":{"line":250,"column":1}}]},"28":{"type":"branch","line":248,"loc":{"start":{"line":248,"column":9},"end":{"line":248,"column":45}},"locations":[{"start":{"line":248,"column":9},"end":{"line":248,"column":45}}]},"29":{"type":"branch","line":299,"loc":{"start":{"line":299,"column":0},"end":{"line":305,"column":1}},"locations":[{"start":{"line":299,"column":0},"end":{"line":305,"column":1}}]},"30":{"type":"branch","line":314,"loc":{"start":{"line":314,"column":0},"end":{"line":320,"column":1}},"locations":[{"start":{"line":314,"column":0},"end":{"line":320,"column":1}}]},"31":{"type":"branch","line":348,"loc":{"start":{"line":348,"column":7},"end":{"line":360,"column":1}},"locations":[{"start":{"line":348,"column":7},"end":{"line":360,"column":1}}]},"32":{"type":"branch","line":349,"loc":{"start":{"line":349,"column":49},"end":{"line":351,"column":3}},"locations":[{"start":{"line":349,"column":49},"end":{"line":351,"column":3}}]},"33":{"type":"branch","line":351,"loc":{"start":{"line":351,"column":2},"end":{"line":355,"column":33}},"locations":[{"start":{"line":351,"column":2},"end":{"line":355,"column":33}}]},"34":{"type":"branch","line":355,"loc":{"start":{"line":355,"column":22},"end":{"line":356,"column":35}},"locations":[{"start":{"line":355,"column":22},"end":{"line":356,"column":35}}]},"35":{"type":"branch","line":356,"loc":{"start":{"line":356,"column":24},"end":{"line":357,"column":24}},"locations":[{"start":{"line":356,"column":24},"end":{"line":357,"column":24}}]},"36":{"type":"branch","line":357,"loc":{"start":{"line":357,"column":20},"end":{"line":358,"column":23}},"locations":[{"start":{"line":357,"column":20},"end":{"line":358,"column":23}}]}},"b":{"0":[61],"1":[2],"2":[59],"3":[1468],"4":[59],"5":[31],"6":[2],"7":[29],"8":[630],"9":[28],"10":[13],"11":[16],"12":[0],"13":[13],"14":[13],"15":[8],"16":[8],"17":[5],"18":[18],"19":[13],"20":[12],"21":[8],"22":[3],"23":[1],"24":[2],"25":[8],"26":[2],"27":[2],"28":[64],"29":[1],"30":[1],"31":[5],"32":[1],"33":[4],"34":[2],"35":[1],"36":[1]},"fnMap":{"0":{"name":"arrayToBase64","decl":{"start":{"line":20,"column":7},"end":{"line":28,"column":1}},"loc":{"start":{"line":20,"column":7},"end":{"line":28,"column":1}},"line":20},"1":{"name":"base64ToArray","decl":{"start":{"line":33,"column":7},"end":{"line":42,"column":1}},"loc":{"start":{"line":33,"column":7},"end":{"line":42,"column":1}},"line":33},"2":{"name":"cleanupExpiredKeys","decl":{"start":{"line":60,"column":0},"end":{"line":67,"column":1}},"loc":{"start":{"line":60,"column":0},"end":{"line":67,"column":1}},"line":60},"3":{"name":"getCacheKey","decl":{"start":{"line":72,"column":0},"end":{"line":78,"column":1}},"loc":{"start":{"line":72,"column":0},"end":{"line":78,"column":1}},"line":72},"4":{"name":"deriveKey","decl":{"start":{"line":88,"column":0},"end":{"line":128,"column":1}},"loc":{"start":{"line":88,"column":0},"end":{"line":128,"column":1}},"line":88},"5":{"name":"encrypt","decl":{"start":{"line":152,"column":0},"end":{"line":170,"column":1}},"loc":{"start":{"line":152,"column":0},"end":{"line":170,"column":1}},"line":152},"6":{"name":"decrypt","decl":{"start":{"line":179,"column":0},"end":{"line":191,"column":1}},"loc":{"start":{"line":179,"column":0},"end":{"line":191,"column":1}},"line":179},"7":{"name":"generateMasterKey","decl":{"start":{"line":199,"column":7},"end":{"line":202,"column":1}},"loc":{"start":{"line":199,"column":7},"end":{"line":202,"column":1}},"line":199},"8":{"name":"generateSalt","decl":{"start":{"line":210,"column":7},"end":{"line":212,"column":1}},"loc":{"start":{"line":210,"column":7},"end":{"line":212,"column":1}},"line":210},"9":{"name":"constantTimeEqual","decl":{"start":{"line":221,"column":7},"end":{"line":232,"column":1}},"loc":{"start":{"line":221,"column":7},"end":{"line":232,"column":1}},"line":221},"10":{"name":"hashSha256","decl":{"start":{"line":240,"column":0},"end":{"line":250,"column":1}},"loc":{"start":{"line":240,"column":0},"end":{"line":250,"column":1}},"line":240},"11":{"name":"hashSha512","decl":{"start":{"line":258,"column":0},"end":{"line":267,"column":1}},"loc":{"start":{"line":258,"column":0},"end":{"line":267,"column":1}},"line":258},"12":{"name":"generateRandomString","decl":{"start":{"line":275,"column":7},"end":{"line":283,"column":1}},"loc":{"start":{"line":275,"column":7},"end":{"line":283,"column":1}},"line":275},"13":{"name":"clearKeyCache","decl":{"start":{"line":288,"column":7},"end":{"line":290,"column":1}},"loc":{"start":{"line":288,"column":7},"end":{"line":290,"column":1}},"line":288},"14":{"name":"encryptObject","decl":{"start":{"line":299,"column":0},"end":{"line":305,"column":1}},"loc":{"start":{"line":299,"column":0},"end":{"line":305,"column":1}},"line":299},"15":{"name":"decryptObject","decl":{"start":{"line":314,"column":0},"end":{"line":320,"column":1}},"loc":{"start":{"line":314,"column":0},"end":{"line":320,"column":1}},"line":314},"16":{"name":"secureWipe","decl":{"start":{"line":329,"column":7},"end":{"line":332,"column":1}},"loc":{"start":{"line":329,"column":7},"end":{"line":332,"column":1}},"line":329},"17":{"name":"isCryptoAvailable","decl":{"start":{"line":337,"column":7},"end":{"line":343,"column":1}},"loc":{"start":{"line":337,"column":7},"end":{"line":343,"column":1}},"line":337},"18":{"name":"isValidEncryptedData","decl":{"start":{"line":348,"column":7},"end":{"line":360,"column":1}},"loc":{"start":{"line":348,"column":7},"end":{"line":360,"column":1}},"line":348}},"f":{"0":61,"1":31,"2":13,"3":13,"4":13,"5":18,"6":13,"7":8,"8":0,"9":3,"10":2,"11":0,"12":0,"13":0,"14":1,"15":1,"16":0,"17":0,"18":5}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\encrypted-chat-storage.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\encrypted-chat-storage.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":40}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":52}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":48}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":37}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":26}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":43}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":34}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":56}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":67}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":20}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":55}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":48}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":56}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":65}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":1}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":59}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":33}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":27}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":78}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":25}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":19}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":49}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":45}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":40}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":23}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":71}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":7}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":33}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":66}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":77}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":49}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":66}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":65}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":67}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":74}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":16}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":3}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":76}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":7}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":42}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":39}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":58}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":104}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":5}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":19}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":69}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":3}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":1}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":82}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":53}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":11}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":7}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":45}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":27}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":43}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":33}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":31}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":8}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":47}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":6}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":62}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":47}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":67}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":86}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":19}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":81}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":1}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":70}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":55}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":18}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":61}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":49}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":73}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":16}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":55}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":75}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":53}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":47}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":69}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":16}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":45}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":71}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":51}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":67}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":87}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":25}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":19}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":81}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":14}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":1}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":57}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":7}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":59}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":52}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":47}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":19}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":64}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":19}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":78}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":16}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":1}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":64}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":7}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":55}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":18}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":48}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":61}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":24}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":32}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":31}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":29}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":16}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":6}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":44}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":19}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":66}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":16}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":3}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":1}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":44}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":21}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":24}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":18}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":7}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":49}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":47}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":47}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":5}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":44}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":53}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":16}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":49}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":54}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":43}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":36}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":8}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":48}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":38}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":12}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":77}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":5}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":72}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":19}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":66}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":16}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":3}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":1}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":68}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":53}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":16}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":17}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":7}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":61}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":59}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":11}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":17}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":3}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":1}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":50}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":4}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":53}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":24}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":15}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":9}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":63}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":66}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":54}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":47}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":13}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":5}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":3}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":10}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":14}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":52}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":22}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":54}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":4}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":1}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":60}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":7}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":52}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":52}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":47}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":25}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":19}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":20}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":39}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":57}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":48}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":56}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":43}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":78}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":19}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":72}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":16}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":3}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":1}}},"s":{"0":0,"25":0,"26":0,"27":0,"28":0,"31":0,"55":0,"56":0,"62":0,"64":0,"65":0,"66":0,"67":0,"70":0,"73":0,"76":0,"77":0,"79":0,"80":0,"81":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"103":0,"104":0,"110":0,"111":0,"113":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"172":0,"173":0,"176":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"197":0,"200":0,"201":0,"202":0,"203":0,"206":0,"207":0,"208":0,"209":0,"212":0,"213":0,"214":0,"215":0,"216":0,"218":0,"219":0,"222":0,"223":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"236":0,"237":0,"239":0,"240":0,"243":0,"244":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"301":0,"302":0,"303":0,"305":0,"306":0,"307":0,"309":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"321":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"333":0,"334":0,"335":0,"336":0,"337":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"350":0,"355":0,"356":0,"357":0,"358":0,"360":0,"361":0,"362":0,"363":0,"366":0,"367":0,"368":0,"370":0,"371":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"385":0,"386":0,"388":0,"391":0,"392":0,"393":0,"394":0,"395":0,"398":0,"399":0,"400":0,"401":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":11615},"end":{"line":412,"column":1}},"locations":[{"start":{"line":1,"column":11615},"end":{"line":412,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":11615},"end":{"line":412,"column":1}},"loc":{"start":{"line":1,"column":11615},"end":{"line":412,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\error-handling.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\error-handling.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":30}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":13}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":21}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":25}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":23}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":25}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":33}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":25}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":32}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":2}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":16}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":15}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":36}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":40}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":25}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":8}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":62}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":34}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":6}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":61}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":18}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":54}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":53}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":10}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":7}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":82}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":6}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":36}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":61}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":54}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":52}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":6}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":43}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":57}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":6}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":29}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":64}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":6}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":65}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":84}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":6}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":65}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":84}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":1}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":53}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":64}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":31}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":47}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":54}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":38}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":9}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":58}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":17}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":17}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":13}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":13}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":40}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":16}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":30}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":78}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":62}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":71}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":35}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":27}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":86}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":5}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":32}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":28}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":54}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":22}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":34}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":34}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":32}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":7}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":18}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":1}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":31}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":21}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":19}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":24}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":13}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":33}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":41}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":41}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":26}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":70}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":52}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":22}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":22}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":38}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":69}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":59}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":56}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":6}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":30}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":28}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":24}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":32}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":67}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":21}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":63}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":55}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":6}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":30}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":24}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":21}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":24}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":66}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":21}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":52}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":50}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":6}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":30}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":28}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":21}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":31}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":45}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":21}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":54}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":61}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":6}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":30}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":24}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":24}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":27}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":68}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":21}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":55}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":50}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":6}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":29}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":24}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":73}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":21}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":52}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":65}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":6}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":3}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":30}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":17}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":13}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":13}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":10}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":12}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":99}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":48}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":18}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":26}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":28}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":4}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":32}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":1}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":35}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":15}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":14}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":13}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":29}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":72}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":5}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":1}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":37}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":33}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":13}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":13}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":48}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":62}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":60}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":5}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":78}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":4}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":1}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":48}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":30}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":1}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":42}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":26}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":1}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":36}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":26}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":1}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":53}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":30}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":1}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":50}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":43}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":1}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":55}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":43}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":1}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":47}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":36}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":1}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":77}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":50}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":1}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":77}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":50}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":1}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":72}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":36}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":1}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":46}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":63}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":1}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":50}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":44}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":88}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":1}}},"s":{"0":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"65":0,"66":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"106":0,"111":0,"113":0,"114":0,"115":0,"116":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"129":0,"136":0,"137":0,"138":0,"143":0,"144":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"159":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"259":0,"260":0,"261":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"296":0,"297":0,"298":0,"303":0,"304":0,"305":0,"310":0,"311":0,"312":0,"317":0,"318":0,"319":0,"324":0,"325":0,"326":0,"331":0,"332":0,"333":0,"338":0,"339":0,"340":0,"345":0,"346":0,"347":0,"352":0,"353":0,"354":0,"359":0,"360":0,"361":0,"366":0,"367":0,"368":0,"373":0,"374":0,"375":0,"376":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":9765},"end":{"line":391,"column":1}},"locations":[{"start":{"line":1,"column":9765},"end":{"line":391,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":9765},"end":{"line":391,"column":1}},"loc":{"start":{"line":1,"column":9765},"end":{"line":391,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\error-types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\error-types.ts","all":true,"statementMap":{"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":40}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":15}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":24}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":21}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":20}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":31}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":34}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":36}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":21}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":6}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":24}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":21}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":38}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":100}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":20}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":66}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":62}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":52}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":6}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":22}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":4}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":60}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":21}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":35}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":122}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":20}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":58}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":56}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":69}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":6}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":22}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":4}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":15}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":12}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":22}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":22}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":26}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":20}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":6}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":21}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":21}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":35}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":90}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":20}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":65}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":71}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":55}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":6}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":4}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":76}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":21}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":33}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":78}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":60}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":77}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":61}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":6}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":22}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":4}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":15}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":12}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":18}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":26}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":33}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":13}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":23}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":6}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":27}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":31}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":80}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":63}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":71}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":72}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":6}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":23}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":3}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":15}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":16}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":24}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":18}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":26}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":6}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":23}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":29}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":98}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":58}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":49}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":54}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":6}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":22}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":4}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":3}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":15}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":12}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":20}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":26}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":22}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":26}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":6}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":27}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":20}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":27}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":78}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":20}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":53}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":63}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":64}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":6}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":22}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":4}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":3}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":71}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":27}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":23}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":31}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":75}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":20}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":55}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":64}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":64}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":6}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":22}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":15}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":12}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":30}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":28}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":12}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":28}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":12}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":24}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":6}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":23}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":21}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":26}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":98}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":20}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":58}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":55}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":65}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":6}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":22}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":4}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":75}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":23}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":23}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":26}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":81}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":20}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":68}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":50}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":6}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":22}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":4}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":25}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":30}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":25}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":30}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":6}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":23}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":33}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":84}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":20}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":62}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":66}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":66}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":6}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":22}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":4}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":15}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":18}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":22}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":23}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":26}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":22}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":6}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":24}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":21}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":29}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":95}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":20}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":55}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":73}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":54}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":6}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":22}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":4}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":83}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":23}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":35}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":81}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":20}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":61}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":67}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":55}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":6}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":22}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":4}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":3}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":67}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":23}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":23}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":39}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":81}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":20}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":62}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":58}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":63}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":6}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":22}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":4}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":2}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":88}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":47}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":11}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":28}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":61}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":22}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":41}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":39}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":65}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":45}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":44}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":7}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":5}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":3}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":14}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":1}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":57}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":38}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":16}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":39}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":12}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":72}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":33}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":33}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":27}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":46}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":46}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":43}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":24}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":39}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":43}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":28}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":61}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":6}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":10}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":70}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":23}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":23}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":31}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":86}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":44}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":41}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":22}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":22}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":20}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":49}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":66}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":64}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":6}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":26}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":59}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":4}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":1}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":81}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":12}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":17}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":50}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":50}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":60}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":4}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":9}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":16}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":44}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":44}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":54}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":4}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":15}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":19}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":50}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":50}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":60}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":4}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":15}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":24}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":50}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":50}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":60}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":4}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":12}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":18}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":48}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":48}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":58}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":4}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":11}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":19}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":44}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":44}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":54}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":4}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":11}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":17}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":46}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":46}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":56}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":4}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":11}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":21}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":46}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":46}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":56}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":4}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":11}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":26}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":44}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":44}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":54}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":4}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":2}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":98}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":8}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":75}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":16}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":4}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":11}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":86}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":16}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":4}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":9}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":86}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":16}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":4}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":13}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":74}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":16}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":4}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":2}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":90}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":10}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":23}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":39}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":43}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":22}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":4}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":1}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":85}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":63}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":21}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":3}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":32}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":1}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":66}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":17}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":28}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":34}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":34}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":45}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":7}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":28}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":32}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":4}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":31}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":65}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":3}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":39}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":38}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":46}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":50}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":7}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":3}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":26}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":1}}},"s":{"57":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"344":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"386":0,"387":0,"388":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"515":0,"516":0,"517":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"526":0,"527":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":15583},"end":{"line":528,"column":1}},"locations":[{"start":{"line":1,"column":15583},"end":{"line":528,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":15583},"end":{"line":528,"column":1}},"loc":{"start":{"line":1,"column":15583},"end":{"line":528,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\error-utils.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\error-utils.ts","all":true,"statementMap":{"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":55}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":47}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":42}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":59}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":57}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":3}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":25}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":1}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":53}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":30}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":1}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":65}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":52}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":21}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":19}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":77}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":28}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":84}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":5}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":35}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":18}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":23}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":54}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":27}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":7}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":22}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":26}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":60}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":81}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":5}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":1}}},"s":{"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"22":0,"23":0,"24":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1798},"end":{"line":82,"column":1}},"locations":[{"start":{"line":1,"column":1798},"end":{"line":82,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1798},"end":{"line":82,"column":1}},"loc":{"start":{"line":1,"column":1798},"end":{"line":82,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-api.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-api.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":84}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":45}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":69}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":34}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":4}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":69}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":34}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":73}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":39}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":66}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":47}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":39}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":47}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":6}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":48}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":48}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":66}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":88}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":71}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":54}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":42}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":51}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":56}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":56}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":81}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":55}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":41}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":34}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":7}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":4}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":116}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":54}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":86}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":48}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":76}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":52}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":21}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":35}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":41}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":7}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":25}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":23}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":25}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":23}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":78}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":55}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":13}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":30}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":4}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":79}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":9}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":50}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":21}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":35}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":42}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":7}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":14}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":109}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":24}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":24}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":8}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":78}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":55}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":21}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":35}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":52}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":74}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":7}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":50}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":5}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":4}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":77}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":9}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":41}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":24}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":89}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":70}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":78}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":14}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":22}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":29}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":29}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":25}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":25}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":33}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":46}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":59}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":44}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":52}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":58}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":40}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":48}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":57}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":32}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":29}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":30}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":9}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":35}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":57}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":7}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":16}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":107}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":37}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":56}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":41}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":72}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":45}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":80}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":28}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":44}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":35}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":54}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":20}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":6}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":55}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":73}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":39}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":4}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":83}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":45}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":4}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":67}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":47}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":4}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":81}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":20}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":54}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":4}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":86}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":48}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":4}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":75}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":41}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":4}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":85}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":47}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":4}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":71}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":51}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":4}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":83}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":20}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":56}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":4}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":88}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":50}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":4}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":78}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":55}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":4}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":81}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":9}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":56}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":21}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":35}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":52}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":46}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":37}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":4}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":74}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":79}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":55}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":4}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":95}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":57}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":4}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":141}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":69}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":4}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":67}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":6}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":38}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":4}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":79}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":6}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":46}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":4}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":152}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":68}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":9}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":42}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":54}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":68}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":66}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":19}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":77}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":16}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":5}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":4}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":138}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":60}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":4}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":154}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":91}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":4}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":117}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":72}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":4}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":194}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":41}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":61}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":64}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":61}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":4}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":133}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":42}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":4}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":129}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":48}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":4}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":153}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":64}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":4}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":159}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":70}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":4}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":138}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":6}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":41}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":61}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":64}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":71}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":4}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":127}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":82}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":4}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":73}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":45}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":53}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":4}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":84}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":45}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":57}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":4}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":104}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":51}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":4}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":114}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":6}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":41}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":61}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":64}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":51}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":4}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":87}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":6}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":54}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":4}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":68}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":6}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":48}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":4}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":110}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":57}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":4}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":93}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":6}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":41}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":61}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":64}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":73}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":4}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":134}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":41}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":4}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":80}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":6}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":47}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":4}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":71}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":31}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":51}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":4}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":83}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":31}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":56}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":4}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":103}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":50}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":4}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":135}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":41}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":61}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":64}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":53}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":4}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":92}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":6}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":54}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":4}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":125}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":9}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":56}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":21}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":35}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":51}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":41}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":7}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":14}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":17}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":49}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":42}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":47}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":10}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":8}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":5}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":4}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":101}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":9}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":53}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":13}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":72}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":5}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":4}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":88}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":6}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":53}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":51}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":4}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":151}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":87}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":4}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":102}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":39}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":4}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":112}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":39}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":4}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":178}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":41}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":10}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":15}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":35}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":23}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":43}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":7}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":4}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":1}}},"s":{"0":1,"37":1,"38":1,"42":1,"43":0,"44":0,"46":1,"47":0,"48":0,"52":1,"53":0,"54":0,"56":1,"71":0,"73":0,"74":0,"75":0,"76":0,"77":0,"80":0,"81":0,"82":0,"83":0,"84":0,"87":0,"88":0,"89":0,"92":0,"93":0,"94":0,"95":0,"97":0,"99":0,"100":0,"101":0,"102":0,"104":1,"105":0,"106":0,"108":1,"109":0,"110":0,"114":1,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":1,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"138":1,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"154":1,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"168":1,"169":0,"170":0,"174":0,"177":0,"178":0,"179":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":1,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"235":1,"236":0,"237":0,"239":1,"240":0,"241":0,"243":1,"249":0,"250":0,"251":0,"253":1,"259":0,"260":0,"261":0,"263":1,"264":0,"265":0,"269":1,"270":0,"271":0,"273":1,"274":0,"275":0,"277":1,"282":0,"283":0,"284":0,"286":1,"290":0,"291":0,"292":0,"294":1,"295":0,"296":0,"298":1,"299":0,"300":0,"304":1,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":1,"323":0,"324":0,"325":0,"327":1,"328":0,"329":0,"331":1,"332":0,"333":0,"337":1,"351":0,"352":0,"353":0,"355":1,"371":0,"372":0,"373":0,"375":1,"376":0,"377":0,"378":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"390":1,"391":0,"392":0,"394":1,"395":0,"396":0,"398":1,"399":0,"400":0,"402":1,"403":0,"404":0,"405":0,"406":0,"407":0,"411":1,"412":0,"413":0,"415":1,"416":0,"417":0,"419":1,"420":0,"421":0,"423":1,"424":0,"425":0,"427":1,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"444":1,"445":0,"446":0,"448":1,"457":0,"458":0,"459":0,"461":1,"470":0,"471":0,"472":0,"474":1,"475":0,"476":0,"480":1,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"496":1,"504":0,"505":0,"506":0,"508":1,"515":0,"516":0,"517":0,"519":1,"520":0,"521":0,"523":1,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"543":1,"544":0,"545":0,"547":1,"553":0,"554":0,"555":0,"557":1,"564":0,"565":0,"566":0,"568":1,"574":0,"575":0,"576":0,"578":1,"579":0,"580":0,"584":1,"585":0,"586":0,"587":0,"588":0,"589":0,"591":1,"596":0,"597":0,"598":0,"602":1,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"615":0,"616":0,"617":0,"618":0,"620":1,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"630":1,"645":0,"646":0,"647":0,"648":0,"650":1,"651":0,"652":0,"656":1,"657":0,"658":0,"660":1,"661":0,"662":0,"664":1,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":1},"branchMap":{"0":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":7},"end":{"line":674,"column":1}},"locations":[{"start":{"line":38,"column":7},"end":{"line":674,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"installApiMethods","decl":{"start":{"line":38,"column":7},"end":{"line":674,"column":1}},"loc":{"start":{"line":38,"column":7},"end":{"line":674,"column":1}},"line":38},"1":{"name":"proto.health","decl":{"start":{"line":43,"column":17},"end":{"line":45,"column":4}},"loc":{"start":{"line":43,"column":17},"end":{"line":45,"column":4}},"line":43},"2":{"name":"proto.status","decl":{"start":{"line":47,"column":17},"end":{"line":49,"column":4}},"loc":{"start":{"line":47,"column":17},"end":{"line":49,"column":4}},"line":47},"3":{"name":"proto.listClones","decl":{"start":{"line":53,"column":21},"end":{"line":55,"column":4}},"loc":{"start":{"line":53,"column":21},"end":{"line":55,"column":4}},"line":53},"4":{"name":"proto.createClone","decl":{"start":{"line":57,"column":22},"end":{"line":103,"column":4}},"loc":{"start":{"line":57,"column":22},"end":{"line":103,"column":4}},"line":57},"5":{"name":"proto.updateClone","decl":{"start":{"line":105,"column":22},"end":{"line":107,"column":4}},"loc":{"start":{"line":105,"column":22},"end":{"line":107,"column":4}},"line":105},"6":{"name":"proto.deleteClone","decl":{"start":{"line":109,"column":22},"end":{"line":111,"column":4}},"loc":{"start":{"line":109,"column":22},"end":{"line":111,"column":4}},"line":109},"7":{"name":"proto.getUsageStats","decl":{"start":{"line":115,"column":24},"end":{"line":129,"column":4}},"loc":{"start":{"line":115,"column":24},"end":{"line":129,"column":4}},"line":115},"8":{"name":"proto.getSessionStats","decl":{"start":{"line":131,"column":26},"end":{"line":137,"column":4}},"loc":{"start":{"line":131,"column":26},"end":{"line":137,"column":4}},"line":131},"9":{"name":"proto.getWorkspaceInfo","decl":{"start":{"line":139,"column":27},"end":{"line":153,"column":4}},"loc":{"start":{"line":139,"column":27},"end":{"line":153,"column":4}},"line":139},"10":{"name":"proto.getPluginStatus","decl":{"start":{"line":155,"column":26},"end":{"line":165,"column":4}},"loc":{"start":{"line":155,"column":26},"end":{"line":165,"column":4}},"line":155},"11":{"name":"proto.getQuickConfig","decl":{"start":{"line":169,"column":25},"end":{"line":209,"column":4}},"loc":{"start":{"line":169,"column":25},"end":{"line":209,"column":4}},"line":169},"12":{"name":"proto.saveQuickConfig","decl":{"start":{"line":211,"column":26},"end":{"line":232,"column":4}},"loc":{"start":{"line":211,"column":26},"end":{"line":232,"column":4}},"line":211},"13":{"name":"proto.listSkills","decl":{"start":{"line":236,"column":21},"end":{"line":238,"column":4}},"loc":{"start":{"line":236,"column":21},"end":{"line":238,"column":4}},"line":236},"14":{"name":"proto.getSkill","decl":{"start":{"line":240,"column":19},"end":{"line":242,"column":4}},"loc":{"start":{"line":240,"column":19},"end":{"line":242,"column":4}},"line":240},"15":{"name":"proto.createSkill","decl":{"start":{"line":244,"column":22},"end":{"line":252,"column":4}},"loc":{"start":{"line":244,"column":22},"end":{"line":252,"column":4}},"line":244},"16":{"name":"proto.updateSkill","decl":{"start":{"line":254,"column":22},"end":{"line":262,"column":4}},"loc":{"start":{"line":254,"column":22},"end":{"line":262,"column":4}},"line":254},"17":{"name":"proto.deleteSkill","decl":{"start":{"line":264,"column":22},"end":{"line":266,"column":4}},"loc":{"start":{"line":264,"column":22},"end":{"line":266,"column":4}},"line":264},"18":{"name":"proto.listChannels","decl":{"start":{"line":270,"column":23},"end":{"line":272,"column":4}},"loc":{"start":{"line":270,"column":23},"end":{"line":272,"column":4}},"line":270},"19":{"name":"proto.getChannel","decl":{"start":{"line":274,"column":21},"end":{"line":276,"column":4}},"loc":{"start":{"line":274,"column":21},"end":{"line":276,"column":4}},"line":274},"20":{"name":"proto.createChannel","decl":{"start":{"line":278,"column":24},"end":{"line":285,"column":4}},"loc":{"start":{"line":278,"column":24},"end":{"line":285,"column":4}},"line":278},"21":{"name":"proto.updateChannel","decl":{"start":{"line":287,"column":24},"end":{"line":293,"column":4}},"loc":{"start":{"line":287,"column":24},"end":{"line":293,"column":4}},"line":287},"22":{"name":"proto.deleteChannel","decl":{"start":{"line":295,"column":24},"end":{"line":297,"column":4}},"loc":{"start":{"line":295,"column":24},"end":{"line":297,"column":4}},"line":295},"23":{"name":"proto.getFeishuStatus","decl":{"start":{"line":299,"column":26},"end":{"line":301,"column":4}},"loc":{"start":{"line":299,"column":26},"end":{"line":301,"column":4}},"line":299},"24":{"name":"proto.listScheduledTasks","decl":{"start":{"line":305,"column":29},"end":{"line":315,"column":4}},"loc":{"start":{"line":305,"column":29},"end":{"line":315,"column":4}},"line":305},"25":{"name":"proto.createScheduledTask","decl":{"start":{"line":317,"column":30},"end":{"line":326,"column":4}},"loc":{"start":{"line":317,"column":30},"end":{"line":326,"column":4}},"line":317},"26":{"name":"proto.deleteScheduledTask","decl":{"start":{"line":328,"column":30},"end":{"line":330,"column":4}},"loc":{"start":{"line":328,"column":30},"end":{"line":330,"column":4}},"line":328},"27":{"name":"proto.toggleScheduledTask","decl":{"start":{"line":332,"column":30},"end":{"line":334,"column":4}},"loc":{"start":{"line":332,"column":30},"end":{"line":334,"column":4}},"line":332},"28":{"name":"proto.listHands","decl":{"start":{"line":338,"column":20},"end":{"line":354,"column":4}},"loc":{"start":{"line":338,"column":20},"end":{"line":354,"column":4}},"line":338},"29":{"name":"proto.getHand","decl":{"start":{"line":356,"column":18},"end":{"line":374,"column":4}},"loc":{"start":{"line":356,"column":18},"end":{"line":374,"column":4}},"line":356},"30":{"name":"proto.triggerHand","decl":{"start":{"line":376,"column":22},"end":{"line":389,"column":4}},"loc":{"start":{"line":376,"column":22},"end":{"line":389,"column":4}},"line":376},"31":{"name":"proto.getHandStatus","decl":{"start":{"line":391,"column":24},"end":{"line":393,"column":4}},"loc":{"start":{"line":391,"column":24},"end":{"line":393,"column":4}},"line":391},"32":{"name":"proto.approveHand","decl":{"start":{"line":395,"column":22},"end":{"line":397,"column":4}},"loc":{"start":{"line":395,"column":22},"end":{"line":397,"column":4}},"line":395},"33":{"name":"proto.cancelHand","decl":{"start":{"line":399,"column":21},"end":{"line":401,"column":4}},"loc":{"start":{"line":399,"column":21},"end":{"line":401,"column":4}},"line":399},"34":{"name":"proto.listHandRuns","decl":{"start":{"line":403,"column":23},"end":{"line":408,"column":4}},"loc":{"start":{"line":403,"column":23},"end":{"line":408,"column":4}},"line":403},"35":{"name":"proto.listWorkflows","decl":{"start":{"line":412,"column":24},"end":{"line":414,"column":4}},"loc":{"start":{"line":412,"column":24},"end":{"line":414,"column":4}},"line":412},"36":{"name":"proto.getWorkflow","decl":{"start":{"line":416,"column":22},"end":{"line":418,"column":4}},"loc":{"start":{"line":416,"column":22},"end":{"line":418,"column":4}},"line":416},"37":{"name":"proto.executeWorkflow","decl":{"start":{"line":420,"column":26},"end":{"line":422,"column":4}},"loc":{"start":{"line":420,"column":26},"end":{"line":422,"column":4}},"line":420},"38":{"name":"proto.getWorkflowRun","decl":{"start":{"line":424,"column":25},"end":{"line":426,"column":4}},"loc":{"start":{"line":424,"column":25},"end":{"line":426,"column":4}},"line":424},"39":{"name":"proto.listWorkflowRuns","decl":{"start":{"line":428,"column":27},"end":{"line":443,"column":4}},"loc":{"start":{"line":428,"column":27},"end":{"line":443,"column":4}},"line":428},"40":{"name":"proto.cancelWorkflow","decl":{"start":{"line":445,"column":25},"end":{"line":447,"column":4}},"loc":{"start":{"line":445,"column":25},"end":{"line":447,"column":4}},"line":445},"41":{"name":"proto.createWorkflow","decl":{"start":{"line":449,"column":25},"end":{"line":460,"column":4}},"loc":{"start":{"line":449,"column":25},"end":{"line":460,"column":4}},"line":449},"42":{"name":"proto.updateWorkflow","decl":{"start":{"line":462,"column":25},"end":{"line":473,"column":4}},"loc":{"start":{"line":462,"column":25},"end":{"line":473,"column":4}},"line":462},"43":{"name":"proto.deleteWorkflow","decl":{"start":{"line":475,"column":25},"end":{"line":477,"column":4}},"loc":{"start":{"line":475,"column":25},"end":{"line":477,"column":4}},"line":475},"44":{"name":"proto.listSessions","decl":{"start":{"line":481,"column":23},"end":{"line":495,"column":4}},"loc":{"start":{"line":481,"column":23},"end":{"line":495,"column":4}},"line":481},"45":{"name":"proto.getSession","decl":{"start":{"line":497,"column":21},"end":{"line":507,"column":4}},"loc":{"start":{"line":497,"column":21},"end":{"line":507,"column":4}},"line":497},"46":{"name":"proto.createSession","decl":{"start":{"line":509,"column":24},"end":{"line":518,"column":4}},"loc":{"start":{"line":509,"column":24},"end":{"line":518,"column":4}},"line":509},"47":{"name":"proto.deleteSession","decl":{"start":{"line":520,"column":24},"end":{"line":522,"column":4}},"loc":{"start":{"line":520,"column":24},"end":{"line":522,"column":4}},"line":520},"48":{"name":"proto.getSessionMessages","decl":{"start":{"line":524,"column":29},"end":{"line":540,"column":4}},"loc":{"start":{"line":524,"column":29},"end":{"line":540,"column":4}},"line":524},"49":{"name":"proto.listTriggers","decl":{"start":{"line":544,"column":23},"end":{"line":546,"column":4}},"loc":{"start":{"line":544,"column":23},"end":{"line":546,"column":4}},"line":544},"50":{"name":"proto.getTrigger","decl":{"start":{"line":548,"column":21},"end":{"line":556,"column":4}},"loc":{"start":{"line":548,"column":21},"end":{"line":556,"column":4}},"line":548},"51":{"name":"proto.createTrigger","decl":{"start":{"line":558,"column":24},"end":{"line":567,"column":4}},"loc":{"start":{"line":558,"column":24},"end":{"line":567,"column":4}},"line":558},"52":{"name":"proto.updateTrigger","decl":{"start":{"line":569,"column":24},"end":{"line":577,"column":4}},"loc":{"start":{"line":569,"column":24},"end":{"line":577,"column":4}},"line":569},"53":{"name":"proto.deleteTrigger","decl":{"start":{"line":579,"column":24},"end":{"line":581,"column":4}},"loc":{"start":{"line":579,"column":24},"end":{"line":581,"column":4}},"line":579},"54":{"name":"proto.getAuditLogs","decl":{"start":{"line":585,"column":23},"end":{"line":590,"column":4}},"loc":{"start":{"line":585,"column":23},"end":{"line":590,"column":4}},"line":585},"55":{"name":"proto.verifyAuditLogChain","decl":{"start":{"line":592,"column":30},"end":{"line":599,"column":4}},"loc":{"start":{"line":592,"column":30},"end":{"line":599,"column":4}},"line":592},"56":{"name":"proto.getSecurityStatus","decl":{"start":{"line":603,"column":28},"end":{"line":619,"column":4}},"loc":{"start":{"line":603,"column":28},"end":{"line":619,"column":4}},"line":603},"57":{"name":"proto.getCapabilities","decl":{"start":{"line":621,"column":26},"end":{"line":627,"column":4}},"loc":{"start":{"line":621,"column":26},"end":{"line":627,"column":4}},"line":621},"58":{"name":"proto.listApprovals","decl":{"start":{"line":631,"column":24},"end":{"line":649,"column":4}},"loc":{"start":{"line":631,"column":24},"end":{"line":649,"column":4}},"line":631},"59":{"name":"proto.respondToApproval","decl":{"start":{"line":651,"column":28},"end":{"line":653,"column":4}},"loc":{"start":{"line":651,"column":28},"end":{"line":653,"column":4}},"line":651},"60":{"name":"proto.listModels","decl":{"start":{"line":657,"column":21},"end":{"line":659,"column":4}},"loc":{"start":{"line":657,"column":21},"end":{"line":659,"column":4}},"line":657},"61":{"name":"proto.getConfig","decl":{"start":{"line":661,"column":20},"end":{"line":663,"column":4}},"loc":{"start":{"line":661,"column":20},"end":{"line":663,"column":4}},"line":661},"62":{"name":"proto.applyConfig","decl":{"start":{"line":665,"column":22},"end":{"line":673,"column":4}},"loc":{"start":{"line":665,"column":22},"end":{"line":673,"column":4}},"line":665}},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-auth.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-auth.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":54}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":18}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":42}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":44}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":81}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":71}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":49}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":75}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":43}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":54}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":14}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":58}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":38}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":59}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":10}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":13}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":33}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":33}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":50}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":4}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":61}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":43}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":19}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":9}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":66}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":14}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":17}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":40}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":57}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":8}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":17}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":69}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":31}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":56}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":78}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":38}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":10}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":28}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":42}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":1}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":56}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":7}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":55}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":15}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":68}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":48}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":10}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":9}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":20}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":22}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":16}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":28}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":23}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":40}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":45}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":30}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":42}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":30}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":34}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":30}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":24}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":22}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":26}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":13}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":24}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":5}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":57}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":71}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":10}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":36}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":13}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":4}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":1}}},"s":{"0":1,"31":1,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"69":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"90":0,"93":0,"95":0,"96":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"123":1,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"146":1,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0},"branchMap":{},"b":{},"fnMap":{"0":{"name":"b64Encode","decl":{"start":{"line":32,"column":7},"end":{"line":38,"column":1}},"loc":{"start":{"line":32,"column":7},"end":{"line":38,"column":1}},"line":32},"1":{"name":"deriveDeviceId","decl":{"start":{"line":42,"column":0},"end":{"line":48,"column":1}},"loc":{"start":{"line":42,"column":0},"end":{"line":48,"column":1}},"line":42},"2":{"name":"generateDeviceKeys","decl":{"start":{"line":52,"column":0},"end":{"line":62,"column":1}},"loc":{"start":{"line":52,"column":0},"end":{"line":62,"column":1}},"line":52},"3":{"name":"loadDeviceKeys","decl":{"start":{"line":70,"column":0},"end":{"line":97,"column":1}},"loc":{"start":{"line":70,"column":0},"end":{"line":97,"column":1}},"line":70},"4":{"name":"getLocalDeviceIdentity","decl":{"start":{"line":101,"column":0},"end":{"line":107,"column":1}},"loc":{"start":{"line":101,"column":0},"end":{"line":107,"column":1}},"line":101},"5":{"name":"clearDeviceKeys","decl":{"start":{"line":113,"column":0},"end":{"line":120,"column":1}},"loc":{"start":{"line":113,"column":0},"end":{"line":120,"column":1}},"line":113},"6":{"name":"buildDeviceAuthPayload","decl":{"start":{"line":124,"column":7},"end":{"line":145,"column":1}},"loc":{"start":{"line":124,"column":7},"end":{"line":145,"column":1}},"line":124},"7":{"name":"signDeviceAuth","decl":{"start":{"line":147,"column":7},"end":{"line":175,"column":1}},"loc":{"start":{"line":147,"column":7},"end":{"line":175,"column":1}},"line":147}},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-client.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":42}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":32}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":19}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":32}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":44}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":32}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":76}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":19}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":34}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":35}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":41}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":49}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":31}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":27}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":32}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":47}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":38}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":3}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":62}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":55}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":72}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":49}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":6}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":3}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":41}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":81}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":31}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":73}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":1}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":28}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":38}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":76}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":50}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":24}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":45}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":7}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":65}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":32}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":47}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":49}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":45}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":7}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":22}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":33}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":36}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":33}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":50}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":49}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":39}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":67}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":67}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":52}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":51}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":6}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":71}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":56}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":53}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":61}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":56}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":46}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":24}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":6}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":22}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":19}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":47}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":5}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":35}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":30}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":43}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":46}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":47}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":54}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":44}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":48}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":31}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":3}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":38}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":37}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":13}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":5}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":32}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":9}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":93}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":35}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":35}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":35}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":77}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":111}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":65}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":47}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":7}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":28}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":36}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":76}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":72}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":5}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":3}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":28}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":100}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":31}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":68}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":32}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":5}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":40}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":30}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":32}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":45}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":26}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":35}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":28}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":23}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":18}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":8}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":46}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":28}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":23}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":22}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":8}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":54}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":80}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":23}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":94}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":30}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":11}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":42}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":32}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":39}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":10}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":38}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":15}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":61}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":43}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":43}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":30}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":27}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":43}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":34}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":15}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":34}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":82}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":62}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":11}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":10}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":36}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":58}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":64}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":25}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":51}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":37}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":11}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":74}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":36}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":41}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":117}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":11}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":10}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":33}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":76}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":41}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":27}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":67}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":11}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":10}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":21}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":37}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":23}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":74}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":7}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":3}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":31}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":27}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":18}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":47}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":19}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":3}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":85}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":37}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":62}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":5}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":41}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":70}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":45}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":45}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":40}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":57}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":30}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":63}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":23}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":7}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":3}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":38}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":55}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":9}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":109}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":40}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":118}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":55}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":46}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":127}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":35}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":7}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":19}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":81}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":5}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":16}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":3}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":44}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":34}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":57}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":3}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":31}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":31}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":3}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":38}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":73}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":55}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":19}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":39}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":36}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":5}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":19}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":92}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":5}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":144}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":14}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":35}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":7}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":12}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":36}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":34}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":32}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":6}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":3}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":19}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":20}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":16}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":12}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":33}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":55}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":41}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":66}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":19}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":45}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":52}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":30}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":53}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":81}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":16}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":98}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":33}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":9}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":25}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":57}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":31}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":9}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":23}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":5}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":47}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":67}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":21}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":3}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":32}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":20}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":18}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":22}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":19}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":11}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":77}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":30}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":5}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":22}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":75}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":70}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":12}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":44}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":75}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":5}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":64}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":9}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":45}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":38}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":57}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":29}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":26}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":27}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":32}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":10}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":59}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":8}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":46}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":13}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":46}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":65}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":32}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":80}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":77}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":9}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":8}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":45}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":54}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":58}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":24}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":59}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":45}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":9}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":8}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":44}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":85}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":58}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":47}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":79}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":9}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":43}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":31}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":8}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":28}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":76}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":71}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":56}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":22}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":40}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":43}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":7}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":5}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":3}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":104}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":54}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":27}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":24}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":24}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":27}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":42}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":9}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":14}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":19}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":36}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":33}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":45}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":32}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":59}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":11}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":9}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":14}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":22}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":27}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":9}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":31}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":43}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":30}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":57}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":9}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":14}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":20}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":14}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":23}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":44}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":91}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":9}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":14}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":25}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":44}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":84}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":9}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":14}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":18}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":49}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":94}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":9}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":14}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":19}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":88}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":43}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":30}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":47}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":9}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":14}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":23}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":71}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":14}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":28}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":49}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":14}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":14}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":56}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":5}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":29}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":67}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":26}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":28}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":12}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":16}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":14}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":7}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":3}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":37}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":54}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":20}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":44}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":41}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":5}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":75}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":52}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":5}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":3}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":35}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":75}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":16}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":5}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":27}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":61}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":3}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":53}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":42}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":54}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":23}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":91}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":46}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":18}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":5}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":27}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":3}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":70}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":42}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":36}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":53}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":39}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":21}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":54}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":52}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":7}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":23}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":62}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":112}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":128}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":46}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":38}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":18}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":5}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":41}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":65}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":18}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":3}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":69}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":42}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":55}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":20}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":54}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":52}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":7}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":23}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":83}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":5}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":27}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":3}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":56}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":42}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":55}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":23}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":7}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":23}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":83}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":5}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":27}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":3}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":71}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":42}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":55}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":22}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":54}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":52}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":7}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":23}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":83}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":5}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":27}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":3}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":58}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":42}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":48}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":5}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":50}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":18}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":55}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":6}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":3}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":74}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":51}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":44}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":7}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":3}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":113}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":32}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":24}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":13}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":5}},"810":{"start":{"line":811,"column":0},"end":{"line":811,"column":33}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":61}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":38}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":33}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":5}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":3}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":113}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":78}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":70}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":81}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":13}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":5}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":47}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":3}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":139}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":26}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":55}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":73}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":13}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":5}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":46}},"839":{"start":{"line":840,"column":0},"end":{"line":840,"column":27}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":29}},"843":{"start":{"line":844,"column":0},"end":{"line":844,"column":28}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":115}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":134}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":9}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":54}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":135}},"855":{"start":{"line":856,"column":0},"end":{"line":856,"column":54}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":17}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":19}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":38}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":30}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":13}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":15}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":40}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":26}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":9}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":105}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":42}},"870":{"start":{"line":871,"column":0},"end":{"line":871,"column":20}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":22}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":26}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":17}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":25}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":25}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":19}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":25}},"878":{"start":{"line":879,"column":0},"end":{"line":879,"column":29}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":44}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":29}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":12}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":15}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":17}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":56}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":26}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":41}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":19}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":36}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":50}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":22}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":21}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":34}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":12}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":10}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":8}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":49}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":37}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":13}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":45}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":63}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":49}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":27}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":41}},"906":{"start":{"line":907,"column":0},"end":{"line":907,"column":41}},"907":{"start":{"line":908,"column":0},"end":{"line":908,"column":83}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":57}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":55}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":33}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":20}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":43}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":99}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":75}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":47}},"918":{"start":{"line":919,"column":0},"end":{"line":919,"column":90}},"919":{"start":{"line":920,"column":0},"end":{"line":920,"column":92}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":34}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":15}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":29}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":37}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":13}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":18}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":49}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":11}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":17}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":9}},"932":{"start":{"line":933,"column":0},"end":{"line":933,"column":8}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":28}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":28}},"936":{"start":{"line":937,"column":0},"end":{"line":937,"column":72}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":39}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":21}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":29}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":5}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":3}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":48}},"944":{"start":{"line":945,"column":0},"end":{"line":945,"column":53}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":18}},"946":{"start":{"line":947,"column":0},"end":{"line":947,"column":34}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":42}},"948":{"start":{"line":949,"column":0},"end":{"line":949,"column":19}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":37}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":14}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":61}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":7}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":5}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":3}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":37}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":49}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":42}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":5}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":3}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":54}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":53}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":20}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":35}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":67}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":7}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":5}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":59}},"971":{"start":{"line":972,"column":0},"end":{"line":972,"column":28}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":43}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":62}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":7}},"975":{"start":{"line":976,"column":0},"end":{"line":976,"column":5}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":3}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":44}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":23}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":32}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":35}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":3}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":21}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":25}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":53}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":34}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":53}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":5}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":33}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":18}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":28}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":31}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":29}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":29}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":97}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":55}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":7}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":21}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":5}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":34}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":3}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":34}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":25}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":30}},"1018":{"start":{"line":1019,"column":0},"end":{"line":1019,"column":55}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":27}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":41}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":43}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":3}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":33}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":33}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":44}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":36}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":5}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":32}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":42}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":35}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":5}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":43}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":3}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":33}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":49}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":67}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":13}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":5}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":28}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":70}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":103}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":27}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":47}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":13}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":5}},"1059":{"start":{"line":1060,"column":0},"end":{"line":1060,"column":9}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":53}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":72}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":55}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":51}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":42}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":21}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":111}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":5}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":3}},"1076":{"start":{"line":1077,"column":0},"end":{"line":1077,"column":30}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":30}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":32}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":42}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":35}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":5}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":56}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":3}},"1085":{"start":{"line":1086,"column":0},"end":{"line":1086,"column":54}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":31}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":73}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":128}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":36}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":42}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":41}},"1093":{"start":{"line":1094,"column":0},"end":{"line":1094,"column":57}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":9}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":13}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":5}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":29}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":34}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":102}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":93}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":36}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":38}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":12}},"1108":{"start":{"line":1109,"column":0},"end":{"line":1109,"column":55}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":7}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":57}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":11}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":29}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":15}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":79}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":7}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":14}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":3}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":29}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":39}},"1123":{"start":{"line":1124,"column":0},"end":{"line":1124,"column":40}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":33}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":5}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":3}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":36}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":49}},"1130":{"start":{"line":1131,"column":0},"end":{"line":1131,"column":45}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":43}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":19}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":3}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":47}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":33}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":3}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":1}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":33}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":41}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":104}},"1147":{"start":{"line":1148,"column":0},"end":{"line":1148,"column":17}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":38}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":20}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":32}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":3}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":17}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":1}}},"s":{"0":1,"82":1,"83":1,"84":5,"85":5,"86":5,"87":1,"92":1,"93":1,"94":0,"96":1,"97":0,"98":0,"99":0,"100":0,"101":0,"102":1,"107":1,"108":1,"110":1,"111":0,"112":0,"113":0,"114":0,"115":1,"120":1,"121":1,"123":1,"124":0,"125":0,"126":0,"127":0,"128":1,"137":1,"138":9,"139":3,"140":3,"141":3,"142":3,"143":3,"144":9,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"155":1,"156":1,"157":0,"158":0,"159":0,"160":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"175":0,"178":0,"179":0,"180":0,"181":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":1,"190":1,"193":1,"194":1,"196":1,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":1,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"236":1,"237":0,"238":0,"243":1,"244":0,"245":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"267":1,"268":0,"269":0,"270":0,"273":0,"274":0,"275":0,"278":0,"280":0,"281":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"301":0,"302":0,"304":0,"305":0,"306":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"324":0,"325":0,"326":0,"327":0,"329":0,"330":0,"331":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"355":1,"356":0,"357":0,"359":0,"360":0,"361":0,"362":0,"363":0,"367":1,"368":0,"369":0,"370":0,"372":0,"373":0,"375":0,"376":0,"377":0,"378":0,"379":0,"381":0,"382":0,"383":0,"384":0,"389":1,"392":1,"393":0,"395":0,"396":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"411":1,"412":0,"413":0,"414":0,"417":1,"418":0,"419":0,"422":1,"430":0,"432":0,"435":0,"436":0,"437":0,"438":0,"440":0,"441":0,"442":0,"444":0,"445":0,"446":0,"447":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"457":1,"458":0,"459":0,"466":0,"470":0,"471":0,"472":0,"473":0,"476":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"495":0,"498":0,"500":0,"501":0,"504":1,"505":0,"506":0,"507":0,"508":0,"509":0,"511":0,"512":0,"513":0,"517":0,"518":0,"520":0,"521":0,"523":0,"524":0,"525":0,"527":0,"529":0,"530":0,"532":0,"533":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"583":1,"584":0,"585":0,"587":0,"589":0,"591":0,"592":0,"593":0,"594":0,"596":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"607":0,"609":0,"612":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"621":0,"624":0,"626":0,"628":0,"629":0,"630":0,"631":0,"633":0,"634":0,"635":0,"636":0,"637":0,"639":0,"640":0,"641":0,"642":0,"643":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"653":0,"655":0,"656":0,"658":0,"660":0,"661":0,"663":0,"665":0,"666":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"680":1,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":0,"689":0,"693":1,"696":0,"698":0,"699":0,"701":0,"702":0,"703":0,"705":1,"706":0,"707":0,"708":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"717":1,"718":0,"719":0,"720":0,"722":0,"723":0,"724":0,"725":0,"726":0,"728":0,"729":0,"730":0,"731":0,"732":0,"733":0,"734":0,"735":0,"737":0,"738":0,"739":0,"740":0,"742":1,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"755":1,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"766":1,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"782":1,"783":0,"784":0,"785":0,"786":0,"789":0,"790":0,"791":0,"792":0,"795":1,"796":0,"797":0,"798":0,"799":0,"803":1,"805":0,"806":0,"807":0,"808":0,"810":0,"811":0,"812":0,"813":0,"814":0,"815":0,"817":1,"819":0,"820":0,"821":0,"822":0,"823":0,"826":0,"827":0,"829":1,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"839":0,"842":0,"843":0,"844":0,"847":0,"849":0,"850":0,"853":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":0,"867":0,"869":0,"870":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"878":0,"879":0,"880":0,"881":0,"882":0,"883":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"918":0,"919":0,"920":0,"921":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"931":0,"932":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"943":1,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"956":1,"957":0,"958":0,"959":0,"960":0,"962":1,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"978":1,"979":0,"980":0,"981":0,"982":0,"984":1,"986":0,"988":0,"989":0,"990":0,"991":0,"992":0,"994":0,"995":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1002":0,"1003":0,"1005":0,"1006":0,"1014":1,"1015":0,"1016":0,"1018":0,"1019":0,"1020":0,"1022":0,"1023":0,"1029":1,"1030":0,"1031":0,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1044":1,"1045":0,"1046":0,"1047":0,"1048":0,"1050":0,"1051":0,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1059":0,"1060":0,"1061":0,"1064":0,"1065":0,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1076":1,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1085":1,"1087":1,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1098":0,"1099":0,"1100":0,"1102":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1111":0,"1112":0,"1113":0,"1114":0,"1116":0,"1117":0,"1118":0,"1119":0,"1121":1,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1128":1,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1135":1,"1136":0,"1137":0,"1138":1,"1141":1,"1144":1,"1146":1,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0},"branchMap":{"0":{"type":"branch","line":84,"loc":{"start":{"line":84,"column":2},"end":{"line":87,"column":3}},"locations":[{"start":{"line":84,"column":2},"end":{"line":87,"column":3}}]},"1":{"type":"branch","line":94,"loc":{"start":{"line":94,"column":18},"end":{"line":95,"column":39}},"locations":[{"start":{"line":94,"column":18},"end":{"line":95,"column":39}}]},"2":{"type":"branch","line":109,"loc":{"start":{"line":109,"column":18},"end":{"line":109,"column":34}},"locations":[{"start":{"line":109,"column":18},"end":{"line":109,"column":34}}]},"3":{"type":"branch","line":122,"loc":{"start":{"line":122,"column":18},"end":{"line":122,"column":32}},"locations":[{"start":{"line":122,"column":18},"end":{"line":122,"column":32}}]},"4":{"type":"branch","line":138,"loc":{"start":{"line":138,"column":7},"end":{"line":145,"column":1}},"locations":[{"start":{"line":138,"column":7},"end":{"line":145,"column":1}}]},"5":{"type":"branch","line":139,"loc":{"start":{"line":139,"column":30},"end":{"line":139,"column":54}},"locations":[{"start":{"line":139,"column":30},"end":{"line":139,"column":54}}]},"6":{"type":"branch","line":139,"loc":{"start":{"line":139,"column":54},"end":{"line":144,"column":3}},"locations":[{"start":{"line":139,"column":54},"end":{"line":144,"column":3}}]},"7":{"type":"branch","line":157,"loc":{"start":{"line":157,"column":10},"end":{"line":390,"column":38}},"locations":[{"start":{"line":157,"column":10},"end":{"line":390,"column":38}}]},"8":{"type":"branch","line":189,"loc":{"start":{"line":189,"column":2},"end":{"line":1086,"column":54}},"locations":[{"start":{"line":189,"column":2},"end":{"line":1086,"column":54}}]}},"b":{"0":[5],"1":[0],"2":[0],"3":[0],"4":[9],"5":[6],"6":[3],"7":[0],"8":[1]},"fnMap":{"0":{"name":"SecurityError","decl":{"start":{"line":84,"column":2},"end":{"line":87,"column":3}},"loc":{"start":{"line":84,"column":2},"end":{"line":87,"column":3}},"line":84},"1":{"name":"","decl":{"start":{"line":94,"column":18},"end":{"line":95,"column":39}},"loc":{"start":{"line":94,"column":18},"end":{"line":95,"column":39}},"line":94},"2":{"name":"ConnectionError","decl":{"start":{"line":97,"column":2},"end":{"line":102,"column":3}},"loc":{"start":{"line":97,"column":2},"end":{"line":102,"column":3}},"line":97},"3":{"name":"","decl":{"start":{"line":109,"column":18},"end":{"line":109,"column":34}},"loc":{"start":{"line":109,"column":18},"end":{"line":109,"column":34}},"line":109},"4":{"name":"TimeoutError","decl":{"start":{"line":111,"column":2},"end":{"line":115,"column":3}},"loc":{"start":{"line":111,"column":2},"end":{"line":115,"column":3}},"line":111},"5":{"name":"","decl":{"start":{"line":122,"column":18},"end":{"line":122,"column":32}},"loc":{"start":{"line":122,"column":18},"end":{"line":122,"column":32}},"line":122},"6":{"name":"AuthenticationError","decl":{"start":{"line":124,"column":2},"end":{"line":128,"column":3}},"loc":{"start":{"line":124,"column":2},"end":{"line":128,"column":3}},"line":124},"7":{"name":"validateWebSocketSecurity","decl":{"start":{"line":138,"column":7},"end":{"line":145,"column":1}},"loc":{"start":{"line":138,"column":7},"end":{"line":145,"column":1}},"line":138},"8":{"name":"createIdempotencyKey","decl":{"start":{"line":147,"column":0},"end":{"line":152,"column":1}},"loc":{"start":{"line":147,"column":0},"end":{"line":152,"column":1}},"line":147},"9":{"name":"","decl":{"start":{"line":157,"column":10},"end":{"line":390,"column":38}},"loc":{"start":{"line":157,"column":10},"end":{"line":390,"column":38}},"line":157},"10":{"name":"","decl":{"start":{"line":189,"column":2},"end":{"line":1086,"column":54}},"loc":{"start":{"line":189,"column":2},"end":{"line":1086,"column":54}},"line":189},"11":{"name":"GatewayClient","decl":{"start":{"line":197,"column":2},"end":{"line":210,"column":3}},"loc":{"start":{"line":197,"column":2},"end":{"line":210,"column":3}},"line":197},"12":{"name":"updateOptions","decl":{"start":{"line":212,"column":2},"end":{"line":235,"column":3}},"loc":{"start":{"line":212,"column":2},"end":{"line":235,"column":3}},"line":212},"13":{"name":"getState","decl":{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},"loc":{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},"line":237},"14":{"name":"connectRest","decl":{"start":{"line":244,"column":2},"end":{"line":266,"column":3}},"loc":{"start":{"line":244,"column":2},"end":{"line":266,"column":3}},"line":244},"15":{"name":"connect","decl":{"start":{"line":268,"column":2},"end":{"line":354,"column":3}},"loc":{"start":{"line":268,"column":2},"end":{"line":354,"column":3}},"line":268},"16":{"name":"disconnect","decl":{"start":{"line":356,"column":2},"end":{"line":364,"column":3}},"loc":{"start":{"line":356,"column":2},"end":{"line":364,"column":3}},"line":356},"17":{"name":"request","decl":{"start":{"line":368,"column":2},"end":{"line":385,"column":3}},"loc":{"start":{"line":368,"column":2},"end":{"line":385,"column":3}},"line":368},"18":{"name":"fetchDefaultAgentId","decl":{"start":{"line":393,"column":2},"end":{"line":409,"column":3}},"loc":{"start":{"line":393,"column":2},"end":{"line":409,"column":3}},"line":393},"19":{"name":"setDefaultAgentId","decl":{"start":{"line":412,"column":2},"end":{"line":415,"column":3}},"loc":{"start":{"line":412,"column":2},"end":{"line":415,"column":3}},"line":412},"20":{"name":"getDefaultAgentId","decl":{"start":{"line":418,"column":2},"end":{"line":420,"column":3}},"loc":{"start":{"line":418,"column":2},"end":{"line":420,"column":3}},"line":418},"21":{"name":"chat","decl":{"start":{"line":423,"column":2},"end":{"line":455,"column":3}},"loc":{"start":{"line":423,"column":2},"end":{"line":455,"column":3}},"line":423},"22":{"name":"chatStream","decl":{"start":{"line":458,"column":2},"end":{"line":502,"column":3}},"loc":{"start":{"line":458,"column":2},"end":{"line":502,"column":3}},"line":458},"23":{"name":"connectOpenFangStream","decl":{"start":{"line":505,"column":10},"end":{"line":581,"column":3}},"loc":{"start":{"line":505,"column":10},"end":{"line":581,"column":3}},"line":505},"24":{"name":"handleOpenFangStreamEvent","decl":{"start":{"line":584,"column":10},"end":{"line":678,"column":3}},"loc":{"start":{"line":584,"column":10},"end":{"line":678,"column":3}},"line":584},"25":{"name":"cancelStream","decl":{"start":{"line":681,"column":2},"end":{"line":690,"column":3}},"loc":{"start":{"line":681,"column":2},"end":{"line":690,"column":3}},"line":681},"26":{"name":"getRestBaseUrl","decl":{"start":{"line":694,"column":9},"end":{"line":704,"column":3}},"loc":{"start":{"line":694,"column":9},"end":{"line":704,"column":3}},"line":694},"27":{"name":"restGet","decl":{"start":{"line":706,"column":2},"end":{"line":716,"column":3}},"loc":{"start":{"line":706,"column":2},"end":{"line":716,"column":3}},"line":706},"28":{"name":"restPost","decl":{"start":{"line":718,"column":2},"end":{"line":741,"column":3}},"loc":{"start":{"line":718,"column":2},"end":{"line":741,"column":3}},"line":718},"29":{"name":"restPut","decl":{"start":{"line":743,"column":2},"end":{"line":754,"column":3}},"loc":{"start":{"line":743,"column":2},"end":{"line":754,"column":3}},"line":743},"30":{"name":"restDelete","decl":{"start":{"line":756,"column":2},"end":{"line":765,"column":3}},"loc":{"start":{"line":756,"column":2},"end":{"line":765,"column":3}},"line":756},"31":{"name":"restPatch","decl":{"start":{"line":767,"column":2},"end":{"line":778,"column":3}},"loc":{"start":{"line":767,"column":2},"end":{"line":778,"column":3}},"line":767},"32":{"name":"on","decl":{"start":{"line":783,"column":2},"end":{"line":793,"column":3}},"loc":{"start":{"line":783,"column":2},"end":{"line":793,"column":3}},"line":783},"33":{"name":"onAgentStream","decl":{"start":{"line":796,"column":2},"end":{"line":800,"column":3}},"loc":{"start":{"line":796,"column":2},"end":{"line":800,"column":3}},"line":796},"34":{"name":"handleFrame","decl":{"start":{"line":804,"column":10},"end":{"line":816,"column":3}},"loc":{"start":{"line":804,"column":10},"end":{"line":816,"column":3}},"line":804},"35":{"name":"handleEvent","decl":{"start":{"line":818,"column":10},"end":{"line":828,"column":3}},"loc":{"start":{"line":818,"column":10},"end":{"line":828,"column":3}},"line":818},"36":{"name":"performHandshake","decl":{"start":{"line":830,"column":2},"end":{"line":942,"column":3}},"loc":{"start":{"line":830,"column":2},"end":{"line":942,"column":3}},"line":830},"37":{"name":"handleResponse","decl":{"start":{"line":944,"column":10},"end":{"line":955,"column":3}},"loc":{"start":{"line":944,"column":10},"end":{"line":955,"column":3}},"line":944},"38":{"name":"send","decl":{"start":{"line":957,"column":10},"end":{"line":961,"column":3}},"loc":{"start":{"line":957,"column":10},"end":{"line":961,"column":3}},"line":957},"39":{"name":"emitEvent","decl":{"start":{"line":963,"column":10},"end":{"line":977,"column":3}},"loc":{"start":{"line":963,"column":10},"end":{"line":977,"column":3}},"line":963},"40":{"name":"setState","decl":{"start":{"line":979,"column":10},"end":{"line":983,"column":3}},"loc":{"start":{"line":979,"column":10},"end":{"line":983,"column":3}},"line":979},"41":{"name":"cleanup","decl":{"start":{"line":985,"column":10},"end":{"line":1007,"column":3}},"loc":{"start":{"line":985,"column":10},"end":{"line":1007,"column":3}},"line":985},"42":{"name":"startHeartbeat","decl":{"start":{"line":1015,"column":10},"end":{"line":1024,"column":3}},"loc":{"start":{"line":1015,"column":10},"end":{"line":1024,"column":3}},"line":1015},"43":{"name":"stopHeartbeat","decl":{"start":{"line":1030,"column":10},"end":{"line":1040,"column":3}},"loc":{"start":{"line":1030,"column":10},"end":{"line":1040,"column":3}},"line":1030},"44":{"name":"sendHeartbeat","decl":{"start":{"line":1045,"column":10},"end":{"line":1072,"column":3}},"loc":{"start":{"line":1045,"column":10},"end":{"line":1072,"column":3}},"line":1045},"45":{"name":"handlePong","decl":{"start":{"line":1077,"column":10},"end":{"line":1084,"column":3}},"loc":{"start":{"line":1077,"column":10},"end":{"line":1084,"column":3}},"line":1077},"46":{"name":"scheduleReconnect","decl":{"start":{"line":1088,"column":10},"end":{"line":1120,"column":3}},"loc":{"start":{"line":1088,"column":10},"end":{"line":1120,"column":3}},"line":1088},"47":{"name":"cancelReconnect","decl":{"start":{"line":1122,"column":10},"end":{"line":1127,"column":3}},"loc":{"start":{"line":1122,"column":10},"end":{"line":1127,"column":3}},"line":1122},"48":{"name":"detectPlatform","decl":{"start":{"line":1129,"column":10},"end":{"line":1134,"column":3}},"loc":{"start":{"line":1129,"column":10},"end":{"line":1134,"column":3}},"line":1129},"49":{"name":"log","decl":{"start":{"line":1136,"column":10},"end":{"line":1138,"column":3}},"loc":{"start":{"line":1136,"column":10},"end":{"line":1138,"column":3}},"line":1136},"50":{"name":"getGatewayClient","decl":{"start":{"line":1147,"column":7},"end":{"line":1154,"column":1}},"loc":{"start":{"line":1147,"column":7},"end":{"line":1154,"column":1}},"line":1147}},"f":{"0":5,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":9,"8":0,"9":0,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-config.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-config.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":752},"end":{"line":33,"column":1}},"locations":[{"start":{"line":1,"column":752},"end":{"line":33,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":752},"end":{"line":33,"column":1}},"loc":{"start":{"line":1,"column":752},"end":{"line":33,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-storage.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-storage.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":81}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":57}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":51}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":7}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":45}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":45}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":39}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":11}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":17}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":3}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":1}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":78}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":73}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":38}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":22}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":44}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":52}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":56}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":58}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":76}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":72}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":36}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":36}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":20}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":1}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":47}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":7}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":65}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":62}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":11}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":31}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":1}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":58}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":69}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":7}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":62}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":48}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":20}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":69}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":69}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":16}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":91}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":23}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":74}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":14}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":49}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":47}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":99}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":7}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":67}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":17}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":11}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":42}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":89}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":82}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":9}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":15}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":5}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":14}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":11}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":14}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":3}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":1}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":82}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":34}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":21}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":69}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":86}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":12}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":60}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":88}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":55}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":19}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":76}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":86}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":68}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":20}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":1}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":62}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":34}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":47}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":100}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":3}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":7}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":21}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":66}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":12}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":57}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":3}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":20}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":1}}},"s":{"0":1,"21":1,"26":1,"31":1,"32":14,"33":14,"34":14,"35":10,"36":7,"37":14,"38":0,"39":0,"40":14,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"53":1,"54":1,"64":1,"65":0,"68":0,"71":0,"72":0,"73":0,"76":0,"77":0,"78":0,"80":0,"81":0,"85":1,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"94":1,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"125":1,"128":0,"129":0,"130":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"144":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"183":0,"184":0,"190":1,"191":0,"193":0,"194":0,"195":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"206":0,"208":0,"209":0},"branchMap":{"0":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":28},"end":{"line":27,"column":49}},"locations":[{"start":{"line":27,"column":28},"end":{"line":27,"column":49}}]},"1":{"type":"branch","line":32,"loc":{"start":{"line":32,"column":7},"end":{"line":41,"column":1}},"locations":[{"start":{"line":32,"column":7},"end":{"line":41,"column":1}}]},"2":{"type":"branch","line":35,"loc":{"start":{"line":35,"column":31},"end":{"line":36,"column":45}},"locations":[{"start":{"line":35,"column":31},"end":{"line":36,"column":45}}]},"3":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":31},"end":{"line":37,"column":39}},"locations":[{"start":{"line":36,"column":31},"end":{"line":37,"column":39}}]},"4":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}]}},"b":{"0":[0],"1":[14],"2":[10],"3":[7],"4":[0]},"fnMap":{"0":{"name":"isLocalhost","decl":{"start":{"line":32,"column":7},"end":{"line":41,"column":1}},"loc":{"start":{"line":32,"column":7},"end":{"line":41,"column":1}},"line":32},"1":{"name":"normalizeGatewayUrl","decl":{"start":{"line":65,"column":7},"end":{"line":82,"column":1}},"loc":{"start":{"line":65,"column":7},"end":{"line":82,"column":1}},"line":65},"2":{"name":"getStoredGatewayUrl","decl":{"start":{"line":86,"column":7},"end":{"line":93,"column":1}},"loc":{"start":{"line":86,"column":7},"end":{"line":93,"column":1}},"line":86},"3":{"name":"setStoredGatewayUrl","decl":{"start":{"line":95,"column":7},"end":{"line":101,"column":1}},"loc":{"start":{"line":95,"column":7},"end":{"line":101,"column":1}},"line":95},"4":{"name":"getStoredGatewayTokenAsync","decl":{"start":{"line":109,"column":0},"end":{"line":120,"column":1}},"loc":{"start":{"line":109,"column":0},"end":{"line":120,"column":1}},"line":109},"5":{"name":"getStoredGatewayToken","decl":{"start":{"line":126,"column":7},"end":{"line":154,"column":1}},"loc":{"start":{"line":126,"column":7},"end":{"line":154,"column":1}},"line":126},"6":{"name":"setStoredGatewayTokenAsync","decl":{"start":{"line":163,"column":0},"end":{"line":185,"column":1}},"loc":{"start":{"line":163,"column":0},"end":{"line":185,"column":1}},"line":163},"7":{"name":"setStoredGatewayToken","decl":{"start":{"line":191,"column":7},"end":{"line":210,"column":1}},"loc":{"start":{"line":191,"column":7},"end":{"line":210,"column":1}},"line":191}},"f":{"0":14,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\gateway-types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2256},"end":{"line":96,"column":55}},"locations":[{"start":{"line":1,"column":2256},"end":{"line":96,"column":55}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2256},"end":{"line":96,"column":55}},"loc":{"start":{"line":1,"column":2256},"end":{"line":96,"column":55}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\health-check.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\health-check.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":72}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":31}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":12}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":24}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":50}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":6}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":7}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":83}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":12}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":57}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":32}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":16}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":6}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":19}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":80}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":12}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":26}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":16}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":6}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":43}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":48}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":51}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":63}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":22}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":9}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":48}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":23}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":21}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":68}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":16}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":26}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":74}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":30}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":9}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":15}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":25}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":10}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":46}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":16}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":30}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":32}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":5}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":4}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":68}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":19}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":18}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":18}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":12}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":66}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":35}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":43}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":20}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":22}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":22}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}}},"s":{"0":0,"33":0,"34":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"74":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"95":0,"98":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3217},"end":{"line":137,"column":1}},"locations":[{"start":{"line":1,"column":3217},"end":{"line":137,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3217},"end":{"line":137,"column":1}},"loc":{"start":{"line":1,"column":3217},"end":{"line":137,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\intelligence-backend.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\intelligence-backend.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":23}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":31}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":4}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":57}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":45}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":59}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":40}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":4}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":75}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":48}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":4}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":43}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":42}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":53}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":52}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":4}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":39}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":34}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":4}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":47}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":35}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":4}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":63}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":4}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":35}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":36}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":4}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":2}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":26}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":72}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":56}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":4}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":47}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":49}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":4}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":46}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":48}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":4}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":57}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":49}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":4}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":62}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":55}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":4}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":79}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":65}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":4}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":81}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":63}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":4}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":2}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":26}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":49}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":57}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":4}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":75}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":70}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":4}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":17}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":35}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":29}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":31}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":69}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":4}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":10}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":35}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":20}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":28}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":29}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":32}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":40}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":15}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":14}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":21}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":13}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":7}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":4}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":2}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":27}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":56}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":48}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":4}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":45}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":51}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":4}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":43}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":47}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":4}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":16}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":20}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":38}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":32}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":63}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":4}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":65}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":55}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":4}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":46}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":42}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":4}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":2}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":25}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":54}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":47}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":4}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":65}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":58}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":4}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":20}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":20}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":26}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":22}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":71}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":4}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":76}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":71}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":4}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":77}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":72}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":4}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":22}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":20}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":34}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":29}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":18}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":38}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":46}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":14}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":11}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":23}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":13}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":7}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":4}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":69}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":63}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":4}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":59}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":61}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":4}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":28}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":20}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":40}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":65}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":4}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":19}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":20}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":17}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":19}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":20}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":69}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":4}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":20}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":18}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":34}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":64}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":4}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":24}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":20}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":22}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":20}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":71}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":4}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":41}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":42}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":4}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":53}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":55}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":4}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":2}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":29}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":9}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":12}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":12}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":13}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":11}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":2}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":28}}},"s":{"0":0,"201":0,"202":0,"203":0,"204":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"218":0,"219":0,"220":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"234":0,"235":0,"236":0,"238":0,"239":0,"240":0,"241":0,"245":0,"246":0,"247":0,"248":0,"250":0,"251":0,"252":0,"254":0,"255":0,"256":0,"258":0,"259":0,"260":0,"262":0,"263":0,"264":0,"266":0,"267":0,"268":0,"270":0,"271":0,"272":0,"273":0,"277":0,"278":0,"279":0,"280":0,"282":0,"283":0,"284":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"330":0,"331":0,"332":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"345":0,"346":0,"347":0,"348":0,"361":0,"362":0,"363":0,"364":0,"366":0,"367":0,"368":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"377":0,"378":0,"379":0,"381":0,"382":0,"383":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"399":0,"400":0,"401":0,"403":0,"404":0,"405":0,"407":0,"408":0,"409":0,"410":0,"411":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"435":0,"436":0,"437":0,"439":0,"440":0,"441":0,"442":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10958},"end":{"line":455,"column":28}},"locations":[{"start":{"line":1,"column":10958},"end":{"line":455,"column":28}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10958},"end":{"line":455,"column":28}},"loc":{"start":{"line":1,"column":10958},"end":{"line":455,"column":28}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\intelligence-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\intelligence-client.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":64}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":1}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":79}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":40}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":23}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":26}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":1}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":74}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":10}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":19}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":30}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":44}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":35}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":43}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":34}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":34}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":45}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":38}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":57}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":4}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":1}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":137}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":10}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":28}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":28}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":27}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":33}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":25}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":21}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":42}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":4}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":1}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":92}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":10}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":30}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":30}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":23}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":25}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":25}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":42}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":4}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":1}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":75}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":10}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":40}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":28}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":30}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":38}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":38}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":54}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":4}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":1}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":55}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":39}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":23}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":7}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":28}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":11}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":14}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":3}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":1}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":59}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":50}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":62}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":17}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":32}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":5}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":11}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":3}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":26}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":1}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":62}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":7}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":70}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":11}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":72}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":1}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":24}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":31}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":4}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":57}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":37}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":77}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":41}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":33}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":9}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":30}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":29}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":44}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":40}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":55}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":29}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":21}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":26}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":21}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":44}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":6}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":32}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":29}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":14}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":4}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":54}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":37}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":57}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":4}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":70}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":37}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":33}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":26}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":67}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":23}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":61}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":5}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":46}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":76}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":5}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":24}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":53}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":35}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":55}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":62}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":8}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":24}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":48}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":5}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":19}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":4}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":43}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":37}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":61}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":29}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":4}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":53}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":37}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":41}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":71}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":29}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":42}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":4}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":39}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":37}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":46}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":47}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":37}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":49}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":57}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":5}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":53}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":71}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":6}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":29}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":9}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":56}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":53}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":13}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":5}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":12}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":42}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":13}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":14}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":48}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":64}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":6}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":4}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":42}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":37}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":26}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":4}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":58}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":37}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":37}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":29}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":27}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":4}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":35}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":56}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":4}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":2}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":27}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":55}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":80}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":46}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":54}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":4}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":81}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":18}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":31}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":65}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":5}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":17}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":4}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":23}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":35}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":29}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":31}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":61}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":83}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":12}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":49}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":36}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":16}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":83}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":60}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":6}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":4}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":16}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":35}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":21}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":29}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":29}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":32}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":58}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":49}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":12}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":35}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":83}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":38}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":38}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":26}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":89}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":88}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":6}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":4}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":2}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":28}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":24}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":41}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":37}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":57}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":4}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":45}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":44}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":4}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":43}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":54}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":4}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":97}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":46}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":66}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":46}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":53}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":63}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":50}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":31}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":71}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":5}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":46}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":25}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":86}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":21}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":57}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":29}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":30}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":51}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":9}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":25}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":21}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":48}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":25}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":9}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":5}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":52}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":25}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":92}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":21}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":57}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":29}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":30}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":51}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":9}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":5}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":50}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":27}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":21}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":55}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":31}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":30}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":99}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":9}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":5}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":94}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":41}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":21}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":74}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":45}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":30}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":69}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":9}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":5}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":78}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":34}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":21}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":60}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":38}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":29}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":21}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":9}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":25}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":21}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":50}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":27}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":9}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":5}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":78}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":39}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":87}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":30}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":26}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":30}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":29}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":54}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":71}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":9}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":5}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":24}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":25}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":21}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":57}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":27}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":9}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":5}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":38}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":15}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":19}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":44}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":123}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":42}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":6}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":45}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":50}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":75}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":5}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":18}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":4}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":65}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":26}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":59}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":4}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":46}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":12}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":76}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":63}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":37}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":6}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":4}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":2}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":57}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":57}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":57}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":66}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":7}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":62}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":17}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":73}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":45}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":5}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":11}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":85}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":3}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":19}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":1}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":80}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":7}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":47}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":68}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":11}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":83}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":3}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":1}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":63}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":7}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":63}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":17}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":60}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":5}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":11}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":84}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":3}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":12}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":1}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":76}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":7}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":75}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":11}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":82}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":3}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":1}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":57}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":7}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":63}},"755":{"start":{"line":756,"column":0},"end":{"line":756,"column":17}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":54}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":5}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":11}},"759":{"start":{"line":760,"column":0},"end":{"line":760,"column":84}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":3}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":12}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":1}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":70}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":7}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":75}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":11}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":82}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":3}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":1}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":55}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":51}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":51}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":26}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":54}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":43}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":39}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":56}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":66}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":58}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":8}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":48}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":50}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":5}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":44}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":4}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":65}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":54}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":52}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":4}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":79}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":54}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":117}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":24}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":58}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":5}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":18}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":4}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":76}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":54}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":33}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":43}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":48}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":4}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":77}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":54}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":44}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":43}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":48}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":4}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":22}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":20}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":34}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":29}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":18}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":38}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":54}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":46}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":31}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":24}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":11}},"829":{"start":{"line":830,"column":0},"end":{"line":830,"column":13}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":41}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":42}},"832":{"start":{"line":833,"column":0},"end":{"line":833,"column":24}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":43}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":6}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":37}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":46}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":20}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":4}},"840":{"start":{"line":841,"column":0},"end":{"line":841,"column":69}},"841":{"start":{"line":842,"column":0},"end":{"line":842,"column":70}},"842":{"start":{"line":843,"column":0},"end":{"line":843,"column":57}},"844":{"start":{"line":845,"column":0},"end":{"line":845,"column":64}},"847":{"start":{"line":848,"column":0},"end":{"line":848,"column":40}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":31}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":34}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":26}},"851":{"start":{"line":852,"column":0},"end":{"line":852,"column":42}},"852":{"start":{"line":853,"column":0},"end":{"line":853,"column":52}},"853":{"start":{"line":854,"column":0},"end":{"line":854,"column":6}},"854":{"start":{"line":855,"column":0},"end":{"line":855,"column":40}},"856":{"start":{"line":857,"column":0},"end":{"line":857,"column":91}},"857":{"start":{"line":858,"column":0},"end":{"line":858,"column":37}},"858":{"start":{"line":859,"column":0},"end":{"line":859,"column":48}},"859":{"start":{"line":860,"column":0},"end":{"line":860,"column":79}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":5}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":46}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":33}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":54}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":53}},"866":{"start":{"line":867,"column":0},"end":{"line":867,"column":48}},"867":{"start":{"line":868,"column":0},"end":{"line":868,"column":46}},"868":{"start":{"line":869,"column":0},"end":{"line":869,"column":17}},"869":{"start":{"line":870,"column":0},"end":{"line":870,"column":4}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":59}},"872":{"start":{"line":873,"column":0},"end":{"line":873,"column":70}},"873":{"start":{"line":874,"column":0},"end":{"line":874,"column":19}},"874":{"start":{"line":875,"column":0},"end":{"line":875,"column":35}},"875":{"start":{"line":876,"column":0},"end":{"line":876,"column":48}},"876":{"start":{"line":877,"column":0},"end":{"line":877,"column":5}},"877":{"start":{"line":878,"column":0},"end":{"line":878,"column":4}},"879":{"start":{"line":880,"column":0},"end":{"line":880,"column":82}},"880":{"start":{"line":881,"column":0},"end":{"line":881,"column":40}},"881":{"start":{"line":882,"column":0},"end":{"line":882,"column":68}},"882":{"start":{"line":883,"column":0},"end":{"line":883,"column":6}},"883":{"start":{"line":884,"column":0},"end":{"line":884,"column":4}},"885":{"start":{"line":886,"column":0},"end":{"line":886,"column":83}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":54}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":24}},"889":{"start":{"line":890,"column":0},"end":{"line":890,"column":46}},"890":{"start":{"line":891,"column":0},"end":{"line":891,"column":25}},"891":{"start":{"line":892,"column":0},"end":{"line":892,"column":29}},"892":{"start":{"line":893,"column":0},"end":{"line":893,"column":47}},"893":{"start":{"line":894,"column":0},"end":{"line":894,"column":52}},"894":{"start":{"line":895,"column":0},"end":{"line":895,"column":7}},"895":{"start":{"line":896,"column":0},"end":{"line":896,"column":5}},"896":{"start":{"line":897,"column":0},"end":{"line":897,"column":4}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":84}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":81}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":48}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":4}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":77}},"904":{"start":{"line":905,"column":0},"end":{"line":905,"column":96}},"905":{"start":{"line":906,"column":0},"end":{"line":906,"column":57}},"908":{"start":{"line":909,"column":0},"end":{"line":909,"column":61}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":53}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":31}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":24}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":33}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":42}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":43}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":6}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":53}},"917":{"start":{"line":918,"column":0},"end":{"line":918,"column":46}},"920":{"start":{"line":921,"column":0},"end":{"line":921,"column":59}},"921":{"start":{"line":922,"column":0},"end":{"line":922,"column":48}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":4}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":41}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":49}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":4}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":53}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":39}},"930":{"start":{"line":931,"column":0},"end":{"line":931,"column":4}},"931":{"start":{"line":932,"column":0},"end":{"line":932,"column":2}},"934":{"start":{"line":935,"column":0},"end":{"line":935,"column":27}},"935":{"start":{"line":936,"column":0},"end":{"line":936,"column":47}},"937":{"start":{"line":938,"column":0},"end":{"line":938,"column":72}},"938":{"start":{"line":939,"column":0},"end":{"line":939,"column":17}},"939":{"start":{"line":940,"column":0},"end":{"line":940,"column":54}},"940":{"start":{"line":941,"column":0},"end":{"line":941,"column":5}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":4}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":48}},"945":{"start":{"line":946,"column":0},"end":{"line":946,"column":4}},"947":{"start":{"line":948,"column":0},"end":{"line":948,"column":47}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":4}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":58}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":12}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":19}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":17}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":23}},"956":{"start":{"line":957,"column":0},"end":{"line":957,"column":42}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":6}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":4}},"960":{"start":{"line":961,"column":0},"end":{"line":961,"column":62}},"961":{"start":{"line":962,"column":0},"end":{"line":962,"column":55}},"962":{"start":{"line":963,"column":0},"end":{"line":963,"column":21}},"963":{"start":{"line":964,"column":0},"end":{"line":964,"column":27}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":30}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":28}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":27}},"967":{"start":{"line":968,"column":0},"end":{"line":968,"column":36}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":29}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":6}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":4}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":79}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":52}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":4}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":83}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":14}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":4}},"979":{"start":{"line":980,"column":0},"end":{"line":980,"column":2}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":35}},"987":{"start":{"line":988,"column":0},"end":{"line":988,"column":11}},"988":{"start":{"line":989,"column":0},"end":{"line":989,"column":38}},"989":{"start":{"line":990,"column":0},"end":{"line":990,"column":25}},"990":{"start":{"line":991,"column":0},"end":{"line":991,"column":41}},"991":{"start":{"line":992,"column":0},"end":{"line":992,"column":14}},"992":{"start":{"line":993,"column":0},"end":{"line":993,"column":36}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":7}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":6}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":64}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":25}},"998":{"start":{"line":999,"column":0},"end":{"line":999,"column":48}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":7}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":41}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":6}},"1003":{"start":{"line":1004,"column":0},"end":{"line":1004,"column":61}},"1004":{"start":{"line":1005,"column":0},"end":{"line":1005,"column":25}},"1005":{"start":{"line":1006,"column":0},"end":{"line":1006,"column":57}},"1006":{"start":{"line":1007,"column":0},"end":{"line":1007,"column":56}},"1007":{"start":{"line":1008,"column":0},"end":{"line":1008,"column":7}},"1008":{"start":{"line":1009,"column":0},"end":{"line":1009,"column":36}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":6}},"1011":{"start":{"line":1012,"column":0},"end":{"line":1012,"column":77}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":25}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":90}},"1014":{"start":{"line":1015,"column":0},"end":{"line":1015,"column":45}},"1015":{"start":{"line":1016,"column":0},"end":{"line":1016,"column":7}},"1016":{"start":{"line":1017,"column":0},"end":{"line":1017,"column":44}},"1017":{"start":{"line":1018,"column":0},"end":{"line":1018,"column":6}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":50}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":25}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":45}},"1022":{"start":{"line":1023,"column":0},"end":{"line":1023,"column":14}},"1023":{"start":{"line":1024,"column":0},"end":{"line":1024,"column":40}},"1024":{"start":{"line":1025,"column":0},"end":{"line":1025,"column":7}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":6}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":60}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":25}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":54}},"1030":{"start":{"line":1031,"column":0},"end":{"line":1031,"column":7}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":47}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":6}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":46}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":25}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":56}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":38}},"1038":{"start":{"line":1039,"column":0},"end":{"line":1039,"column":7}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":36}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":6}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":49}},"1043":{"start":{"line":1044,"column":0},"end":{"line":1044,"column":25}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":59}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":45}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":7}},"1047":{"start":{"line":1048,"column":0},"end":{"line":1048,"column":37}},"1048":{"start":{"line":1049,"column":0},"end":{"line":1049,"column":6}},"1050":{"start":{"line":1051,"column":0},"end":{"line":1051,"column":65}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":25}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":52}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":15}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":30}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":30}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":45}},"1058":{"start":{"line":1059,"column":0},"end":{"line":1059,"column":34}},"1059":{"start":{"line":1060,"column":0},"end":{"line":1060,"column":38}},"1060":{"start":{"line":1061,"column":0},"end":{"line":1061,"column":52}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":39}},"1062":{"start":{"line":1063,"column":0},"end":{"line":1063,"column":26}},"1063":{"start":{"line":1064,"column":0},"end":{"line":1064,"column":12}},"1064":{"start":{"line":1065,"column":0},"end":{"line":1065,"column":81}},"1065":{"start":{"line":1066,"column":0},"end":{"line":1066,"column":7}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":45}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":6}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":42}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":25}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":44}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":7}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":37}},"1074":{"start":{"line":1075,"column":0},"end":{"line":1075,"column":6}},"1075":{"start":{"line":1076,"column":0},"end":{"line":1076,"column":4}},"1077":{"start":{"line":1078,"column":0},"end":{"line":1078,"column":14}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":79}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":25}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":59}},"1081":{"start":{"line":1082,"column":0},"end":{"line":1082,"column":14}},"1082":{"start":{"line":1083,"column":0},"end":{"line":1083,"column":54}},"1083":{"start":{"line":1084,"column":0},"end":{"line":1084,"column":7}},"1084":{"start":{"line":1085,"column":0},"end":{"line":1085,"column":6}},"1086":{"start":{"line":1087,"column":0},"end":{"line":1087,"column":54}},"1087":{"start":{"line":1088,"column":0},"end":{"line":1088,"column":25}},"1088":{"start":{"line":1089,"column":0},"end":{"line":1089,"column":52}},"1089":{"start":{"line":1090,"column":0},"end":{"line":1090,"column":14}},"1090":{"start":{"line":1091,"column":0},"end":{"line":1091,"column":47}},"1091":{"start":{"line":1092,"column":0},"end":{"line":1092,"column":7}},"1092":{"start":{"line":1093,"column":0},"end":{"line":1093,"column":6}},"1094":{"start":{"line":1095,"column":0},"end":{"line":1095,"column":53}},"1095":{"start":{"line":1096,"column":0},"end":{"line":1096,"column":25}},"1096":{"start":{"line":1097,"column":0},"end":{"line":1097,"column":51}},"1097":{"start":{"line":1098,"column":0},"end":{"line":1098,"column":14}},"1098":{"start":{"line":1099,"column":0},"end":{"line":1099,"column":46}},"1099":{"start":{"line":1100,"column":0},"end":{"line":1100,"column":7}},"1100":{"start":{"line":1101,"column":0},"end":{"line":1101,"column":6}},"1102":{"start":{"line":1103,"column":0},"end":{"line":1103,"column":64}},"1103":{"start":{"line":1104,"column":0},"end":{"line":1104,"column":25}},"1104":{"start":{"line":1105,"column":0},"end":{"line":1105,"column":52}},"1105":{"start":{"line":1106,"column":0},"end":{"line":1106,"column":7}},"1106":{"start":{"line":1107,"column":0},"end":{"line":1107,"column":45}},"1107":{"start":{"line":1108,"column":0},"end":{"line":1108,"column":6}},"1109":{"start":{"line":1110,"column":0},"end":{"line":1110,"column":69}},"1110":{"start":{"line":1111,"column":0},"end":{"line":1111,"column":25}},"1111":{"start":{"line":1112,"column":0},"end":{"line":1112,"column":57}},"1112":{"start":{"line":1113,"column":0},"end":{"line":1113,"column":7}},"1113":{"start":{"line":1114,"column":0},"end":{"line":1114,"column":50}},"1114":{"start":{"line":1115,"column":0},"end":{"line":1115,"column":6}},"1116":{"start":{"line":1117,"column":0},"end":{"line":1117,"column":86}},"1117":{"start":{"line":1118,"column":0},"end":{"line":1118,"column":25}},"1118":{"start":{"line":1119,"column":0},"end":{"line":1119,"column":67}},"1119":{"start":{"line":1120,"column":0},"end":{"line":1120,"column":14}},"1120":{"start":{"line":1121,"column":0},"end":{"line":1121,"column":62}},"1121":{"start":{"line":1122,"column":0},"end":{"line":1122,"column":7}},"1122":{"start":{"line":1123,"column":0},"end":{"line":1123,"column":6}},"1124":{"start":{"line":1125,"column":0},"end":{"line":1125,"column":88}},"1125":{"start":{"line":1126,"column":0},"end":{"line":1126,"column":25}},"1126":{"start":{"line":1127,"column":0},"end":{"line":1127,"column":65}},"1127":{"start":{"line":1128,"column":0},"end":{"line":1128,"column":7}},"1128":{"start":{"line":1129,"column":0},"end":{"line":1129,"column":58}},"1129":{"start":{"line":1130,"column":0},"end":{"line":1130,"column":6}},"1131":{"start":{"line":1132,"column":0},"end":{"line":1132,"column":30}},"1132":{"start":{"line":1133,"column":0},"end":{"line":1133,"column":22}},"1133":{"start":{"line":1134,"column":0},"end":{"line":1134,"column":24}},"1134":{"start":{"line":1135,"column":0},"end":{"line":1135,"column":27}},"1135":{"start":{"line":1136,"column":0},"end":{"line":1136,"column":30}},"1136":{"start":{"line":1137,"column":0},"end":{"line":1137,"column":25}},"1137":{"start":{"line":1138,"column":0},"end":{"line":1138,"column":25}},"1138":{"start":{"line":1139,"column":0},"end":{"line":1139,"column":55}},"1139":{"start":{"line":1140,"column":0},"end":{"line":1140,"column":28}},"1140":{"start":{"line":1141,"column":0},"end":{"line":1141,"column":32}},"1141":{"start":{"line":1142,"column":0},"end":{"line":1142,"column":38}},"1142":{"start":{"line":1143,"column":0},"end":{"line":1143,"column":47}},"1143":{"start":{"line":1144,"column":0},"end":{"line":1144,"column":11}},"1144":{"start":{"line":1145,"column":0},"end":{"line":1145,"column":7}},"1146":{"start":{"line":1147,"column":0},"end":{"line":1147,"column":21}},"1147":{"start":{"line":1148,"column":0},"end":{"line":1148,"column":18}},"1148":{"start":{"line":1149,"column":0},"end":{"line":1149,"column":21}},"1149":{"start":{"line":1150,"column":0},"end":{"line":1150,"column":25}},"1150":{"start":{"line":1151,"column":0},"end":{"line":1151,"column":46}},"1151":{"start":{"line":1152,"column":0},"end":{"line":1152,"column":8}},"1152":{"start":{"line":1153,"column":0},"end":{"line":1153,"column":83}},"1153":{"start":{"line":1154,"column":0},"end":{"line":1154,"column":6}},"1155":{"start":{"line":1156,"column":0},"end":{"line":1156,"column":89}},"1156":{"start":{"line":1157,"column":0},"end":{"line":1157,"column":25}},"1157":{"start":{"line":1158,"column":0},"end":{"line":1158,"column":53}},"1158":{"start":{"line":1159,"column":0},"end":{"line":1159,"column":28}},"1159":{"start":{"line":1160,"column":0},"end":{"line":1160,"column":42}},"1160":{"start":{"line":1161,"column":0},"end":{"line":1161,"column":11}},"1161":{"start":{"line":1162,"column":0},"end":{"line":1162,"column":7}},"1163":{"start":{"line":1164,"column":0},"end":{"line":1164,"column":49}},"1164":{"start":{"line":1165,"column":0},"end":{"line":1165,"column":47}},"1165":{"start":{"line":1166,"column":0},"end":{"line":1166,"column":56}},"1166":{"start":{"line":1167,"column":0},"end":{"line":1167,"column":69}},"1167":{"start":{"line":1168,"column":0},"end":{"line":1168,"column":58}},"1168":{"start":{"line":1169,"column":0},"end":{"line":1169,"column":6}},"1170":{"start":{"line":1171,"column":0},"end":{"line":1171,"column":66}},"1171":{"start":{"line":1172,"column":0},"end":{"line":1172,"column":25}},"1172":{"start":{"line":1173,"column":0},"end":{"line":1173,"column":54}},"1173":{"start":{"line":1174,"column":0},"end":{"line":1174,"column":28}},"1174":{"start":{"line":1175,"column":0},"end":{"line":1175,"column":11}},"1175":{"start":{"line":1176,"column":0},"end":{"line":1176,"column":7}},"1177":{"start":{"line":1178,"column":0},"end":{"line":1178,"column":90}},"1178":{"start":{"line":1179,"column":0},"end":{"line":1179,"column":6}},"1179":{"start":{"line":1180,"column":0},"end":{"line":1180,"column":4}},"1181":{"start":{"line":1182,"column":0},"end":{"line":1182,"column":14}},"1182":{"start":{"line":1183,"column":0},"end":{"line":1183,"column":62}},"1183":{"start":{"line":1184,"column":0},"end":{"line":1184,"column":25}},"1184":{"start":{"line":1185,"column":0},"end":{"line":1185,"column":59}},"1185":{"start":{"line":1186,"column":0},"end":{"line":1186,"column":7}},"1186":{"start":{"line":1187,"column":0},"end":{"line":1187,"column":52}},"1187":{"start":{"line":1188,"column":0},"end":{"line":1188,"column":6}},"1189":{"start":{"line":1190,"column":0},"end":{"line":1190,"column":88}},"1190":{"start":{"line":1191,"column":0},"end":{"line":1191,"column":25}},"1191":{"start":{"line":1192,"column":0},"end":{"line":1192,"column":71}},"1192":{"start":{"line":1193,"column":0},"end":{"line":1193,"column":7}},"1193":{"start":{"line":1194,"column":0},"end":{"line":1194,"column":64}},"1194":{"start":{"line":1195,"column":0},"end":{"line":1195,"column":6}},"1196":{"start":{"line":1197,"column":0},"end":{"line":1197,"column":27}},"1197":{"start":{"line":1198,"column":0},"end":{"line":1198,"column":37}},"1198":{"start":{"line":1199,"column":0},"end":{"line":1199,"column":31}},"1199":{"start":{"line":1200,"column":0},"end":{"line":1200,"column":36}},"1200":{"start":{"line":1201,"column":0},"end":{"line":1201,"column":25}},"1201":{"start":{"line":1202,"column":0},"end":{"line":1202,"column":71}},"1202":{"start":{"line":1203,"column":0},"end":{"line":1203,"column":7}},"1203":{"start":{"line":1204,"column":0},"end":{"line":1204,"column":64}},"1204":{"start":{"line":1205,"column":0},"end":{"line":1205,"column":6}},"1206":{"start":{"line":1207,"column":0},"end":{"line":1207,"column":20}},"1207":{"start":{"line":1208,"column":0},"end":{"line":1208,"column":37}},"1208":{"start":{"line":1209,"column":0},"end":{"line":1209,"column":22}},"1209":{"start":{"line":1210,"column":0},"end":{"line":1210,"column":30}},"1210":{"start":{"line":1211,"column":0},"end":{"line":1211,"column":31}},"1211":{"start":{"line":1212,"column":0},"end":{"line":1212,"column":37}},"1212":{"start":{"line":1213,"column":0},"end":{"line":1213,"column":25}},"1213":{"start":{"line":1214,"column":0},"end":{"line":1214,"column":89}},"1214":{"start":{"line":1215,"column":0},"end":{"line":1215,"column":7}},"1215":{"start":{"line":1216,"column":0},"end":{"line":1216,"column":82}},"1216":{"start":{"line":1217,"column":0},"end":{"line":1217,"column":6}},"1217":{"start":{"line":1218,"column":0},"end":{"line":1218,"column":4}},"1219":{"start":{"line":1220,"column":0},"end":{"line":1220,"column":15}},"1220":{"start":{"line":1221,"column":0},"end":{"line":1221,"column":63}},"1221":{"start":{"line":1222,"column":0},"end":{"line":1222,"column":25}},"1222":{"start":{"line":1223,"column":0},"end":{"line":1223,"column":51}},"1223":{"start":{"line":1224,"column":0},"end":{"line":1224,"column":14}},"1224":{"start":{"line":1225,"column":0},"end":{"line":1225,"column":46}},"1225":{"start":{"line":1226,"column":0},"end":{"line":1226,"column":7}},"1226":{"start":{"line":1227,"column":0},"end":{"line":1227,"column":6}},"1228":{"start":{"line":1229,"column":0},"end":{"line":1229,"column":52}},"1229":{"start":{"line":1230,"column":0},"end":{"line":1230,"column":25}},"1230":{"start":{"line":1231,"column":0},"end":{"line":1231,"column":59}},"1231":{"start":{"line":1232,"column":0},"end":{"line":1232,"column":14}},"1232":{"start":{"line":1233,"column":0},"end":{"line":1233,"column":54}},"1233":{"start":{"line":1234,"column":0},"end":{"line":1234,"column":7}},"1234":{"start":{"line":1235,"column":0},"end":{"line":1235,"column":6}},"1236":{"start":{"line":1237,"column":0},"end":{"line":1237,"column":50}},"1237":{"start":{"line":1238,"column":0},"end":{"line":1238,"column":25}},"1238":{"start":{"line":1239,"column":0},"end":{"line":1239,"column":55}},"1239":{"start":{"line":1240,"column":0},"end":{"line":1240,"column":7}},"1240":{"start":{"line":1241,"column":0},"end":{"line":1241,"column":48}},"1241":{"start":{"line":1242,"column":0},"end":{"line":1242,"column":6}},"1243":{"start":{"line":1244,"column":0},"end":{"line":1244,"column":104}},"1244":{"start":{"line":1245,"column":0},"end":{"line":1245,"column":25}},"1245":{"start":{"line":1246,"column":0},"end":{"line":1246,"column":66}},"1246":{"start":{"line":1247,"column":0},"end":{"line":1247,"column":7}},"1247":{"start":{"line":1248,"column":0},"end":{"line":1248,"column":59}},"1248":{"start":{"line":1249,"column":0},"end":{"line":1249,"column":6}},"1250":{"start":{"line":1251,"column":0},"end":{"line":1251,"column":72}},"1251":{"start":{"line":1252,"column":0},"end":{"line":1252,"column":25}},"1252":{"start":{"line":1253,"column":0},"end":{"line":1253,"column":57}},"1253":{"start":{"line":1254,"column":0},"end":{"line":1254,"column":7}},"1254":{"start":{"line":1255,"column":0},"end":{"line":1255,"column":50}},"1255":{"start":{"line":1256,"column":0},"end":{"line":1256,"column":6}},"1257":{"start":{"line":1258,"column":0},"end":{"line":1258,"column":53}},"1258":{"start":{"line":1259,"column":0},"end":{"line":1259,"column":25}},"1259":{"start":{"line":1260,"column":0},"end":{"line":1260,"column":50}},"1260":{"start":{"line":1261,"column":0},"end":{"line":1261,"column":7}},"1261":{"start":{"line":1262,"column":0},"end":{"line":1262,"column":43}},"1262":{"start":{"line":1263,"column":0},"end":{"line":1263,"column":6}},"1263":{"start":{"line":1264,"column":0},"end":{"line":1264,"column":4}},"1265":{"start":{"line":1266,"column":0},"end":{"line":1266,"column":13}},"1266":{"start":{"line":1267,"column":0},"end":{"line":1267,"column":61}},"1267":{"start":{"line":1268,"column":0},"end":{"line":1268,"column":25}},"1268":{"start":{"line":1269,"column":0},"end":{"line":1269,"column":50}},"1269":{"start":{"line":1270,"column":0},"end":{"line":1270,"column":7}},"1270":{"start":{"line":1271,"column":0},"end":{"line":1271,"column":43}},"1271":{"start":{"line":1272,"column":0},"end":{"line":1272,"column":6}},"1273":{"start":{"line":1274,"column":0},"end":{"line":1274,"column":72}},"1274":{"start":{"line":1275,"column":0},"end":{"line":1275,"column":25}},"1275":{"start":{"line":1276,"column":0},"end":{"line":1276,"column":60}},"1276":{"start":{"line":1277,"column":0},"end":{"line":1277,"column":7}},"1277":{"start":{"line":1278,"column":0},"end":{"line":1278,"column":53}},"1278":{"start":{"line":1279,"column":0},"end":{"line":1279,"column":6}},"1280":{"start":{"line":1281,"column":0},"end":{"line":1281,"column":86}},"1281":{"start":{"line":1282,"column":0},"end":{"line":1282,"column":25}},"1282":{"start":{"line":1283,"column":0},"end":{"line":1283,"column":73}},"1283":{"start":{"line":1284,"column":0},"end":{"line":1284,"column":7}},"1284":{"start":{"line":1285,"column":0},"end":{"line":1285,"column":66}},"1285":{"start":{"line":1286,"column":0},"end":{"line":1286,"column":6}},"1287":{"start":{"line":1288,"column":0},"end":{"line":1288,"column":83}},"1288":{"start":{"line":1289,"column":0},"end":{"line":1289,"column":25}},"1289":{"start":{"line":1290,"column":0},"end":{"line":1290,"column":72}},"1290":{"start":{"line":1291,"column":0},"end":{"line":1291,"column":14}},"1291":{"start":{"line":1292,"column":0},"end":{"line":1292,"column":67}},"1292":{"start":{"line":1293,"column":0},"end":{"line":1293,"column":7}},"1293":{"start":{"line":1294,"column":0},"end":{"line":1294,"column":6}},"1295":{"start":{"line":1296,"column":0},"end":{"line":1296,"column":84}},"1296":{"start":{"line":1297,"column":0},"end":{"line":1297,"column":25}},"1297":{"start":{"line":1298,"column":0},"end":{"line":1298,"column":73}},"1298":{"start":{"line":1299,"column":0},"end":{"line":1299,"column":14}},"1299":{"start":{"line":1300,"column":0},"end":{"line":1300,"column":68}},"1300":{"start":{"line":1301,"column":0},"end":{"line":1301,"column":7}},"1301":{"start":{"line":1302,"column":0},"end":{"line":1302,"column":6}},"1303":{"start":{"line":1304,"column":0},"end":{"line":1304,"column":26}},"1304":{"start":{"line":1305,"column":0},"end":{"line":1305,"column":22}},"1305":{"start":{"line":1306,"column":0},"end":{"line":1306,"column":36}},"1306":{"start":{"line":1307,"column":0},"end":{"line":1307,"column":31}},"1307":{"start":{"line":1308,"column":0},"end":{"line":1308,"column":20}},"1308":{"start":{"line":1309,"column":0},"end":{"line":1309,"column":43}},"1309":{"start":{"line":1310,"column":0},"end":{"line":1310,"column":25}},"1310":{"start":{"line":1311,"column":0},"end":{"line":1311,"column":92}},"1311":{"start":{"line":1312,"column":0},"end":{"line":1312,"column":7}},"1312":{"start":{"line":1313,"column":0},"end":{"line":1313,"column":85}},"1313":{"start":{"line":1314,"column":0},"end":{"line":1314,"column":6}},"1315":{"start":{"line":1316,"column":0},"end":{"line":1316,"column":76}},"1316":{"start":{"line":1317,"column":0},"end":{"line":1317,"column":25}},"1317":{"start":{"line":1318,"column":0},"end":{"line":1318,"column":65}},"1318":{"start":{"line":1319,"column":0},"end":{"line":1319,"column":7}},"1319":{"start":{"line":1320,"column":0},"end":{"line":1320,"column":58}},"1320":{"start":{"line":1321,"column":0},"end":{"line":1321,"column":6}},"1322":{"start":{"line":1323,"column":0},"end":{"line":1323,"column":66}},"1323":{"start":{"line":1324,"column":0},"end":{"line":1324,"column":25}},"1324":{"start":{"line":1325,"column":0},"end":{"line":1325,"column":63}},"1325":{"start":{"line":1326,"column":0},"end":{"line":1326,"column":14}},"1326":{"start":{"line":1327,"column":0},"end":{"line":1327,"column":58}},"1327":{"start":{"line":1328,"column":0},"end":{"line":1328,"column":7}},"1328":{"start":{"line":1329,"column":0},"end":{"line":1329,"column":6}},"1330":{"start":{"line":1331,"column":0},"end":{"line":1331,"column":89}},"1331":{"start":{"line":1332,"column":0},"end":{"line":1332,"column":25}},"1332":{"start":{"line":1333,"column":0},"end":{"line":1333,"column":66}},"1333":{"start":{"line":1334,"column":0},"end":{"line":1334,"column":7}},"1334":{"start":{"line":1335,"column":0},"end":{"line":1335,"column":59}},"1335":{"start":{"line":1336,"column":0},"end":{"line":1336,"column":6}},"1337":{"start":{"line":1338,"column":0},"end":{"line":1338,"column":90}},"1338":{"start":{"line":1339,"column":0},"end":{"line":1339,"column":25}},"1339":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":71}},"1340":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":14}},"1341":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":66}},"1342":{"start":{"line":1343,"column":0},"end":{"line":1343,"column":7}},"1343":{"start":{"line":1344,"column":0},"end":{"line":1344,"column":6}},"1345":{"start":{"line":1346,"column":0},"end":{"line":1346,"column":91}},"1346":{"start":{"line":1347,"column":0},"end":{"line":1347,"column":25}},"1347":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":66}},"1348":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":7}},"1349":{"start":{"line":1350,"column":0},"end":{"line":1350,"column":59}},"1350":{"start":{"line":1351,"column":0},"end":{"line":1351,"column":6}},"1352":{"start":{"line":1353,"column":0},"end":{"line":1353,"column":84}},"1353":{"start":{"line":1354,"column":0},"end":{"line":1354,"column":25}},"1354":{"start":{"line":1355,"column":0},"end":{"line":1355,"column":73}},"1355":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":14}},"1356":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":68}},"1357":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":7}},"1358":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":6}},"1360":{"start":{"line":1361,"column":0},"end":{"line":1361,"column":48}},"1361":{"start":{"line":1362,"column":0},"end":{"line":1362,"column":25}},"1362":{"start":{"line":1363,"column":0},"end":{"line":1363,"column":50}},"1363":{"start":{"line":1364,"column":0},"end":{"line":1364,"column":7}},"1364":{"start":{"line":1365,"column":0},"end":{"line":1365,"column":43}},"1365":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":6}},"1367":{"start":{"line":1368,"column":0},"end":{"line":1368,"column":60}},"1368":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":25}},"1369":{"start":{"line":1370,"column":0},"end":{"line":1370,"column":57}},"1370":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":14}},"1371":{"start":{"line":1372,"column":0},"end":{"line":1372,"column":52}},"1372":{"start":{"line":1373,"column":0},"end":{"line":1373,"column":7}},"1373":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":6}},"1374":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":4}},"1375":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":2}},"1377":{"start":{"line":1378,"column":0},"end":{"line":1378,"column":34}}},"s":{"0":0,"69":0,"70":0,"71":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"345":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"359":0,"360":0,"361":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"372":0,"373":0,"375":0,"377":0,"378":0,"379":0,"380":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"396":0,"397":0,"398":0,"399":0,"401":0,"402":0,"403":0,"404":0,"406":0,"407":0,"408":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"430":0,"431":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"447":0,"448":0,"449":0,"450":0,"452":0,"453":0,"454":0,"455":0,"457":0,"458":0,"459":0,"462":0,"463":0,"464":0,"465":0,"466":0,"468":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"480":0,"481":0,"482":0,"483":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"492":0,"493":0,"494":0,"495":0,"498":0,"499":0,"501":0,"502":0,"503":0,"504":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"537":0,"538":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"553":0,"554":0,"555":0,"556":0,"558":0,"560":0,"562":0,"563":0,"564":0,"566":0,"567":0,"568":0,"570":0,"571":0,"572":0,"575":0,"576":0,"577":0,"580":0,"581":0,"582":0,"583":0,"586":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"683":0,"684":0,"685":0,"686":0,"688":0,"689":0,"691":0,"692":0,"693":0,"694":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"706":0,"707":0,"708":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"772":0,"773":0,"774":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"790":0,"791":0,"792":0,"793":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"840":0,"841":0,"842":0,"844":0,"847":0,"848":0,"849":0,"850":0,"851":0,"852":0,"853":0,"854":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"863":0,"864":0,"865":0,"866":0,"867":0,"868":0,"869":0,"871":0,"872":0,"873":0,"874":0,"875":0,"876":0,"877":0,"879":0,"880":0,"881":0,"882":0,"883":0,"885":0,"886":0,"887":0,"889":0,"890":0,"891":0,"892":0,"893":0,"894":0,"895":0,"896":0,"898":0,"899":0,"900":0,"901":0,"903":0,"904":0,"905":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"920":0,"921":0,"922":0,"924":0,"925":0,"926":0,"928":0,"929":0,"930":0,"931":0,"934":0,"935":0,"937":0,"938":0,"939":0,"940":0,"941":0,"943":0,"945":0,"947":0,"949":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"972":0,"973":0,"974":0,"976":0,"977":0,"978":0,"979":0,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":0,"996":0,"997":0,"998":0,"999":0,"1000":0,"1001":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1019":0,"1020":0,"1021":0,"1022":0,"1023":0,"1024":0,"1025":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":0,"1032":0,"1034":0,"1035":0,"1036":0,"1037":0,"1038":0,"1039":0,"1040":0,"1042":0,"1043":0,"1044":0,"1045":0,"1046":0,"1047":0,"1048":0,"1050":0,"1051":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":0,"1058":0,"1059":0,"1060":0,"1061":0,"1062":0,"1063":0,"1064":0,"1065":0,"1066":0,"1067":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1074":0,"1075":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1116":0,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1177":0,"1178":0,"1179":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1196":0,"1197":0,"1198":0,"1199":0,"1200":0,"1201":0,"1202":0,"1203":0,"1204":0,"1206":0,"1207":0,"1208":0,"1209":0,"1210":0,"1211":0,"1212":0,"1213":0,"1214":0,"1215":0,"1216":0,"1217":0,"1219":0,"1220":0,"1221":0,"1222":0,"1223":0,"1224":0,"1225":0,"1226":0,"1228":0,"1229":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1236":0,"1237":0,"1238":0,"1239":0,"1240":0,"1241":0,"1243":0,"1244":0,"1245":0,"1246":0,"1247":0,"1248":0,"1250":0,"1251":0,"1252":0,"1253":0,"1254":0,"1255":0,"1257":0,"1258":0,"1259":0,"1260":0,"1261":0,"1262":0,"1263":0,"1265":0,"1266":0,"1267":0,"1268":0,"1269":0,"1270":0,"1271":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1278":0,"1280":0,"1281":0,"1282":0,"1283":0,"1284":0,"1285":0,"1287":0,"1288":0,"1289":0,"1290":0,"1291":0,"1292":0,"1293":0,"1295":0,"1296":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1303":0,"1304":0,"1305":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1315":0,"1316":0,"1317":0,"1318":0,"1319":0,"1320":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1327":0,"1328":0,"1330":0,"1331":0,"1332":0,"1333":0,"1334":0,"1335":0,"1337":0,"1338":0,"1339":0,"1340":0,"1341":0,"1342":0,"1343":0,"1345":0,"1346":0,"1347":0,"1348":0,"1349":0,"1350":0,"1352":0,"1353":0,"1354":0,"1355":0,"1356":0,"1357":0,"1358":0,"1360":0,"1361":0,"1362":0,"1363":0,"1364":0,"1365":0,"1367":0,"1368":0,"1369":0,"1370":0,"1371":0,"1372":0,"1373":0,"1374":0,"1375":0,"1377":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":41317},"end":{"line":1378,"column":34}},"locations":[{"start":{"line":1,"column":41317},"end":{"line":1378,"column":34}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":41317},"end":{"line":1378,"column":34}},"loc":{"start":{"line":1,"column":41317},"end":{"line":1378,"column":34}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\json-utils.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\json-utils.ts","all":true,"statementMap":{"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":90}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":7}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":39}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":35}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":19}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":93}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":85}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":87}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":21}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":26}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":25}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":6}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":73}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":54}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":22}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":72}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":40}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":24}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":91}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":22}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":1}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":61}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":7}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":26}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":16}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":11}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":17}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":76}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":33}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":19}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":92}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":65}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":20}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":94}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":7}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":92}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":72}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":3}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":1}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":43}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":48}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":1}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":60}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":50}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":19}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":88}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":66}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":20}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":1}}},"s":{"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"63":0,"64":0,"65":0,"66":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"153":0,"154":0,"155":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5321},"end":{"line":173,"column":1}},"locations":[{"start":{"line":1,"column":5321},"end":{"line":173,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5321},"end":{"line":173,"column":1}},"loc":{"start":{"line":1,"column":5321},"end":{"line":173,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\kernel-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\kernel-client.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":43}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":82}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":211}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":16}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":43}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":66}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":33}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":27}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":76}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":89}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":28}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":17}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":7}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":39}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":87}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":27}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":16}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":11}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":84}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":29}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":18}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":13}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":81}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":30}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":19}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":5}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":3}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":1}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":27}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":50}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":65}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":51}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":38}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":36}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":51}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":22}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":6}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":29}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":38}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":3}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":24}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":29}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":38}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":41}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":25}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":31}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":22}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":34}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":32}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":9}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":79}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":48}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":7}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":29}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":39}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":33}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":35}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":45}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":57}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":8}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":63}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":41}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":35}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":42}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":39}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":47}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":9}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":64}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":22}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":9}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":33}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":45}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":30}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":43}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":14}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":72}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":60}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":41}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":64}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":49}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":46}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":32}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":49}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":23}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":41}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":35}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":11}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":39}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":7}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":33}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":65}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":61}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":28}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":76}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":36}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":72}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":70}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":3}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":38}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":26}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":34}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":29}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":58}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":3}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":44}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":45}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":62}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":62}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":80}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":56}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":16}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":27}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":41}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":43}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":50}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":59}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":45}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":48}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":8}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":7}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":3}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":53}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":47}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":3}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":13}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":20}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":12}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":72}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":57}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":19}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":44}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":5}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":63}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":16}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":16}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":16}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":8}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":7}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":12}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":33}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":34}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":33}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":6}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":3}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":19}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":20}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":31}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":12}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":33}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":38}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":48}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":57}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":19}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":46}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":23}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":5}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":43}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":9}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":78}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":38}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":46}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":17}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":9}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":42}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":35}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":23}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":49}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":18}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":28}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":93}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":35}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":31}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":33}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":50}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":18}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":16}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":13}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":18}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":26}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":92}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":35}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":31}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":33}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":19}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":50}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":16}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":13}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":18}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":33}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":116}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":18}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":26}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":110}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":84}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":27}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":25}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":30}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":13}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":18}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":23}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":79}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":51}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":27}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":25}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":30}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":13}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":18}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":9}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":9}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":41}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":18}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":18}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":20}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":18}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":10}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":9}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":28}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":76}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":38}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":21}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":19}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":7}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":5}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":21}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":3}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":38}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":3}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":55}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":31}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":3}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":44}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":34}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":3}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":31}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":31}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":3}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":65}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":41}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":57}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":5}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":41}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":3}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":52}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":63}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":12}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":38}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":36}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":46}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":40}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":6}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":3}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":30}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":6}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":38}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":21}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":34}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":3}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":40}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":6}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":40}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":3}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":113}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":90}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":15}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":26}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":7}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":64}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":3}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":99}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":64}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":3}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":115}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":79}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":3}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":78}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":60}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":3}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":89}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":6}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":9}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":72}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":13}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":26}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":5}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":3}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":31}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":6}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":39}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":22}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":36}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":3}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":51}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":6}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":39}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":57}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":36}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":3}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":76}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":6}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":36}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":9}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":18}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":25}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":7}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":3}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":33}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":6}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":9}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":43}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":26}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":26}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":21}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":89}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":30}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":5}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":3}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":41}},"807":{"start":{"line":808,"column":0},"end":{"line":808,"column":13}},"808":{"start":{"line":809,"column":0},"end":{"line":809,"column":9}},"809":{"start":{"line":810,"column":0},"end":{"line":810,"column":27}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":39}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":21}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":94}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":18}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":5}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":3}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":32}},"848":{"start":{"line":849,"column":0},"end":{"line":849,"column":13}},"849":{"start":{"line":850,"column":0},"end":{"line":850,"column":9}},"850":{"start":{"line":851,"column":0},"end":{"line":851,"column":27}},"860":{"start":{"line":861,"column":0},"end":{"line":861,"column":49}},"861":{"start":{"line":862,"column":0},"end":{"line":862,"column":21}},"862":{"start":{"line":863,"column":0},"end":{"line":863,"column":105}},"863":{"start":{"line":864,"column":0},"end":{"line":864,"column":18}},"864":{"start":{"line":865,"column":0},"end":{"line":865,"column":5}},"865":{"start":{"line":866,"column":0},"end":{"line":866,"column":3}},"871":{"start":{"line":872,"column":0},"end":{"line":872,"column":44}},"886":{"start":{"line":887,"column":0},"end":{"line":887,"column":6}},"887":{"start":{"line":888,"column":0},"end":{"line":888,"column":9}},"888":{"start":{"line":889,"column":0},"end":{"line":889,"column":27}},"898":{"start":{"line":899,"column":0},"end":{"line":899,"column":44}},"899":{"start":{"line":900,"column":0},"end":{"line":900,"column":21}},"900":{"start":{"line":901,"column":0},"end":{"line":901,"column":97}},"901":{"start":{"line":902,"column":0},"end":{"line":902,"column":18}},"902":{"start":{"line":903,"column":0},"end":{"line":903,"column":5}},"903":{"start":{"line":904,"column":0},"end":{"line":904,"column":3}},"909":{"start":{"line":910,"column":0},"end":{"line":910,"column":50}},"910":{"start":{"line":911,"column":0},"end":{"line":911,"column":9}},"911":{"start":{"line":912,"column":0},"end":{"line":912,"column":45}},"912":{"start":{"line":913,"column":0},"end":{"line":913,"column":21}},"913":{"start":{"line":914,"column":0},"end":{"line":914,"column":97}},"914":{"start":{"line":915,"column":0},"end":{"line":915,"column":18}},"915":{"start":{"line":916,"column":0},"end":{"line":916,"column":5}},"916":{"start":{"line":917,"column":0},"end":{"line":917,"column":3}},"922":{"start":{"line":923,"column":0},"end":{"line":923,"column":103}},"923":{"start":{"line":924,"column":0},"end":{"line":924,"column":9}},"924":{"start":{"line":925,"column":0},"end":{"line":925,"column":98}},"925":{"start":{"line":926,"column":0},"end":{"line":926,"column":21}},"926":{"start":{"line":927,"column":0},"end":{"line":927,"column":98}},"927":{"start":{"line":928,"column":0},"end":{"line":928,"column":18}},"928":{"start":{"line":929,"column":0},"end":{"line":929,"column":5}},"929":{"start":{"line":930,"column":0},"end":{"line":930,"column":3}},"933":{"start":{"line":934,"column":0},"end":{"line":934,"column":50}},"941":{"start":{"line":942,"column":0},"end":{"line":942,"column":6}},"942":{"start":{"line":943,"column":0},"end":{"line":943,"column":9}},"943":{"start":{"line":944,"column":0},"end":{"line":944,"column":44}},"949":{"start":{"line":950,"column":0},"end":{"line":950,"column":27}},"950":{"start":{"line":951,"column":0},"end":{"line":951,"column":27}},"951":{"start":{"line":952,"column":0},"end":{"line":952,"column":21}},"952":{"start":{"line":953,"column":0},"end":{"line":953,"column":67}},"953":{"start":{"line":954,"column":0},"end":{"line":954,"column":31}},"954":{"start":{"line":955,"column":0},"end":{"line":955,"column":5}},"955":{"start":{"line":956,"column":0},"end":{"line":956,"column":3}},"957":{"start":{"line":958,"column":0},"end":{"line":958,"column":98}},"958":{"start":{"line":959,"column":0},"end":{"line":959,"column":76}},"959":{"start":{"line":960,"column":0},"end":{"line":960,"column":3}},"964":{"start":{"line":965,"column":0},"end":{"line":965,"column":35}},"965":{"start":{"line":966,"column":0},"end":{"line":966,"column":50}},"966":{"start":{"line":967,"column":0},"end":{"line":967,"column":3}},"968":{"start":{"line":969,"column":0},"end":{"line":969,"column":54}},"969":{"start":{"line":970,"column":0},"end":{"line":970,"column":66}},"970":{"start":{"line":971,"column":0},"end":{"line":971,"column":3}},"972":{"start":{"line":973,"column":0},"end":{"line":973,"column":72}},"973":{"start":{"line":974,"column":0},"end":{"line":974,"column":66}},"974":{"start":{"line":975,"column":0},"end":{"line":975,"column":3}},"976":{"start":{"line":977,"column":0},"end":{"line":977,"column":71}},"977":{"start":{"line":978,"column":0},"end":{"line":978,"column":66}},"978":{"start":{"line":979,"column":0},"end":{"line":979,"column":3}},"980":{"start":{"line":981,"column":0},"end":{"line":981,"column":57}},"981":{"start":{"line":982,"column":0},"end":{"line":982,"column":66}},"982":{"start":{"line":983,"column":0},"end":{"line":983,"column":3}},"984":{"start":{"line":985,"column":0},"end":{"line":985,"column":73}},"985":{"start":{"line":986,"column":0},"end":{"line":986,"column":66}},"986":{"start":{"line":987,"column":0},"end":{"line":987,"column":3}},"993":{"start":{"line":994,"column":0},"end":{"line":994,"column":58}},"994":{"start":{"line":995,"column":0},"end":{"line":995,"column":42}},"995":{"start":{"line":996,"column":0},"end":{"line":996,"column":48}},"996":{"start":{"line":997,"column":0},"end":{"line":997,"column":5}},"997":{"start":{"line":998,"column":0},"end":{"line":998,"column":50}},"999":{"start":{"line":1000,"column":0},"end":{"line":1000,"column":18}},"1000":{"start":{"line":1001,"column":0},"end":{"line":1001,"column":55}},"1001":{"start":{"line":1002,"column":0},"end":{"line":1002,"column":6}},"1002":{"start":{"line":1003,"column":0},"end":{"line":1003,"column":3}},"1009":{"start":{"line":1010,"column":0},"end":{"line":1010,"column":177}},"1012":{"start":{"line":1013,"column":0},"end":{"line":1013,"column":20}},"1013":{"start":{"line":1014,"column":0},"end":{"line":1014,"column":3}},"1019":{"start":{"line":1020,"column":0},"end":{"line":1020,"column":128}},"1020":{"start":{"line":1021,"column":0},"end":{"line":1021,"column":59}},"1021":{"start":{"line":1022,"column":0},"end":{"line":1022,"column":3}},"1025":{"start":{"line":1026,"column":0},"end":{"line":1026,"column":50}},"1026":{"start":{"line":1027,"column":0},"end":{"line":1027,"column":23}},"1027":{"start":{"line":1028,"column":0},"end":{"line":1028,"column":32}},"1028":{"start":{"line":1029,"column":0},"end":{"line":1029,"column":35}},"1029":{"start":{"line":1030,"column":0},"end":{"line":1030,"column":3}},"1031":{"start":{"line":1032,"column":0},"end":{"line":1032,"column":60}},"1032":{"start":{"line":1033,"column":0},"end":{"line":1033,"column":53}},"1033":{"start":{"line":1034,"column":0},"end":{"line":1034,"column":20}},"1034":{"start":{"line":1035,"column":0},"end":{"line":1035,"column":35}},"1035":{"start":{"line":1036,"column":0},"end":{"line":1036,"column":13}},"1036":{"start":{"line":1037,"column":0},"end":{"line":1037,"column":22}},"1037":{"start":{"line":1038,"column":0},"end":{"line":1038,"column":17}},"1039":{"start":{"line":1040,"column":0},"end":{"line":1040,"column":9}},"1040":{"start":{"line":1041,"column":0},"end":{"line":1041,"column":7}},"1041":{"start":{"line":1042,"column":0},"end":{"line":1042,"column":5}},"1042":{"start":{"line":1043,"column":0},"end":{"line":1043,"column":3}},"1044":{"start":{"line":1045,"column":0},"end":{"line":1045,"column":53}},"1045":{"start":{"line":1046,"column":0},"end":{"line":1046,"column":33}},"1046":{"start":{"line":1047,"column":0},"end":{"line":1047,"column":3}},"1051":{"start":{"line":1052,"column":0},"end":{"line":1052,"column":47}},"1052":{"start":{"line":1053,"column":0},"end":{"line":1053,"column":33}},"1053":{"start":{"line":1054,"column":0},"end":{"line":1054,"column":27}},"1054":{"start":{"line":1055,"column":0},"end":{"line":1055,"column":5}},"1055":{"start":{"line":1056,"column":0},"end":{"line":1056,"column":25}},"1056":{"start":{"line":1057,"column":0},"end":{"line":1057,"column":3}},"1057":{"start":{"line":1058,"column":0},"end":{"line":1058,"column":1}},"1061":{"start":{"line":1062,"column":0},"end":{"line":1062,"column":40}},"1066":{"start":{"line":1067,"column":0},"end":{"line":1067,"column":101}},"1067":{"start":{"line":1068,"column":0},"end":{"line":1068,"column":17}},"1068":{"start":{"line":1069,"column":0},"end":{"line":1069,"column":37}},"1069":{"start":{"line":1070,"column":0},"end":{"line":1070,"column":20}},"1070":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":32}},"1071":{"start":{"line":1072,"column":0},"end":{"line":1072,"column":3}},"1072":{"start":{"line":1073,"column":0},"end":{"line":1073,"column":17}},"1073":{"start":{"line":1074,"column":0},"end":{"line":1074,"column":1}},"1078":{"start":{"line":1079,"column":0},"end":{"line":1079,"column":54}},"1079":{"start":{"line":1080,"column":0},"end":{"line":1080,"column":26}},"1080":{"start":{"line":1081,"column":0},"end":{"line":1081,"column":1}}},"s":{"0":1,"132":1,"133":0,"134":0,"135":0,"136":0,"143":1,"145":0,"146":0,"147":0,"148":0,"151":0,"152":0,"153":0,"154":0,"155":0,"158":0,"160":0,"161":0,"162":0,"163":0,"164":0,"166":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"185":1,"186":1,"187":0,"188":0,"189":0,"190":0,"193":0,"194":0,"196":1,"203":0,"205":0,"206":0,"207":0,"208":0,"210":1,"217":0,"218":0,"219":0,"220":0,"221":0,"226":1,"227":0,"228":0,"230":1,"231":0,"232":0,"237":1,"240":0,"242":0,"244":0,"245":0,"246":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"271":0,"272":0,"273":0,"274":0,"277":0,"278":0,"280":0,"281":0,"282":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"308":1,"309":0,"310":0,"315":1,"316":0,"317":0,"318":0,"319":0,"326":1,"327":0,"328":0,"333":1,"334":0,"335":0,"340":1,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"357":1,"358":0,"359":0,"366":1,"367":0,"368":0,"372":0,"373":0,"375":0,"376":0,"377":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"396":1,"397":0,"398":0,"399":0,"403":0,"404":0,"405":0,"406":0,"408":0,"409":0,"410":0,"411":0,"413":0,"415":0,"417":0,"418":0,"421":0,"422":0,"423":0,"425":0,"427":0,"428":0,"429":0,"430":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"457":0,"459":0,"460":0,"461":0,"463":0,"464":0,"465":0,"466":0,"467":0,"469":0,"470":0,"471":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"494":0,"495":0,"496":0,"497":0,"499":0,"500":0,"505":1,"507":0,"514":1,"515":0,"516":0,"521":1,"522":0,"523":0,"528":1,"529":0,"530":0,"537":1,"538":0,"539":0,"540":0,"541":0,"542":0,"547":1,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"562":1,"576":0,"577":0,"589":0,"590":0,"591":0,"596":1,"612":0,"613":0,"614":0,"619":1,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"630":1,"631":0,"632":0,"637":1,"638":0,"639":0,"644":1,"645":0,"646":0,"651":1,"664":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"678":1,"691":0,"692":0,"703":0,"704":0,"705":0,"710":1,"723":0,"724":0,"735":0,"736":0,"737":0,"742":1,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"761":1,"773":0,"774":0,"775":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"797":1,"807":0,"808":0,"809":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"830":1,"848":0,"849":0,"850":0,"860":0,"861":0,"862":0,"863":0,"864":0,"865":0,"871":1,"886":0,"887":0,"888":0,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"909":1,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"922":1,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"933":1,"941":0,"942":0,"943":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"957":1,"958":0,"959":0,"964":1,"965":0,"966":0,"968":1,"969":0,"970":0,"972":1,"973":0,"974":0,"976":1,"977":0,"978":0,"980":1,"981":0,"982":0,"984":1,"985":0,"986":0,"993":1,"994":0,"995":0,"996":0,"997":0,"999":0,"1000":0,"1001":0,"1002":0,"1009":1,"1012":0,"1013":0,"1019":1,"1020":0,"1021":0,"1025":1,"1026":0,"1027":0,"1028":0,"1029":0,"1031":1,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":0,"1039":0,"1040":0,"1041":0,"1042":0,"1044":1,"1045":0,"1046":0,"1051":1,"1052":0,"1053":0,"1054":0,"1055":0,"1056":0,"1057":1,"1061":1,"1066":1,"1067":0,"1068":0,"1069":0,"1070":0,"1071":0,"1072":0,"1073":0,"1078":1,"1079":0,"1080":0},"branchMap":{"0":{"type":"branch","line":187,"loc":{"start":{"line":187,"column":10},"end":{"line":195,"column":51}},"locations":[{"start":{"line":187,"column":10},"end":{"line":195,"column":51}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"isTauriRuntime","decl":{"start":{"line":133,"column":7},"end":{"line":137,"column":1}},"loc":{"start":{"line":133,"column":7},"end":{"line":137,"column":1}},"line":133},"1":{"name":"probeTauriAvailability","decl":{"start":{"line":146,"column":0},"end":{"line":178,"column":1}},"loc":{"start":{"line":146,"column":0},"end":{"line":178,"column":1}},"line":146},"2":{"name":"","decl":{"start":{"line":187,"column":10},"end":{"line":195,"column":51}},"loc":{"start":{"line":187,"column":10},"end":{"line":195,"column":51}},"line":187},"3":{"name":"KernelClient","decl":{"start":{"line":197,"column":2},"end":{"line":209,"column":3}},"loc":{"start":{"line":197,"column":2},"end":{"line":209,"column":3}},"line":197},"4":{"name":"updateOptions","decl":{"start":{"line":211,"column":2},"end":{"line":222,"column":3}},"loc":{"start":{"line":211,"column":2},"end":{"line":222,"column":3}},"line":211},"5":{"name":"setConfig","decl":{"start":{"line":227,"column":2},"end":{"line":229,"column":3}},"loc":{"start":{"line":227,"column":2},"end":{"line":229,"column":3}},"line":227},"6":{"name":"getState","decl":{"start":{"line":231,"column":2},"end":{"line":233,"column":3}},"loc":{"start":{"line":231,"column":2},"end":{"line":233,"column":3}},"line":231},"7":{"name":"connect","decl":{"start":{"line":238,"column":2},"end":{"line":304,"column":3}},"loc":{"start":{"line":238,"column":2},"end":{"line":304,"column":3}},"line":238},"8":{"name":"connectRest","decl":{"start":{"line":309,"column":2},"end":{"line":311,"column":3}},"loc":{"start":{"line":309,"column":2},"end":{"line":311,"column":3}},"line":309},"9":{"name":"disconnect","decl":{"start":{"line":316,"column":2},"end":{"line":320,"column":3}},"loc":{"start":{"line":316,"column":2},"end":{"line":320,"column":3}},"line":316},"10":{"name":"listAgents","decl":{"start":{"line":327,"column":2},"end":{"line":329,"column":3}},"loc":{"start":{"line":327,"column":2},"end":{"line":329,"column":3}},"line":327},"11":{"name":"getAgent","decl":{"start":{"line":334,"column":2},"end":{"line":336,"column":3}},"loc":{"start":{"line":334,"column":2},"end":{"line":336,"column":3}},"line":334},"12":{"name":"createAgent","decl":{"start":{"line":341,"column":2},"end":{"line":353,"column":3}},"loc":{"start":{"line":341,"column":2},"end":{"line":353,"column":3}},"line":341},"13":{"name":"deleteAgent","decl":{"start":{"line":358,"column":2},"end":{"line":360,"column":3}},"loc":{"start":{"line":358,"column":2},"end":{"line":360,"column":3}},"line":358},"14":{"name":"chat","decl":{"start":{"line":367,"column":2},"end":{"line":392,"column":3}},"loc":{"start":{"line":367,"column":2},"end":{"line":392,"column":3}},"line":367},"15":{"name":"chatStream","decl":{"start":{"line":397,"column":2},"end":{"line":501,"column":3}},"loc":{"start":{"line":397,"column":2},"end":{"line":501,"column":3}},"line":397},"16":{"name":"cancelStream","decl":{"start":{"line":506,"column":2},"end":{"line":508,"column":3}},"loc":{"start":{"line":506,"column":2},"end":{"line":508,"column":3}},"line":506},"17":{"name":"fetchDefaultAgentId","decl":{"start":{"line":515,"column":2},"end":{"line":517,"column":3}},"loc":{"start":{"line":515,"column":2},"end":{"line":517,"column":3}},"line":515},"18":{"name":"setDefaultAgentId","decl":{"start":{"line":522,"column":2},"end":{"line":524,"column":3}},"loc":{"start":{"line":522,"column":2},"end":{"line":524,"column":3}},"line":522},"19":{"name":"getDefaultAgentId","decl":{"start":{"line":529,"column":2},"end":{"line":531,"column":3}},"loc":{"start":{"line":529,"column":2},"end":{"line":531,"column":3}},"line":529},"20":{"name":"health","decl":{"start":{"line":538,"column":2},"end":{"line":543,"column":3}},"loc":{"start":{"line":538,"column":2},"end":{"line":543,"column":3}},"line":538},"21":{"name":"status","decl":{"start":{"line":548,"column":2},"end":{"line":556,"column":3}},"loc":{"start":{"line":548,"column":2},"end":{"line":556,"column":3}},"line":548},"22":{"name":"listHands","decl":{"start":{"line":563,"column":2},"end":{"line":592,"column":3}},"loc":{"start":{"line":563,"column":2},"end":{"line":592,"column":3}},"line":563},"23":{"name":"getHand","decl":{"start":{"line":597,"column":2},"end":{"line":615,"column":3}},"loc":{"start":{"line":597,"column":2},"end":{"line":615,"column":3}},"line":597},"24":{"name":"triggerHand","decl":{"start":{"line":620,"column":2},"end":{"line":626,"column":3}},"loc":{"start":{"line":620,"column":2},"end":{"line":626,"column":3}},"line":620},"25":{"name":"getHandStatus","decl":{"start":{"line":631,"column":2},"end":{"line":633,"column":3}},"loc":{"start":{"line":631,"column":2},"end":{"line":633,"column":3}},"line":631},"26":{"name":"approveHand","decl":{"start":{"line":638,"column":2},"end":{"line":640,"column":3}},"loc":{"start":{"line":638,"column":2},"end":{"line":640,"column":3}},"line":638},"27":{"name":"cancelHand","decl":{"start":{"line":645,"column":2},"end":{"line":647,"column":3}},"loc":{"start":{"line":645,"column":2},"end":{"line":647,"column":3}},"line":645},"28":{"name":"listHandRuns","decl":{"start":{"line":652,"column":2},"end":{"line":672,"column":3}},"loc":{"start":{"line":652,"column":2},"end":{"line":672,"column":3}},"line":652},"29":{"name":"listSkills","decl":{"start":{"line":679,"column":2},"end":{"line":706,"column":3}},"loc":{"start":{"line":679,"column":2},"end":{"line":706,"column":3}},"line":679},"30":{"name":"refreshSkills","decl":{"start":{"line":711,"column":2},"end":{"line":738,"column":3}},"loc":{"start":{"line":711,"column":2},"end":{"line":738,"column":3}},"line":711},"31":{"name":"executeSkill","decl":{"start":{"line":743,"column":2},"end":{"line":754,"column":3}},"loc":{"start":{"line":743,"column":2},"end":{"line":754,"column":3}},"line":743},"32":{"name":"listTriggers","decl":{"start":{"line":762,"column":2},"end":{"line":792,"column":3}},"loc":{"start":{"line":762,"column":2},"end":{"line":792,"column":3}},"line":762},"33":{"name":"getTrigger","decl":{"start":{"line":798,"column":2},"end":{"line":825,"column":3}},"loc":{"start":{"line":798,"column":2},"end":{"line":825,"column":3}},"line":798},"34":{"name":"createTrigger","decl":{"start":{"line":831,"column":2},"end":{"line":866,"column":3}},"loc":{"start":{"line":831,"column":2},"end":{"line":866,"column":3}},"line":831},"35":{"name":"updateTrigger","decl":{"start":{"line":872,"column":2},"end":{"line":904,"column":3}},"loc":{"start":{"line":872,"column":2},"end":{"line":904,"column":3}},"line":872},"36":{"name":"deleteTrigger","decl":{"start":{"line":910,"column":2},"end":{"line":917,"column":3}},"loc":{"start":{"line":910,"column":2},"end":{"line":917,"column":3}},"line":910},"37":{"name":"executeTrigger","decl":{"start":{"line":923,"column":2},"end":{"line":930,"column":3}},"loc":{"start":{"line":923,"column":2},"end":{"line":930,"column":3}},"line":923},"38":{"name":"listApprovals","decl":{"start":{"line":934,"column":2},"end":{"line":956,"column":3}},"loc":{"start":{"line":934,"column":2},"end":{"line":956,"column":3}},"line":934},"39":{"name":"respondToApproval","decl":{"start":{"line":958,"column":2},"end":{"line":960,"column":3}},"loc":{"start":{"line":958,"column":2},"end":{"line":960,"column":3}},"line":958},"40":{"name":"getRestBaseUrl","decl":{"start":{"line":965,"column":9},"end":{"line":967,"column":3}},"loc":{"start":{"line":965,"column":9},"end":{"line":967,"column":3}},"line":965},"41":{"name":"restGet","decl":{"start":{"line":969,"column":2},"end":{"line":971,"column":3}},"loc":{"start":{"line":969,"column":2},"end":{"line":971,"column":3}},"line":969},"42":{"name":"restPost","decl":{"start":{"line":973,"column":2},"end":{"line":975,"column":3}},"loc":{"start":{"line":973,"column":2},"end":{"line":975,"column":3}},"line":973},"43":{"name":"restPut","decl":{"start":{"line":977,"column":2},"end":{"line":979,"column":3}},"loc":{"start":{"line":977,"column":2},"end":{"line":979,"column":3}},"line":977},"44":{"name":"restDelete","decl":{"start":{"line":981,"column":2},"end":{"line":983,"column":3}},"loc":{"start":{"line":981,"column":2},"end":{"line":983,"column":3}},"line":981},"45":{"name":"restPatch","decl":{"start":{"line":985,"column":2},"end":{"line":987,"column":3}},"loc":{"start":{"line":985,"column":2},"end":{"line":987,"column":3}},"line":985},"46":{"name":"on","decl":{"start":{"line":994,"column":2},"end":{"line":1003,"column":3}},"loc":{"start":{"line":994,"column":2},"end":{"line":1003,"column":3}},"line":994},"47":{"name":"onAgentStream","decl":{"start":{"line":1010,"column":2},"end":{"line":1014,"column":3}},"loc":{"start":{"line":1010,"column":2},"end":{"line":1014,"column":3}},"line":1010},"48":{"name":"verifyAuditLogChain","decl":{"start":{"line":1020,"column":2},"end":{"line":1022,"column":3}},"loc":{"start":{"line":1020,"column":2},"end":{"line":1022,"column":3}},"line":1020},"49":{"name":"setState","decl":{"start":{"line":1026,"column":10},"end":{"line":1030,"column":3}},"loc":{"start":{"line":1026,"column":10},"end":{"line":1030,"column":3}},"line":1026},"50":{"name":"emitEvent","decl":{"start":{"line":1032,"column":10},"end":{"line":1043,"column":3}},"loc":{"start":{"line":1032,"column":10},"end":{"line":1043,"column":3}},"line":1032},"51":{"name":"log","decl":{"start":{"line":1045,"column":10},"end":{"line":1047,"column":3}},"loc":{"start":{"line":1045,"column":10},"end":{"line":1047,"column":3}},"line":1045},"52":{"name":"formatError","decl":{"start":{"line":1052,"column":10},"end":{"line":1057,"column":3}},"loc":{"start":{"line":1052,"column":10},"end":{"line":1057,"column":3}},"line":1052},"53":{"name":"getKernelClient","decl":{"start":{"line":1067,"column":7},"end":{"line":1074,"column":1}},"loc":{"start":{"line":1067,"column":7},"end":{"line":1074,"column":1}},"line":1067},"54":{"name":"isInternalKernelAvailable","decl":{"start":{"line":1079,"column":7},"end":{"line":1081,"column":1}},"loc":{"start":{"line":1079,"column":7},"end":{"line":1081,"column":1}},"line":1079}},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\llm-service.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\llm-service.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":57}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":23}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":28}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":37}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":20}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":4}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":15}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":56}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":20}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":21}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":19}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":12}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":24}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":24}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":20}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":21}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":9}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":21}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":19}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":19}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":17}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":2}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":51}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":35}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":64}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":60}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":54}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":47}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":64}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":11}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":42}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":25}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":34}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":45}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":12}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":10}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":11}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":25}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":39}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":31}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":12}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":10}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":30}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":73}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":49}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":75}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":34}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":19}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":70}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":10}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":9}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":55}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":5}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":12}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":24}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":77}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":26}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":6}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":3}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":26}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":30}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":18}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":1}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":53}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":28}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":34}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":59}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":94}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":50}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":33}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":25}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":57}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":5}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":72}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":16}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":43}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":49}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":8}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":28}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":17}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":37}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":40}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":9}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":59}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":7}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":23}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":46}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":32}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":56}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":7}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":81}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":5}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":39}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":45}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":12}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":55}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":19}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":46}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":51}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":8}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":24}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":16}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":6}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":26}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":32}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":30}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":20}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":3}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":1}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":57}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":28}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":34}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":63}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":94}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":50}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":33}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":25}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":61}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":5}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":72}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":21}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":16}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":43}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":49}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":8}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":28}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":28}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":17}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":37}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":40}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":9}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":59}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":7}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":23}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":46}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":32}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":60}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":7}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":85}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":5}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":39}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":45}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":12}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":55}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":19}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":46}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":51}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":8}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":24}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":16}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":6}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":3}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":26}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":32}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":3}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":30}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":24}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":3}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":1}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":54}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":28}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":34}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":60}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":3}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":94}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":50}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":33}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":81}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":77}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":36}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":44}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":20}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":52}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":38}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":18}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":11}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":64}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":71}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":119}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":20}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":69}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":32}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":12}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":11}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":49}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":16}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":42}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":23}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":46}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":48}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":12}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":20}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":10}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":21}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":84}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":16}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":22}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":46}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":44}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":10}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":7}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":80}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":68}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":21}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":16}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":43}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":8}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":28}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":37}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":89}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":9}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":59}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":7}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":23}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":42}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":36}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":59}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":25}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":58}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":32}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":32}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":41}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":51}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":13}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":63}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":11}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":35}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":89}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":9}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":51}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":49}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":16}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":55}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":89}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":20}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":10}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":7}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":76}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":5}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":39}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":45}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":12}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":51}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":85}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":16}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":6}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":3}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":26}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":41}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":3}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":30}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":21}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":1}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":51}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":82}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":35}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":52}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":33}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":18}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":47}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":22}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":51}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":19}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":48}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":16}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":12}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":45}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":1}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":52}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":23}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":39}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":3}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":23}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":1}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":41}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":23}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":1}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":41}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":38}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":32}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":3}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":7}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":55}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":16}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":31}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":5}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":11}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":3}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":33}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":1}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":53}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":44}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":35}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":27}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":67}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":20}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":1}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":28}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":15}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":60}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":48}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":4}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":15}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":44}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":54}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":13}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":4}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":15}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":40}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":55}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":15}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":4}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":2}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":97}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":41}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":39}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":63}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":68}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":5}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":26}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":1}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":98}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":41}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":39}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":63}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":69}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":5}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":26}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":1}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":33}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":23}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":29}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":20}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":41}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":39}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":63}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":73}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":5}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":26}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":1}}},"s":{"0":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"89":0,"93":0,"94":0,"96":0,"98":0,"100":0,"102":0,"103":0,"106":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"149":0,"151":0,"152":0,"153":0,"154":0,"158":0,"159":0,"161":0,"162":0,"163":0,"165":0,"166":0,"167":0,"169":0,"170":0,"171":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"188":0,"189":0,"191":0,"192":0,"193":0,"195":0,"196":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"219":0,"223":0,"224":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"234":0,"235":0,"236":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"253":0,"254":0,"256":0,"257":0,"258":0,"260":0,"261":0,"263":0,"264":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"277":0,"278":0,"279":0,"281":0,"282":0,"283":0,"284":0,"288":0,"289":0,"291":0,"292":0,"293":0,"295":0,"296":0,"297":0,"300":0,"301":0,"304":0,"305":0,"306":0,"310":0,"311":0,"313":0,"315":0,"316":0,"319":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"349":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"364":0,"365":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"379":0,"380":0,"381":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"394":0,"395":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"404":0,"406":0,"407":0,"409":0,"410":0,"411":0,"412":0,"416":0,"418":0,"419":0,"420":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"442":0,"443":0,"444":0,"448":0,"449":0,"450":0,"451":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"463":0,"464":0,"466":0,"467":0,"470":0,"471":0,"473":0,"474":0,"475":0,"479":0,"480":0,"481":0,"502":0,"504":0,"507":0,"509":0,"510":0,"518":0,"520":0,"521":0,"523":0,"524":0,"541":0,"543":0,"546":0,"547":0,"551":0,"552":0,"554":0,"555":0,"556":0,"557":0,"559":0,"560":0,"562":0,"563":0,"565":0,"566":0,"567":0,"568":0,"570":0,"571":0,"573":0,"574":0,"575":0,"576":0,"577":0,"579":0,"580":0,"581":0,"582":0,"584":0,"585":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":15392},"end":{"line":586,"column":1}},"locations":[{"start":{"line":1,"column":15392},"end":{"line":586,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":15392},"end":{"line":586,"column":1}},"loc":{"start":{"line":1,"column":15392},"end":{"line":586,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\memory-extractor.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\memory-extractor.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":46}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":60}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":69}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":27}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":77}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":31}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":28}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":2}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":30}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":35}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":33}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":51}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":62}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":29}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":11}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":42}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":23}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":83}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":7}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":5}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":32}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":36}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":28}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":36}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":32}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":82}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":76}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":76}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":5}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":91}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":137}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":69}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":80}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":76}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":5}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":41}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":35}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":86}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":11}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":79}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":64}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":23}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":73}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":46}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":9}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":79}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":59}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":7}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":67}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":57}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":103}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":96}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":134}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":18}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":35}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":11}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":47}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":28}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":33}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":32}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":38}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":25}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":26}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":42}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":11}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":16}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":15}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":18}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":7}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":35}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":92}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":33}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":11}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":78}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":144}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":34}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":73}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":7}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":20}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":106}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":68}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":3}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":95}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":37}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":63}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":69}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":20}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":77}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":53}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":81}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":38}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":85}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":37}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":36}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":42}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":36}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":5}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":95}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":64}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":67}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":26}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":54}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":50}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":42}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":35}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":6}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":41}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":44}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":36}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":40}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":57}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":22}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":20}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":25}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":26}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":37}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":13}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":9}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":7}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":5}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":73}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":26}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":50}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":38}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":37}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":43}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":6}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":41}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":44}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":36}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":40}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":56}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":22}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":31}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":26}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":51}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":13}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":9}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":7}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":3}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":67}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":26}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":44}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":50}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":6}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":41}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":44}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":36}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":40}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":57}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":22}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":20}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":25}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":45}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":13}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":9}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":5}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":25}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":28}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":32}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":26}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":11}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":42}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":30}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":48}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":43}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":8}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":45}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":46}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":38}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":42}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":60}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":22}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":29}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":28}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":49}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":15}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":11}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":9}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":7}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":3}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":66}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":37}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":63}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":69}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":20}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":48}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":3}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":62}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":9}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":54}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":32}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":46}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":44}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":19}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":50}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":68}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":9}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":50}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":40}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":40}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":73}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":70}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":12}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":13}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":80}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":16}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":3}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":1}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":45}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":55}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":19}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":38}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":3}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":19}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":1}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":46}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":19}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":1}}},"s":{"0":0,"60":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"93":0,"94":0,"95":0,"96":0,"98":0,"99":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"125":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"135":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"159":0,"160":0,"163":0,"164":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"196":0,"197":0,"198":0,"200":0,"201":0,"207":0,"208":0,"209":0,"210":0,"211":0,"214":0,"217":0,"218":0,"224":0,"225":0,"226":0,"228":0,"230":0,"232":0,"234":0,"235":0,"238":0,"239":0,"241":0,"242":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"315":0,"316":0,"317":0,"318":0,"319":0,"321":0,"323":0,"324":0,"325":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"349":0,"350":0,"351":0,"352":0,"353":0,"355":0,"356":0,"362":0,"363":0,"365":0,"366":0,"368":0,"369":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"390":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"399":0,"400":0,"401":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":12554},"end":{"line":402,"column":1}},"locations":[{"start":{"line":1,"column":12554},"end":{"line":402,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":12554},"end":{"line":402,"column":1}},"loc":{"start":{"line":1,"column":12554},"end":{"line":402,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\message-virtualization.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\message-virtualization.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":49}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":11}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":17}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":12}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":12}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":16}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":13}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":2}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":39}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":58}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":33}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":50}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":60}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":50}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":32}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":43}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":71}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":6}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":20}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":71}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":47}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":29}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":41}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":45}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":54}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":7}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":6}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":50}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":49}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":80}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":24}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":62}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":67}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":62}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":5}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":24}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":46}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":9}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":19}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":58}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":23}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":5}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":52}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":40}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":10}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":12}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":14}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":14}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":16}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":15}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":4}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":1}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":30}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":61}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":35}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":38}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":27}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":27}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":26}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":3}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":35}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":16}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":50}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":23}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":42}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":35}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":7}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":21}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":35}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":30}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":50}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":23}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":42}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":5}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":53}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":46}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":19}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":34}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":7}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":5}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":57}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":31}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":3}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":29}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":31}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":32}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":48}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":21}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":40}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":3}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":17}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":23}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":26}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":22}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":27}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":3}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":24}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":33}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":3}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":1}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":40}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":36}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":67}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":22}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":61}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":29}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":27}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":27}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":17}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":20}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":30}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":23}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":5}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":4}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":10}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":32}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":26}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":46}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":16}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":30}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":57}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":7}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":6}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":10}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":24}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":17}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":22}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":32}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":25}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":7}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":6}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":37}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":4}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":1}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":38}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":20}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":18}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":33}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":25}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":6}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":66}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":36}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":48}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":3}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":49}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":44}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":29}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":18}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":3}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":33}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":37}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":16}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":1}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":69}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":26}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":1}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":38}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":20}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":26}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":37}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":22}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":35}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":24}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":16}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":32}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":45}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":41}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":48}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":40}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":12}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":5}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":31}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":3}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":48}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":20}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":45}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":41}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":31}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":37}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":56}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":12}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":5}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":3}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":24}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":1}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":45}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":40}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":21}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":32}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":61}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":20}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":39}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":26}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":20}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":30}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":5}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":34}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":26}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":23}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":14}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":4}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":1}}},"s":{"0":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"116":0,"117":0,"118":0,"119":0,"121":0,"122":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"137":0,"138":0,"139":0,"140":0,"141":0,"146":0,"147":0,"148":0,"149":0,"150":0,"155":0,"156":0,"157":0,"162":0,"163":0,"165":0,"166":0,"167":0,"168":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"199":0,"200":0,"201":0,"202":0,"204":0,"205":0,"206":0,"207":0,"208":0,"214":0,"215":0,"216":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"232":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"249":0,"250":0,"251":0,"256":0,"257":0,"258":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"274":0,"275":0,"276":0,"277":0,"282":0,"283":0,"284":0,"289":0,"290":0,"291":0,"292":0,"327":0,"328":0,"329":0,"335":0,"336":0,"337":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"350":0,"351":0,"352":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"389":0,"390":0,"391":0,"392":0,"393":0,"396":0,"397":0,"398":0,"399":0,"402":0,"403":0,"404":0,"405":0,"415":0,"416":0,"417":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"461":0,"462":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":12685},"end":{"line":495,"column":2}},"locations":[{"start":{"line":1,"column":12685},"end":{"line":495,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":12685},"end":{"line":495,"column":2}},"loc":{"start":{"line":1,"column":12685},"end":{"line":495,"column":2}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\personality-presets.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\personality-presets.ts","all":true,"statementMap":{"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":57}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":3}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":23}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":18}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":30}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":22}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":40}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":51}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":4}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":19}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":18}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":30}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":18}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":41}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":50}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":4}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":18}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":30}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":21}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":44}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":49}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":18}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":18}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":16}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":39}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":46}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":45}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":18}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":32}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":52}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":4}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":3}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":18}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":18}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":20}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":51}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":18}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":34}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":52}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":3}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":15}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":18}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":33}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":21}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":52}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":20}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":51}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":3}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":17}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":36}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":19}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":60}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":19}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":18}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":51}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":20}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":34}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":22}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":51}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":4}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":3}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":16}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":16}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":29}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":27}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":17}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":4}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":2}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":30}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":60}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":58}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":40}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":2}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":27}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":27}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":27}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":31}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":2}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":64}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":3}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":15}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":39}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":34}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":4}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":3}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":15}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":28}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":36}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":4}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":3}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":15}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":38}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":4}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":3}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":15}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":29}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":38}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":4}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":15}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":28}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":26}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":4}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":3}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":15}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":24}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":27}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":4}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":3}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":26}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":40}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":4}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":3}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":15}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":26}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":36}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":4}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":2}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":79}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":54}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":1}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":70}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":48}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":1}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":87}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":45}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":47}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":3}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":56}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":64}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":4}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":90}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":1}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":48}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":12}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":72}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":20}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":17}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":33}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":10}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":3}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":59}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":42}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":36}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":46}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":22}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":19}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":36}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":50}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":5}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":20}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":62}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":28}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":61}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":5}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":3}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":26}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":35}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":1}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":45}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":12}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":82}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":86}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":24}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":13}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":47}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":22}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":25}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":27}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":53}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":19}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":62}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":30}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":1}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":76}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":17}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":1}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":45}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":12}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":51}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":24}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":13}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":47}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":22}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":25}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":42}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":17}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":49}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":19}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":40}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":5}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":22}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":3}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":50}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":54}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":29}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":1}}},"s":{"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"141":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"199":0,"200":0,"201":0,"206":0,"207":0,"208":0,"213":0,"214":0,"216":0,"217":0,"220":0,"221":0,"222":0,"225":0,"226":0,"231":0,"237":0,"238":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"249":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"271":0,"273":0,"274":0,"279":0,"285":0,"286":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"295":0,"297":0,"302":0,"303":0,"304":0,"305":0,"309":0,"313":0,"327":0,"332":0,"336":0,"337":0,"339":0,"340":0,"341":0,"342":0,"343":0,"345":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"355":0,"357":0,"359":0,"360":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":8033},"end":{"line":361,"column":1}},"locations":[{"start":{"line":1,"column":8033},"end":{"line":361,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":8033},"end":{"line":361,"column":1}},"loc":{"start":{"line":1,"column":8033},"end":{"line":361,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\pipeline-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\pipeline-client.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":40}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":31}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":71}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":44}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":9}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":23}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":56}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":60}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":5}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":3}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":71}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":9}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":67}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":22}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":68}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":58}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":87}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":9}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":74}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":9}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":21}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":54}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":58}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":5}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":73}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":79}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":14}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":22}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":21}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":71}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":58}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":5}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":3}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":71}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":75}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":14}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":9}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":21}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":69}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":56}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":5}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":53}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":9}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":49}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":21}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":61}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":56}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":59}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":9}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":72}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":18}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":21}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":51}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":55}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":5}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":3}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":51}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":9}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":73}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":21}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":59}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":63}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":3}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":52}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":26}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":74}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":30}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":7}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":26}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":57}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":33}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":35}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":54}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":72}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":23}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":27}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":7}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":74}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":45}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":18}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":3}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":1}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":55}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":43}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":17}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":17}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":19}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":17}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":15}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":17}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":4}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":31}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":1}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":58}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":17}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":18}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":16}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":16}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":18}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":15}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":19}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":19}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":18}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":18}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":24}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":16}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":16}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":18}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":12}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":18}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":3}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":1}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":31}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":30}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":33}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":41}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":30}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":31}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":37}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":84}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":55}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":15}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":5}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":48}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":15}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":30}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":20}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":40}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":60}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":9}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":14}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":21}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":41}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":61}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":9}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":14}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":20}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":81}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":62}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":9}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":14}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":26}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":36}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":60}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":46}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":82}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":35}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":63}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":11}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":9}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":14}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":5}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":3}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":10}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":31}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":11}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":4}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":1}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":64}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":65}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":47}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":58}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":49}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":21}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":19}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":9}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":57}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":35}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":9}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":27}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":19}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":65}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":15}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":24}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":5}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":25}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":43}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":21}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":19}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":9}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":52}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":39}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":63}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":17}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":29}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":19}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":65}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":15}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":24}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":5}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":25}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":20}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":22}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":19}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":57}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":75}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":43}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":5}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":68}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":10}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":14}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":12}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":10}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":12}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":26}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":4}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":1}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":69}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":48}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":77}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":58}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":26}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":68}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":23}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":21}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":24}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":11}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":55}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":33}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":18}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":27}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":36}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":11}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":10}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":28}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":37}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":22}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":74}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":27}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":18}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":17}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":26}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":7}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":6}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":13}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":4}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":42}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":26}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":50}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":24}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":5}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":24}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":10}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":8}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":11}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":13}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":10}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":4}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":1}}},"s":{"0":0,"71":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"202":0,"203":0,"204":0,"205":0,"206":0,"208":0,"211":0,"213":0,"214":0,"215":0,"216":0,"218":0,"219":0,"220":0,"222":0,"223":0,"224":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"270":0,"271":0,"272":0,"273":0,"274":0,"276":0,"277":0,"280":0,"281":0,"282":0,"283":0,"286":0,"287":0,"288":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"321":0,"322":0,"323":0,"324":0,"336":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"359":0,"360":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"374":0,"375":0,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"398":0,"399":0,"400":0,"401":0,"403":0,"404":0,"405":0,"406":0,"407":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":11162},"end":{"line":447,"column":1}},"locations":[{"start":{"line":1,"column":11162},"end":{"line":447,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":11162},"end":{"line":447,"column":1}},"loc":{"start":{"line":1,"column":11162},"end":{"line":447,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\pipeline-recommender.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\pipeline-recommender.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":42}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":15}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":32}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":18}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":30}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":6}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":26}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":38}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":4}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":32}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":23}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":23}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":23}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":6}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":26}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":37}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":4}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":15}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":30}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":30}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":23}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":23}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":6}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":22}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":34}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":24}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":15}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":30}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":23}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":23}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":6}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":25}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":36}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":15}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":23}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":23}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":6}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":29}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":34}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":24}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":4}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":47}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":23}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":4}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":2}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":34}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":37}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":33}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":9}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":60}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":30}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":78}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":34}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":9}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":54}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":21}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":81}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":3}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":71}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":28}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":30}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":5}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":44}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":38}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":42}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":41}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":34}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":60}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":12}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":8}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":49}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":31}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":84}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":36}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":88}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":7}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":87}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":55}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":7}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":49}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":48}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":47}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":38}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":52}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":19}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":26}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":69}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":77}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":10}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":72}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":43}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":9}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":7}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":5}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":50}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":25}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":27}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":30}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":22}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":13}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":26}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":34}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":32}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":44}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":37}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":91}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":56}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":3}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":69}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":34}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":66}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":55}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":54}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":36}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":71}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":42}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":7}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":22}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":5}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":24}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":47}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":30}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":41}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":36}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":31}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":6}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":61}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":3}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":1}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":61}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":91}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":66}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":56}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":48}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":19}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":37}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":64}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":38}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":60}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":21}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":9}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":59}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":51}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":58}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":15}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":24}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":5}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":43}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":10}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":14}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":16}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":12}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":51}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":53}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":93}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":4}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":1}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":35}}},"s":{"0":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"95":0,"96":0,"97":0,"98":0,"99":0,"103":0,"104":0,"105":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"135":0,"136":0,"137":0,"138":0,"140":0,"142":0,"143":0,"144":0,"145":0,"147":0,"149":0,"150":0,"151":0,"152":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"164":0,"166":0,"167":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"183":0,"184":0,"185":0,"186":0,"187":0,"190":0,"191":0,"192":0,"193":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"208":0,"209":0,"210":0,"212":0,"213":0,"218":0,"219":0,"220":0,"221":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"231":0,"233":0,"234":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"252":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"295":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":7677},"end":{"line":296,"column":35}},"locations":[{"start":{"line":1,"column":7677},"end":{"line":296,"column":35}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":7677},"end":{"line":296,"column":35}},"loc":{"start":{"line":1,"column":7677},"end":{"line":296,"column":35}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\request-helper.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\request-helper.ts","all":false,"statementMap":{"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":17}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":13}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":19}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":42}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":23}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":2}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":41}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":35}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":39}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":41}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":19}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":79}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":44}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":24}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":67}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":3}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":26}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":3}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":50}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":54}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":19}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":40}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":1}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":43}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":57}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":26}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":20}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":18}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":57}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":11}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":60}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":59}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":52}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":42}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":39}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":14}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":28}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":28}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":9}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":45}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":45}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":51}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":45}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":13}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":44}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":24}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":56}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":68}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":41}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":19}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":34}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":9}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":25}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":13}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":47}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":17}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":28}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":9}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":39}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":70}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":30}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":22}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":69}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":64}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":69}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":74}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":12}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":31}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":9}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":7}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":22}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":21}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":42}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":26}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":62}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":64}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":23}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":65}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":74}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":12}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":31}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":19}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":9}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":7}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":66}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":46}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":47}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":14}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":27}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":10}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":32}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":64}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":51}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":74}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":12}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":31}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":35}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":19}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":9}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":27}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":7}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":51}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":20}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":7}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":29}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":65}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":10}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":60}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":8}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":3}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":92}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":1}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":47}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":14}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":28}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":64}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":7}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":33}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":19}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":27}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":99}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":8}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":20}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":43}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":6}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":3}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":1}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":29}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":59}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":60}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":70}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":35}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":29}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":45}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":41}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":17}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":42}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":22}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":3}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":15}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":16}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":30}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":30}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":24}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":54}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":46}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":12}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":9}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":21}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":36}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":10}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":14}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":8}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":34}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":37}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":22}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":21}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":34}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":37}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":18}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":3}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":40}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":15}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":16}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":30}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":30}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":17}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":73}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":9}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":35}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":21}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":29}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":101}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":10}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":22}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":45}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":8}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":5}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":3}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":38}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":48}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":21}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":25}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":34}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":37}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":18}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":17}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":3}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":40}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":36}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":3}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":35}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":47}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":3}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":21}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":50}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":25}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":63}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":7}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":29}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":32}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":3}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":29}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":33}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":3}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":1}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":57}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":26}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":14}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":24}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":24}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":22}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":67}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":1}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":27}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":14}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":17}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":24}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":24}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":22}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":26}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":8}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":5}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":21}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":16}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":43}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":19}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":8}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":52}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":6}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":10}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":4}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":1}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":26}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":14}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":17}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":24}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":24}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":22}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":26}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":8}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":5}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":20}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":16}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":43}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":19}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":8}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":52}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":6}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":10}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":4}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":1}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":26}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":14}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":24}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":24}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":22}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":70}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":1}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":28}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":14}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":17}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":24}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":24}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":22}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":26}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":8}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":5}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":22}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":16}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":43}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":19}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":8}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":52}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":6}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":10}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":4}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":1}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":16}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":19}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":14}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":17}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":23}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":15}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":24}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":6}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":7}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":6}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":6}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":8}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":25}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":2}}},"s":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"34":1,"35":1,"36":15,"37":15,"38":15,"39":15,"40":15,"41":15,"42":15,"43":15,"46":1,"47":5,"48":5,"51":1,"52":2,"53":2,"56":1,"57":3,"58":3,"59":1,"61":1,"62":1,"63":2,"64":2,"65":2,"66":1,"70":3,"71":3,"72":3,"81":3,"82":3,"83":3,"84":3,"85":3,"87":3,"89":3,"91":3,"92":3,"93":3,"118":16,"119":16,"120":16,"121":16,"122":16,"123":16,"124":16,"125":16,"126":16,"127":16,"128":16,"130":16,"131":16,"133":16,"134":19,"135":19,"137":19,"138":19,"139":19,"140":19,"141":19,"143":17,"145":19,"147":5,"148":5,"149":5,"150":0,"151":0,"153":5,"154":5,"155":5,"156":5,"157":5,"158":5,"161":5,"162":3,"163":3,"164":3,"165":3,"166":3,"167":3,"168":3,"169":3,"171":2,"172":2,"175":12,"176":19,"177":4,"180":4,"181":2,"184":2,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"194":2,"195":2,"198":4,"199":0,"200":0,"201":0,"202":0,"203":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"221":4,"222":0,"223":0,"226":2,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":19,"236":16,"237":16,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"255":2,"256":2,"257":2,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":2,"273":1,"274":1,"275":10,"285":1,"287":13,"288":1,"289":1,"291":13,"292":13,"293":13,"294":3,"295":3,"297":13,"298":13,"310":1,"311":3,"312":3,"313":3,"314":3,"315":3,"316":3,"318":3,"319":3,"320":3,"321":3,"322":3,"323":3,"324":3,"325":3,"326":3,"329":2,"330":2,"332":2,"333":3,"335":1,"336":1,"338":1,"339":1,"340":3,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"359":1,"360":1,"361":1,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":1,"377":1,"378":3,"379":3,"380":2,"381":2,"382":2,"383":2,"384":2,"385":1,"386":3,"394":1,"395":5,"396":5,"403":1,"404":1,"405":1,"410":1,"411":1,"412":3,"413":3,"414":1,"415":1,"416":1,"417":1,"422":1,"423":2,"424":2,"425":1,"433":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"474":1,"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"488":1,"489":1,"490":1,"491":1,"492":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"503":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"537":1,"538":1,"539":1,"540":1,"541":1},"branchMap":{"0":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":2},"end":{"line":44,"column":3}},"locations":[{"start":{"line":36,"column":2},"end":{"line":44,"column":3}}]},"1":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"locations":[{"start":{"line":47,"column":2},"end":{"line":49,"column":3}}]},"2":{"type":"branch","line":52,"loc":{"start":{"line":52,"column":2},"end":{"line":54,"column":3}},"locations":[{"start":{"line":52,"column":2},"end":{"line":54,"column":3}}]},"3":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":27},"end":{"line":53,"column":67}},"locations":[{"start":{"line":53,"column":27},"end":{"line":53,"column":67}}]},"4":{"type":"branch","line":57,"loc":{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},"locations":[{"start":{"line":57,"column":2},"end":{"line":59,"column":3}}]},"5":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":27},"end":{"line":58,"column":54}},"locations":[{"start":{"line":58,"column":27},"end":{"line":58,"column":54}}]},"6":{"type":"branch","line":63,"loc":{"start":{"line":63,"column":2},"end":{"line":66,"column":3}},"locations":[{"start":{"line":63,"column":2},"end":{"line":66,"column":3}}]},"7":{"type":"branch","line":71,"loc":{"start":{"line":71,"column":0},"end":{"line":73,"column":1}},"locations":[{"start":{"line":71,"column":0},"end":{"line":73,"column":1}}]},"8":{"type":"branch","line":72,"loc":{"start":{"line":72,"column":21},"end":{"line":72,"column":55}},"locations":[{"start":{"line":72,"column":21},"end":{"line":72,"column":55}}]},"9":{"type":"branch","line":82,"loc":{"start":{"line":82,"column":0},"end":{"line":94,"column":1}},"locations":[{"start":{"line":82,"column":0},"end":{"line":94,"column":1}}]},"10":{"type":"branch","line":119,"loc":{"start":{"line":119,"column":0},"end":{"line":238,"column":1}},"locations":[{"start":{"line":119,"column":0},"end":{"line":238,"column":1}}]},"11":{"type":"branch","line":134,"loc":{"start":{"line":134,"column":55},"end":{"line":234,"column":3}},"locations":[{"start":{"line":134,"column":55},"end":{"line":234,"column":3}}]},"12":{"type":"branch","line":142,"loc":{"start":{"line":142,"column":7},"end":{"line":146,"column":24}},"locations":[{"start":{"line":142,"column":7},"end":{"line":146,"column":24}}]},"13":{"type":"branch","line":146,"loc":{"start":{"line":146,"column":24},"end":{"line":173,"column":7}},"locations":[{"start":{"line":146,"column":24},"end":{"line":173,"column":7}}]},"14":{"type":"branch","line":150,"loc":{"start":{"line":150,"column":8},"end":{"line":152,"column":9}},"locations":[{"start":{"line":150,"column":8},"end":{"line":152,"column":9}}]},"15":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":44},"end":{"line":162,"column":68}},"locations":[{"start":{"line":162,"column":44},"end":{"line":162,"column":68}}]},"16":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":68},"end":{"line":170,"column":9}},"locations":[{"start":{"line":162,"column":68},"end":{"line":170,"column":9}}]},"17":{"type":"branch","line":170,"loc":{"start":{"line":170,"column":8},"end":{"line":173,"column":7}},"locations":[{"start":{"line":170,"column":8},"end":{"line":173,"column":7}}]},"18":{"type":"branch","line":173,"loc":{"start":{"line":173,"column":6},"end":{"line":177,"column":13}},"locations":[{"start":{"line":173,"column":6},"end":{"line":177,"column":13}}]},"19":{"type":"branch","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":233,"column":5}},"locations":[{"start":{"line":177,"column":4},"end":{"line":233,"column":5}}]},"20":{"type":"branch","line":181,"loc":{"start":{"line":181,"column":41},"end":{"line":199,"column":65}},"locations":[{"start":{"line":181,"column":41},"end":{"line":199,"column":65}}]},"21":{"type":"branch","line":185,"loc":{"start":{"line":185,"column":37},"end":{"line":185,"column":61}},"locations":[{"start":{"line":185,"column":37},"end":{"line":185,"column":61}}]},"22":{"type":"branch","line":185,"loc":{"start":{"line":185,"column":61},"end":{"line":193,"column":9}},"locations":[{"start":{"line":185,"column":61},"end":{"line":193,"column":9}}]},"23":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":65},"end":{"line":219,"column":7}},"locations":[{"start":{"line":199,"column":65},"end":{"line":219,"column":7}}]},"24":{"type":"branch","line":219,"loc":{"start":{"line":219,"column":6},"end":{"line":222,"column":50}},"locations":[{"start":{"line":219,"column":6},"end":{"line":222,"column":50}}]},"25":{"type":"branch","line":222,"loc":{"start":{"line":222,"column":50},"end":{"line":224,"column":7}},"locations":[{"start":{"line":222,"column":50},"end":{"line":224,"column":7}}]},"26":{"type":"branch","line":224,"loc":{"start":{"line":224,"column":6},"end":{"line":228,"column":49}},"locations":[{"start":{"line":224,"column":6},"end":{"line":228,"column":49}}]},"27":{"type":"branch","line":228,"loc":{"start":{"line":228,"column":39},"end":{"line":228,"column":65}},"locations":[{"start":{"line":228,"column":39},"end":{"line":228,"column":65}}]},"28":{"type":"branch","line":231,"loc":{"start":{"line":231,"column":25},"end":{"line":231,"column":47}},"locations":[{"start":{"line":231,"column":25},"end":{"line":231,"column":47}}]},"29":{"type":"branch","line":231,"loc":{"start":{"line":231,"column":39},"end":{"line":231,"column":60}},"locations":[{"start":{"line":231,"column":39},"end":{"line":231,"column":60}}]},"30":{"type":"branch","line":234,"loc":{"start":{"line":234,"column":2},"end":{"line":237,"column":21}},"locations":[{"start":{"line":234,"column":2},"end":{"line":237,"column":21}}]},"31":{"type":"branch","line":237,"loc":{"start":{"line":237,"column":8},"end":{"line":237,"column":92}},"locations":[{"start":{"line":237,"column":8},"end":{"line":237,"column":92}}]},"32":{"type":"branch","line":249,"loc":{"start":{"line":249,"column":0},"end":{"line":266,"column":1}},"locations":[{"start":{"line":249,"column":0},"end":{"line":266,"column":1}}]},"33":{"type":"branch","line":258,"loc":{"start":{"line":258,"column":2},"end":{"line":265,"column":3}},"locations":[{"start":{"line":258,"column":2},"end":{"line":265,"column":3}}]},"34":{"type":"branch","line":260,"loc":{"start":{"line":260,"column":71},"end":{"line":260,"column":96}},"locations":[{"start":{"line":260,"column":71},"end":{"line":260,"column":96}}]},"35":{"type":"branch","line":275,"loc":{"start":{"line":275,"column":10},"end":{"line":276,"column":60}},"locations":[{"start":{"line":275,"column":10},"end":{"line":276,"column":60}}]},"36":{"type":"branch","line":286,"loc":{"start":{"line":286,"column":2},"end":{"line":299,"column":3}},"locations":[{"start":{"line":286,"column":2},"end":{"line":299,"column":3}}]},"37":{"type":"branch","line":288,"loc":{"start":{"line":288,"column":34},"end":{"line":290,"column":5}},"locations":[{"start":{"line":288,"column":34},"end":{"line":290,"column":5}}]},"38":{"type":"branch","line":294,"loc":{"start":{"line":294,"column":16},"end":{"line":296,"column":5}},"locations":[{"start":{"line":294,"column":16},"end":{"line":296,"column":5}}]},"39":{"type":"branch","line":311,"loc":{"start":{"line":311,"column":2},"end":{"line":341,"column":3}},"locations":[{"start":{"line":311,"column":2},"end":{"line":341,"column":3}}]},"40":{"type":"branch","line":327,"loc":{"start":{"line":327,"column":6},"end":{"line":334,"column":13}},"locations":[{"start":{"line":327,"column":6},"end":{"line":334,"column":13}}]},"41":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":4},"end":{"line":340,"column":5}},"locations":[{"start":{"line":334,"column":4},"end":{"line":340,"column":5}}]},"42":{"type":"branch","line":352,"loc":{"start":{"line":352,"column":2},"end":{"line":370,"column":3}},"locations":[{"start":{"line":352,"column":2},"end":{"line":370,"column":3}}]},"43":{"type":"branch","line":362,"loc":{"start":{"line":362,"column":4},"end":{"line":369,"column":5}},"locations":[{"start":{"line":362,"column":4},"end":{"line":369,"column":5}}]},"44":{"type":"branch","line":378,"loc":{"start":{"line":378,"column":2},"end":{"line":387,"column":3}},"locations":[{"start":{"line":378,"column":2},"end":{"line":387,"column":3}}]},"45":{"type":"branch","line":380,"loc":{"start":{"line":380,"column":20},"end":{"line":385,"column":5}},"locations":[{"start":{"line":380,"column":20},"end":{"line":385,"column":5}}]},"46":{"type":"branch","line":385,"loc":{"start":{"line":385,"column":4},"end":{"line":386,"column":17}},"locations":[{"start":{"line":385,"column":4},"end":{"line":386,"column":17}}]},"47":{"type":"branch","line":395,"loc":{"start":{"line":395,"column":2},"end":{"line":397,"column":3}},"locations":[{"start":{"line":395,"column":2},"end":{"line":397,"column":3}}]},"48":{"type":"branch","line":404,"loc":{"start":{"line":404,"column":2},"end":{"line":406,"column":3}},"locations":[{"start":{"line":404,"column":2},"end":{"line":406,"column":3}}]},"49":{"type":"branch","line":411,"loc":{"start":{"line":411,"column":2},"end":{"line":418,"column":3}},"locations":[{"start":{"line":411,"column":2},"end":{"line":418,"column":3}}]},"50":{"type":"branch","line":412,"loc":{"start":{"line":412,"column":29},"end":{"line":415,"column":5}},"locations":[{"start":{"line":412,"column":29},"end":{"line":415,"column":5}}]},"51":{"type":"branch","line":423,"loc":{"start":{"line":423,"column":2},"end":{"line":425,"column":3}},"locations":[{"start":{"line":423,"column":2},"end":{"line":425,"column":3}}]},"52":{"type":"branch","line":441,"loc":{"start":{"line":441,"column":0},"end":{"line":447,"column":1}},"locations":[{"start":{"line":441,"column":0},"end":{"line":447,"column":1}}]},"53":{"type":"branch","line":452,"loc":{"start":{"line":452,"column":0},"end":{"line":470,"column":1}},"locations":[{"start":{"line":452,"column":0},"end":{"line":470,"column":1}}]},"54":{"type":"branch","line":466,"loc":{"start":{"line":466,"column":38},"end":{"line":466,"column":52}},"locations":[{"start":{"line":466,"column":38},"end":{"line":466,"column":52}}]},"55":{"type":"branch","line":475,"loc":{"start":{"line":475,"column":0},"end":{"line":493,"column":1}},"locations":[{"start":{"line":475,"column":0},"end":{"line":493,"column":1}}]},"56":{"type":"branch","line":489,"loc":{"start":{"line":489,"column":38},"end":{"line":489,"column":52}},"locations":[{"start":{"line":489,"column":38},"end":{"line":489,"column":52}}]},"57":{"type":"branch","line":498,"loc":{"start":{"line":498,"column":0},"end":{"line":504,"column":1}},"locations":[{"start":{"line":498,"column":0},"end":{"line":504,"column":1}}]},"58":{"type":"branch","line":509,"loc":{"start":{"line":509,"column":0},"end":{"line":527,"column":1}},"locations":[{"start":{"line":509,"column":0},"end":{"line":527,"column":1}}]},"59":{"type":"branch","line":523,"loc":{"start":{"line":523,"column":38},"end":{"line":523,"column":52}},"locations":[{"start":{"line":523,"column":38},"end":{"line":523,"column":52}}]}},"b":{"0":[15],"1":[5],"2":[2],"3":[1],"4":[3],"5":[2],"6":[2],"7":[3],"8":[3],"9":[3],"10":[16],"11":[19],"12":[17],"13":[5],"14":[0],"15":[4],"16":[3],"17":[2],"18":[12],"19":[4],"20":[2],"21":[1],"22":[0],"23":[0],"24":[2],"25":[0],"26":[2],"27":[0],"28":[2],"29":[0],"30":[3],"31":[0],"32":[2],"33":[1],"34":[0],"35":[10],"36":[13],"37":[1],"38":[3],"39":[3],"40":[2],"41":[1],"42":[1],"43":[0],"44":[3],"45":[2],"46":[1],"47":[5],"48":[1],"49":[1],"50":[3],"51":[2],"52":[1],"53":[1],"54":[0],"55":[1],"56":[0],"57":[1],"58":[1],"59":[0]},"fnMap":{"0":{"name":"RequestError","decl":{"start":{"line":36,"column":2},"end":{"line":44,"column":3}},"loc":{"start":{"line":36,"column":2},"end":{"line":44,"column":3}},"line":36},"1":{"name":"isRetryable","decl":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"loc":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"line":47},"2":{"name":"isTimeout","decl":{"start":{"line":52,"column":2},"end":{"line":54,"column":3}},"loc":{"start":{"line":52,"column":2},"end":{"line":54,"column":3}},"line":52},"3":{"name":"isAuthError","decl":{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},"loc":{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},"line":57},"4":{"name":"RequestCancelledError","decl":{"start":{"line":63,"column":2},"end":{"line":66,"column":3}},"loc":{"start":{"line":63,"column":2},"end":{"line":66,"column":3}},"line":63},"5":{"name":"delay","decl":{"start":{"line":71,"column":0},"end":{"line":73,"column":1}},"loc":{"start":{"line":71,"column":0},"end":{"line":73,"column":1}},"line":71},"6":{"name":"calculateBackoff","decl":{"start":{"line":82,"column":0},"end":{"line":94,"column":1}},"loc":{"start":{"line":82,"column":0},"end":{"line":94,"column":1}},"line":82},"7":{"name":"requestWithRetry","decl":{"start":{"line":119,"column":0},"end":{"line":238,"column":1}},"loc":{"start":{"line":119,"column":0},"end":{"line":238,"column":1}},"line":119},"8":{"name":"requestJson","decl":{"start":{"line":249,"column":0},"end":{"line":266,"column":1}},"loc":{"start":{"line":249,"column":0},"end":{"line":266,"column":1}},"line":249},"9":{"name":"","decl":{"start":{"line":275,"column":10},"end":{"line":276,"column":60}},"loc":{"start":{"line":275,"column":10},"end":{"line":276,"column":60}},"line":275},"10":{"name":"createRequest","decl":{"start":{"line":286,"column":2},"end":{"line":299,"column":3}},"loc":{"start":{"line":286,"column":2},"end":{"line":299,"column":3}},"line":286},"11":{"name":"executeManaged","decl":{"start":{"line":311,"column":2},"end":{"line":341,"column":3}},"loc":{"start":{"line":311,"column":2},"end":{"line":341,"column":3}},"line":311},"12":{"name":"executeManagedJson","decl":{"start":{"line":352,"column":2},"end":{"line":370,"column":3}},"loc":{"start":{"line":352,"column":2},"end":{"line":370,"column":3}},"line":352},"13":{"name":"cancelRequest","decl":{"start":{"line":378,"column":2},"end":{"line":387,"column":3}},"loc":{"start":{"line":378,"column":2},"end":{"line":387,"column":3}},"line":378},"14":{"name":"isRequestActive","decl":{"start":{"line":395,"column":2},"end":{"line":397,"column":3}},"loc":{"start":{"line":395,"column":2},"end":{"line":397,"column":3}},"line":395},"15":{"name":"getActiveRequestIds","decl":{"start":{"line":404,"column":2},"end":{"line":406,"column":3}},"loc":{"start":{"line":404,"column":2},"end":{"line":406,"column":3}},"line":404},"16":{"name":"cancelAll","decl":{"start":{"line":411,"column":2},"end":{"line":418,"column":3}},"loc":{"start":{"line":411,"column":2},"end":{"line":418,"column":3}},"line":411},"17":{"name":"get activeCount","decl":{"start":{"line":423,"column":2},"end":{"line":425,"column":3}},"loc":{"start":{"line":423,"column":2},"end":{"line":425,"column":3}},"line":423},"18":{"name":"get","decl":{"start":{"line":441,"column":0},"end":{"line":447,"column":1}},"loc":{"start":{"line":441,"column":0},"end":{"line":447,"column":1}},"line":441},"19":{"name":"post","decl":{"start":{"line":452,"column":0},"end":{"line":470,"column":1}},"loc":{"start":{"line":452,"column":0},"end":{"line":470,"column":1}},"line":452},"20":{"name":"put","decl":{"start":{"line":475,"column":0},"end":{"line":493,"column":1}},"loc":{"start":{"line":475,"column":0},"end":{"line":493,"column":1}},"line":475},"21":{"name":"del","decl":{"start":{"line":498,"column":0},"end":{"line":504,"column":1}},"loc":{"start":{"line":498,"column":0},"end":{"line":504,"column":1}},"line":498},"22":{"name":"patch","decl":{"start":{"line":509,"column":0},"end":{"line":527,"column":1}},"loc":{"start":{"line":509,"column":0},"end":{"line":527,"column":1}},"line":509}},"f":{"0":15,"1":5,"2":2,"3":3,"4":2,"5":3,"6":3,"7":16,"8":2,"9":10,"10":13,"11":3,"12":1,"13":3,"14":5,"15":1,"16":1,"17":2,"18":1,"19":1,"20":1,"21":1,"22":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\secure-storage.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\secure-storage.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":44}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":43}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":45}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":68}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":26}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":28}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":7}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":74}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":28}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":66}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":29}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":17}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":30}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":56}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":38}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":43}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":11}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":27}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":73}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":16}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":55}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":60}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":15}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":23}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":110}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":7}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":5}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":56}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":50}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":43}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":11}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":72}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":68}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":23}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":52}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":23}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":107}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":7}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":48}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":4}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":44}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":43}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":11}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":53}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":23}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":78}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":7}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":33}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":44}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":38}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":4}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":2}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":59}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":27}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":3}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":59}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":22}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":39}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":56}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":50}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":25}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":1}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":46}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":7}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":37}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":86}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":11}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":3}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":1}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":86}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":7}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":48}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":17}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":44}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":35}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":13}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":5}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":9}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":53}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":56}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":68}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":35}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":65}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":39}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":5}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":11}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":3}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":1}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":79}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":7}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":48}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":60}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":52}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":11}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":55}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":51}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":51}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":23}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":67}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":7}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":50}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":31}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":25}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":16}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":11}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":16}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":3}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":1}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":53}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":7}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":52}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":33}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":11}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":3}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":1}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":68}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":7}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":16}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":39}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":12}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":35}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":11}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":1}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":61}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":7}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":37}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":11}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":3}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":1}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":34}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":35}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":39}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":4}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":41}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":40}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":4}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":29}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":33}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":4}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":2}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":60}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":58}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":56}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":75}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":53}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":18}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":42}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":44}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":3}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":81}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":1}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":51}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":50}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":36}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":27}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":46}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":43}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":36}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":3}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":15}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":1}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":38}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":24}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":23}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":18}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":53}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":53}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":42}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":41}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":70}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":66}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":57}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":9}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":50}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":13}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":5}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":10}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":17}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":94}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":6}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":25}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":25}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":22}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":24}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":24}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":18}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":8}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":6}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":3}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":1}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":71}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":41}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":77}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":73}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":45}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":11}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":16}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":54}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":54}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":10}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":19}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":79}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":7}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":5}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":3}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":64}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":21}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":9}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":64}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":14}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":59}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":59}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":8}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":17}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":71}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":5}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":3}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":14}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":1}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":57}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":41}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":56}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":3}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":7}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":52}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":49}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":48}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":11}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":3}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":1}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":57}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":37}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":23}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":1}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":72}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":60}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":16}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":41}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":25}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":20}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":5}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":3}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":64}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":21}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":9}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":46}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":89}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":54}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":7}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":13}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":5}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":3}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":14}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":1}}},"s":{"0":1,"23":1,"26":1,"27":1,"30":1,"35":23,"36":23,"37":23,"38":23,"41":0,"42":0,"43":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":23,"59":1,"65":1,"66":11,"68":11,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"84":11,"85":11,"92":1,"93":11,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"107":11,"108":11,"114":1,"115":1,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"124":1,"125":1,"130":1,"131":0,"132":0,"133":1,"143":17,"144":17,"145":16,"146":16,"148":1,"150":1,"151":1,"152":1,"153":1,"155":1,"156":1,"157":1,"162":7,"163":7,"164":7,"165":7,"166":7,"167":0,"168":0,"169":7,"174":11,"175":11,"176":11,"178":11,"179":1,"181":1,"182":1,"183":1,"185":10,"186":10,"187":10,"188":10,"190":10,"191":11,"192":0,"194":0,"195":0,"196":11,"198":0,"199":11,"205":11,"206":11,"208":11,"209":11,"211":11,"212":7,"213":7,"214":7,"215":7,"216":7,"217":1,"219":1,"220":7,"223":5,"224":11,"225":2,"226":2,"228":3,"229":11,"230":0,"231":0,"232":11,"237":1,"238":1,"239":1,"240":1,"241":1,"243":0,"244":1,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"271":1,"276":1,"277":0,"278":0,"284":1,"285":0,"286":0,"292":1,"293":0,"294":0,"295":1,"302":1,"303":1,"304":1,"305":1,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"366":0,"368":0,"370":0,"371":0,"373":0,"374":0,"375":0,"377":0,"378":0,"380":0,"381":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"402":0,"404":0,"405":0,"406":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"434":0,"435":0,"441":0,"443":0,"444":0,"445":0,"448":0,"449":0,"450":0,"451":0,"452":0,"454":0,"455":0,"460":0,"461":0,"462":0,"463":0,"469":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"489":0,"490":0,"492":0,"493":0},"branchMap":{"0":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":0},"end":{"line":54,"column":1}},"locations":[{"start":{"line":36,"column":0},"end":{"line":54,"column":1}}]},"1":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":2},"end":{"line":53,"column":3}},"locations":[{"start":{"line":39,"column":2},"end":{"line":53,"column":3}}]},"2":{"type":"branch","line":66,"loc":{"start":{"line":66,"column":2},"end":{"line":86,"column":4}},"locations":[{"start":{"line":66,"column":2},"end":{"line":86,"column":4}}]},"3":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":42},"end":{"line":82,"column":5}},"locations":[{"start":{"line":69,"column":42},"end":{"line":82,"column":5}}]},"4":{"type":"branch","line":93,"loc":{"start":{"line":93,"column":2},"end":{"line":109,"column":4}},"locations":[{"start":{"line":93,"column":2},"end":{"line":109,"column":4}}]},"5":{"type":"branch","line":94,"loc":{"start":{"line":94,"column":42},"end":{"line":105,"column":5}},"locations":[{"start":{"line":94,"column":42},"end":{"line":105,"column":5}}]},"6":{"type":"branch","line":115,"loc":{"start":{"line":115,"column":2},"end":{"line":126,"column":4}},"locations":[{"start":{"line":115,"column":2},"end":{"line":126,"column":4}}]},"7":{"type":"branch","line":116,"loc":{"start":{"line":116,"column":42},"end":{"line":122,"column":5}},"locations":[{"start":{"line":116,"column":42},"end":{"line":122,"column":5}}]},"8":{"type":"branch","line":144,"loc":{"start":{"line":144,"column":0},"end":{"line":158,"column":1}},"locations":[{"start":{"line":144,"column":0},"end":{"line":158,"column":1}}]},"9":{"type":"branch","line":145,"loc":{"start":{"line":145,"column":23},"end":{"line":147,"column":3}},"locations":[{"start":{"line":145,"column":23},"end":{"line":147,"column":3}}]},"10":{"type":"branch","line":147,"loc":{"start":{"line":147,"column":2},"end":{"line":158,"column":1}},"locations":[{"start":{"line":147,"column":2},"end":{"line":158,"column":1}}]},"11":{"type":"branch","line":163,"loc":{"start":{"line":163,"column":0},"end":{"line":170,"column":1}},"locations":[{"start":{"line":163,"column":0},"end":{"line":170,"column":1}}]},"12":{"type":"branch","line":167,"loc":{"start":{"line":167,"column":2},"end":{"line":169,"column":3}},"locations":[{"start":{"line":167,"column":2},"end":{"line":169,"column":3}}]},"13":{"type":"branch","line":175,"loc":{"start":{"line":175,"column":0},"end":{"line":200,"column":1}},"locations":[{"start":{"line":175,"column":0},"end":{"line":200,"column":1}}]},"14":{"type":"branch","line":179,"loc":{"start":{"line":179,"column":16},"end":{"line":184,"column":5}},"locations":[{"start":{"line":179,"column":16},"end":{"line":184,"column":5}}]},"15":{"type":"branch","line":184,"loc":{"start":{"line":184,"column":4},"end":{"line":192,"column":13}},"locations":[{"start":{"line":184,"column":4},"end":{"line":192,"column":13}}]},"16":{"type":"branch","line":192,"loc":{"start":{"line":192,"column":4},"end":{"line":196,"column":5}},"locations":[{"start":{"line":192,"column":4},"end":{"line":196,"column":5}}]},"17":{"type":"branch","line":197,"loc":{"start":{"line":197,"column":2},"end":{"line":199,"column":3}},"locations":[{"start":{"line":197,"column":2},"end":{"line":199,"column":3}}]},"18":{"type":"branch","line":206,"loc":{"start":{"line":206,"column":0},"end":{"line":233,"column":1}},"locations":[{"start":{"line":206,"column":0},"end":{"line":233,"column":1}}]},"19":{"type":"branch","line":212,"loc":{"start":{"line":212,"column":8},"end":{"line":212,"column":51}},"locations":[{"start":{"line":212,"column":8},"end":{"line":212,"column":51}}]},"20":{"type":"branch","line":212,"loc":{"start":{"line":212,"column":51},"end":{"line":221,"column":5}},"locations":[{"start":{"line":212,"column":51},"end":{"line":221,"column":5}}]},"21":{"type":"branch","line":217,"loc":{"start":{"line":217,"column":6},"end":{"line":220,"column":7}},"locations":[{"start":{"line":217,"column":6},"end":{"line":220,"column":7}}]},"22":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":225,"column":30}},"locations":[{"start":{"line":221,"column":4},"end":{"line":225,"column":30}}]},"23":{"type":"branch","line":225,"loc":{"start":{"line":225,"column":30},"end":{"line":227,"column":5}},"locations":[{"start":{"line":225,"column":30},"end":{"line":227,"column":5}}]},"24":{"type":"branch","line":227,"loc":{"start":{"line":227,"column":4},"end":{"line":230,"column":10}},"locations":[{"start":{"line":227,"column":4},"end":{"line":230,"column":10}}]},"25":{"type":"branch","line":230,"loc":{"start":{"line":230,"column":2},"end":{"line":232,"column":3}},"locations":[{"start":{"line":230,"column":2},"end":{"line":232,"column":3}}]},"26":{"type":"branch","line":238,"loc":{"start":{"line":238,"column":0},"end":{"line":245,"column":1}},"locations":[{"start":{"line":238,"column":0},"end":{"line":245,"column":1}}]},"27":{"type":"branch","line":242,"loc":{"start":{"line":242,"column":2},"end":{"line":244,"column":3}},"locations":[{"start":{"line":242,"column":2},"end":{"line":244,"column":3}}]}},"b":{"0":[23],"1":[0],"2":[11],"3":[0],"4":[11],"5":[0],"6":[1],"7":[0],"8":[17],"9":[16],"10":[1],"11":[7],"12":[0],"13":[11],"14":[1],"15":[10],"16":[0],"17":[0],"18":[11],"19":[7],"20":[7],"21":[1],"22":[5],"23":[2],"24":[3],"25":[0],"26":[1],"27":[0]},"fnMap":{"0":{"name":"isSecureStorageAvailable","decl":{"start":{"line":36,"column":0},"end":{"line":54,"column":1}},"loc":{"start":{"line":36,"column":0},"end":{"line":54,"column":1}},"line":36},"1":{"name":"set","decl":{"start":{"line":66,"column":2},"end":{"line":86,"column":4}},"loc":{"start":{"line":66,"column":2},"end":{"line":86,"column":4}},"line":66},"2":{"name":"get","decl":{"start":{"line":93,"column":2},"end":{"line":109,"column":4}},"loc":{"start":{"line":93,"column":2},"end":{"line":109,"column":4}},"line":93},"3":{"name":"delete","decl":{"start":{"line":115,"column":2},"end":{"line":126,"column":4}},"loc":{"start":{"line":115,"column":2},"end":{"line":126,"column":4}},"line":115},"4":{"name":"isUsingKeyring","decl":{"start":{"line":131,"column":2},"end":{"line":133,"column":4}},"loc":{"start":{"line":131,"column":2},"end":{"line":133,"column":4}},"line":131},"5":{"name":"getOrCreateMasterKey","decl":{"start":{"line":144,"column":0},"end":{"line":158,"column":1}},"loc":{"start":{"line":144,"column":0},"end":{"line":158,"column":1}},"line":144},"6":{"name":"isEncrypted","decl":{"start":{"line":163,"column":0},"end":{"line":170,"column":1}},"loc":{"start":{"line":163,"column":0},"end":{"line":170,"column":1}},"line":163},"7":{"name":"writeEncryptedLocalStorage","decl":{"start":{"line":175,"column":0},"end":{"line":200,"column":1}},"loc":{"start":{"line":175,"column":0},"end":{"line":200,"column":1}},"line":175},"8":{"name":"readEncryptedLocalStorage","decl":{"start":{"line":206,"column":0},"end":{"line":233,"column":1}},"loc":{"start":{"line":206,"column":0},"end":{"line":233,"column":1}},"line":206},"9":{"name":"clearLocalStorageBackup","decl":{"start":{"line":238,"column":0},"end":{"line":245,"column":1}},"loc":{"start":{"line":238,"column":0},"end":{"line":245,"column":1}},"line":238},"10":{"name":"writeLocalStorageBackup","decl":{"start":{"line":248,"column":0},"end":{"line":258,"column":1}},"loc":{"start":{"line":248,"column":0},"end":{"line":258,"column":1}},"line":248},"11":{"name":"readLocalStorageBackup","decl":{"start":{"line":260,"column":0},"end":{"line":266,"column":1}},"loc":{"start":{"line":260,"column":0},"end":{"line":266,"column":1}},"line":260},"12":{"name":"get","decl":{"start":{"line":277,"column":2},"end":{"line":279,"column":4}},"loc":{"start":{"line":277,"column":2},"end":{"line":279,"column":4}},"line":277},"13":{"name":"set","decl":{"start":{"line":285,"column":2},"end":{"line":287,"column":4}},"loc":{"start":{"line":285,"column":2},"end":{"line":287,"column":4}},"line":285},"14":{"name":"delete","decl":{"start":{"line":293,"column":2},"end":{"line":295,"column":4}},"loc":{"start":{"line":293,"column":2},"end":{"line":295,"column":4}},"line":293},"15":{"name":"base64UrlEncode","decl":{"start":{"line":329,"column":0},"end":{"line":335,"column":1}},"loc":{"start":{"line":329,"column":0},"end":{"line":335,"column":1}},"line":329},"16":{"name":"base64UrlDecode","decl":{"start":{"line":340,"column":0},"end":{"line":349,"column":1}},"loc":{"start":{"line":340,"column":0},"end":{"line":349,"column":1}},"line":340},"17":{"name":"storeDeviceKeys","decl":{"start":{"line":359,"column":0},"end":{"line":394,"column":1}},"loc":{"start":{"line":359,"column":0},"end":{"line":394,"column":1}},"line":359},"18":{"name":"getDeviceKeys","decl":{"start":{"line":403,"column":0},"end":{"line":436,"column":1}},"loc":{"start":{"line":403,"column":0},"end":{"line":436,"column":1}},"line":403},"19":{"name":"deleteDeviceKeys","decl":{"start":{"line":442,"column":0},"end":{"line":456,"column":1}},"loc":{"start":{"line":442,"column":0},"end":{"line":456,"column":1}},"line":442},"20":{"name":"hasDeviceKeys","decl":{"start":{"line":461,"column":0},"end":{"line":464,"column":1}},"loc":{"start":{"line":461,"column":0},"end":{"line":464,"column":1}},"line":461},"21":{"name":"getDeviceKeysCreatedAt","decl":{"start":{"line":470,"column":0},"end":{"line":494,"column":1}},"loc":{"start":{"line":470,"column":0},"end":{"line":494,"column":1}},"line":470}},"f":{"0":23,"1":11,"2":11,"3":1,"4":0,"5":17,"6":7,"7":11,"8":11,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\security-audit.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\security-audit.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":52}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":35}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":43}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":36}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":72}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":54}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":69}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":31}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":1}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":57}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":27}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":110}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":48}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":24}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":1}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":51}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":7}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":37}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":42}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":56}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":5}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":67}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":11}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":3}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":1}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":45}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":58}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":27}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":49}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":11}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":3}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":1}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":77}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":73}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":24}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":27}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":31}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":25}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":23}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":24}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":27}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":27}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":24}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":27}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":27}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":35}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":31}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":39}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":30}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":31}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":33}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":26}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":35}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":36}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":4}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":37}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":1}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":34}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":26}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":34}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":18}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":34}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":9}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":53}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":11}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":32}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":26}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":9}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":13}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":40}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":12}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":45}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":4}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":41}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":42}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":3}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":22}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":47}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":81}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":59}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":71}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":3}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":1}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":33}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":26}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":18}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":40}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":34}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":9}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":61}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":66}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":1}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":29}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":76}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":18}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":39}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":9}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":43}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":1}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":28}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":70}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":18}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":39}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":9}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":43}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":1}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":29}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":92}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":18}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":39}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":9}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":43}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":1}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":37}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":18}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":39}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":9}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":71}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":1}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":37}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":18}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":39}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":9}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":67}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":1}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":36}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":18}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":39}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":9}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":75}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":1}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":35}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":51}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":18}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":39}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":9}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":43}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":1}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":32}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":44}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":18}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":39}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":9}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":43}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":1}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":38}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":18}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":39}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":9}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":72}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":1}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":34}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":18}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":39}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":9}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":71}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":1}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":54}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":27}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":1}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":83}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":64}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":1}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":95}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":72}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":1}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":87}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":36}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":32}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":44}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":58}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":58}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":5}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":1}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":78}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":26}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":81}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":19}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":1}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":80}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":74}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":1}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":68}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":35}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":80}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":67}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":12}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":15}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":13}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":16}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":4}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":31}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":67}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":39}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":59}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":39}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":77}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":3}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":44}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":102}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":3}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":50}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":79}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":52}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":78}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":3}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":28}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":90}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":3}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":10}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":42}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":31}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":17}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":21}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":25}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":20}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":4}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":1}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":47}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":44}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":90}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":1}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":48}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":35}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":25}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":27}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":41}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":11}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":14}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":1}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":86}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":7}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":38}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":58}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":60}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":52}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":5}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":16}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":47}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":66}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":99}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":12}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":101}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":5}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":109}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":12}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":34}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":7}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":19}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":97}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":68}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":7}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":16}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":3}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":1}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":58}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":4}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":35}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":38}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":38}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":10}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":29}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":30}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":9}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":4}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":1}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":67}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":18}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":33}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":3}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":89}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":32}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":33}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":5}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":1}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":47}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":85}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":32}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":5}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":26}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":1}}},"s":{"0":1,"73":1,"74":1,"75":1,"81":1,"82":1,"91":19,"92":19,"93":19,"98":1,"99":0,"100":0,"105":1,"106":0,"107":0,"112":1,"113":2,"114":2,"115":2,"120":1,"121":0,"122":0,"127":19,"128":19,"129":19,"130":19,"133":19,"134":0,"135":0,"137":19,"138":19,"140":0,"141":19,"146":26,"147":26,"148":26,"149":26,"150":14,"151":26,"152":0,"153":0,"154":26,"159":10,"160":10,"161":10,"162":10,"163":10,"164":10,"165":10,"166":10,"167":10,"168":10,"169":10,"170":10,"171":10,"172":10,"173":10,"174":10,"175":10,"176":10,"177":10,"178":10,"179":10,"180":10,"181":10,"182":10,"183":10,"184":10,"186":10,"187":10,"192":20,"193":20,"194":20,"195":20,"196":20,"197":20,"198":20,"199":1,"200":1,"202":19,"203":19,"204":19,"205":19,"206":19,"207":19,"208":19,"209":19,"210":20,"213":20,"214":19,"215":19,"217":19,"220":20,"221":0,"222":0,"223":0,"224":0,"225":20,"234":1,"235":12,"236":12,"237":12,"238":12,"239":12,"240":12,"241":12,"242":12,"247":1,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"258":1,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"269":1,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"280":1,"281":0,"282":0,"283":0,"284":0,"285":0,"290":1,"291":0,"292":0,"293":0,"294":0,"295":0,"300":1,"301":0,"302":0,"303":0,"304":0,"305":0,"310":1,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"321":1,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"332":1,"333":0,"334":0,"335":0,"336":0,"337":0,"342":1,"343":0,"344":0,"345":0,"346":0,"347":0,"356":1,"357":3,"358":3,"363":1,"364":1,"365":1,"370":1,"371":1,"372":1,"377":1,"378":0,"379":0,"381":0,"382":0,"383":0,"384":0,"385":0,"390":1,"391":1,"392":1,"393":1,"394":1,"399":1,"400":0,"401":0,"410":1,"411":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"421":1,"422":3,"423":3,"424":3,"426":1,"428":1,"431":1,"432":1,"433":1,"435":1,"436":0,"437":0,"439":1,"440":0,"441":0,"443":1,"444":0,"445":0,"447":1,"448":0,"449":0,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"468":1,"469":6,"470":6,"471":6,"476":1,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"488":1,"489":0,"490":0,"491":0,"493":0,"494":0,"495":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"520":0,"524":0,"525":0,"526":0,"527":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"543":1,"544":0,"545":0,"546":0,"548":0,"549":0,"550":0,"551":0,"552":0,"557":1,"558":0,"559":0,"560":0,"562":0,"563":0},"branchMap":{"0":{"type":"branch","line":92,"loc":{"start":{"line":92,"column":0},"end":{"line":94,"column":1}},"locations":[{"start":{"line":92,"column":0},"end":{"line":94,"column":1}}]},"1":{"type":"branch","line":113,"loc":{"start":{"line":113,"column":7},"end":{"line":116,"column":1}},"locations":[{"start":{"line":113,"column":7},"end":{"line":116,"column":1}}]},"2":{"type":"branch","line":115,"loc":{"start":{"line":115,"column":70},"end":{"line":115,"column":92}},"locations":[{"start":{"line":115,"column":70},"end":{"line":115,"column":92}}]},"3":{"type":"branch","line":115,"loc":{"start":{"line":115,"column":80},"end":{"line":115,"column":102}},"locations":[{"start":{"line":115,"column":80},"end":{"line":115,"column":102}}]},"4":{"type":"branch","line":128,"loc":{"start":{"line":128,"column":0},"end":{"line":142,"column":1}},"locations":[{"start":{"line":128,"column":0},"end":{"line":142,"column":1}}]},"5":{"type":"branch","line":134,"loc":{"start":{"line":134,"column":41},"end":{"line":136,"column":5}},"locations":[{"start":{"line":134,"column":41},"end":{"line":136,"column":5}}]},"6":{"type":"branch","line":139,"loc":{"start":{"line":139,"column":2},"end":{"line":141,"column":3}},"locations":[{"start":{"line":139,"column":2},"end":{"line":141,"column":3}}]},"7":{"type":"branch","line":147,"loc":{"start":{"line":147,"column":0},"end":{"line":155,"column":1}},"locations":[{"start":{"line":147,"column":0},"end":{"line":155,"column":1}}]},"8":{"type":"branch","line":150,"loc":{"start":{"line":150,"column":17},"end":{"line":150,"column":27}},"locations":[{"start":{"line":150,"column":17},"end":{"line":150,"column":27}}]},"9":{"type":"branch","line":150,"loc":{"start":{"line":150,"column":25},"end":{"line":152,"column":10}},"locations":[{"start":{"line":150,"column":25},"end":{"line":152,"column":10}}]},"10":{"type":"branch","line":152,"loc":{"start":{"line":152,"column":2},"end":{"line":154,"column":3}},"locations":[{"start":{"line":152,"column":2},"end":{"line":154,"column":3}}]},"11":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":0},"end":{"line":188,"column":1}},"locations":[{"start":{"line":160,"column":0},"end":{"line":188,"column":1}}]},"12":{"type":"branch","line":187,"loc":{"start":{"line":187,"column":25},"end":{"line":187,"column":37}},"locations":[{"start":{"line":187,"column":25},"end":{"line":187,"column":37}}]},"13":{"type":"branch","line":193,"loc":{"start":{"line":193,"column":0},"end":{"line":226,"column":1}},"locations":[{"start":{"line":193,"column":0},"end":{"line":226,"column":1}}]},"14":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":7},"end":{"line":199,"column":52}},"locations":[{"start":{"line":199,"column":7},"end":{"line":199,"column":52}}]},"15":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":52},"end":{"line":201,"column":3}},"locations":[{"start":{"line":199,"column":52},"end":{"line":201,"column":3}}]},"16":{"type":"branch","line":201,"loc":{"start":{"line":201,"column":2},"end":{"line":210,"column":45}},"locations":[{"start":{"line":201,"column":2},"end":{"line":210,"column":45}}]},"17":{"type":"branch","line":214,"loc":{"start":{"line":214,"column":40},"end":{"line":221,"column":46}},"locations":[{"start":{"line":214,"column":40},"end":{"line":221,"column":46}}]},"18":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":46},"end":{"line":225,"column":3}},"locations":[{"start":{"line":221,"column":46},"end":{"line":225,"column":3}}]},"19":{"type":"branch","line":235,"loc":{"start":{"line":235,"column":7},"end":{"line":243,"column":1}},"locations":[{"start":{"line":235,"column":7},"end":{"line":243,"column":1}}]},"20":{"type":"branch","line":241,"loc":{"start":{"line":241,"column":24},"end":{"line":241,"column":61}},"locations":[{"start":{"line":241,"column":24},"end":{"line":241,"column":61}}]},"21":{"type":"branch","line":357,"loc":{"start":{"line":357,"column":7},"end":{"line":359,"column":1}},"locations":[{"start":{"line":357,"column":7},"end":{"line":359,"column":1}}]},"22":{"type":"branch","line":364,"loc":{"start":{"line":364,"column":7},"end":{"line":366,"column":1}},"locations":[{"start":{"line":364,"column":7},"end":{"line":366,"column":1}}]},"23":{"type":"branch","line":365,"loc":{"start":{"line":365,"column":34},"end":{"line":365,"column":62}},"locations":[{"start":{"line":365,"column":34},"end":{"line":365,"column":62}}]},"24":{"type":"branch","line":371,"loc":{"start":{"line":371,"column":7},"end":{"line":373,"column":1}},"locations":[{"start":{"line":371,"column":7},"end":{"line":373,"column":1}}]},"25":{"type":"branch","line":372,"loc":{"start":{"line":372,"column":34},"end":{"line":372,"column":70}},"locations":[{"start":{"line":372,"column":34},"end":{"line":372,"column":70}}]},"26":{"type":"branch","line":391,"loc":{"start":{"line":391,"column":7},"end":{"line":395,"column":1}},"locations":[{"start":{"line":391,"column":7},"end":{"line":395,"column":1}}]},"27":{"type":"branch","line":393,"loc":{"start":{"line":393,"column":12},"end":{"line":393,"column":80}},"locations":[{"start":{"line":393,"column":12},"end":{"line":393,"column":80}}]},"28":{"type":"branch","line":393,"loc":{"start":{"line":393,"column":40},"end":{"line":393,"column":80}},"locations":[{"start":{"line":393,"column":40},"end":{"line":393,"column":80}}]},"29":{"type":"branch","line":411,"loc":{"start":{"line":411,"column":7},"end":{"line":460,"column":1}},"locations":[{"start":{"line":411,"column":7},"end":{"line":460,"column":1}}]},"30":{"type":"branch","line":422,"loc":{"start":{"line":422,"column":30},"end":{"line":425,"column":3}},"locations":[{"start":{"line":422,"column":30},"end":{"line":425,"column":3}}]},"31":{"type":"branch","line":436,"loc":{"start":{"line":436,"column":20},"end":{"line":436,"column":40}},"locations":[{"start":{"line":436,"column":20},"end":{"line":436,"column":40}}]},"32":{"type":"branch","line":436,"loc":{"start":{"line":436,"column":43},"end":{"line":438,"column":3}},"locations":[{"start":{"line":436,"column":43},"end":{"line":438,"column":3}}]},"33":{"type":"branch","line":440,"loc":{"start":{"line":440,"column":49},"end":{"line":442,"column":3}},"locations":[{"start":{"line":440,"column":49},"end":{"line":442,"column":3}}]},"34":{"type":"branch","line":444,"loc":{"start":{"line":444,"column":51},"end":{"line":446,"column":3}},"locations":[{"start":{"line":444,"column":51},"end":{"line":446,"column":3}}]},"35":{"type":"branch","line":448,"loc":{"start":{"line":448,"column":27},"end":{"line":450,"column":3}},"locations":[{"start":{"line":448,"column":27},"end":{"line":450,"column":3}}]},"36":{"type":"branch","line":469,"loc":{"start":{"line":469,"column":7},"end":{"line":472,"column":1}},"locations":[{"start":{"line":469,"column":7},"end":{"line":472,"column":1}}]}},"b":{"0":[19],"1":[2],"2":[1],"3":[1],"4":[19],"5":[0],"6":[0],"7":[26],"8":[12],"9":[14],"10":[0],"11":[10],"12":[0],"13":[20],"14":[2],"15":[1],"16":[19],"17":[19],"18":[0],"19":[12],"20":[10],"21":[3],"22":[1],"23":[3],"24":[1],"25":[2],"26":[1],"27":[3],"28":[2],"29":[1],"30":[3],"31":[0],"32":[0],"33":[0],"34":[0],"35":[0],"36":[6]},"fnMap":{"0":{"name":"generateEventId","decl":{"start":{"line":92,"column":0},"end":{"line":94,"column":1}},"loc":{"start":{"line":92,"column":0},"end":{"line":94,"column":1}},"line":92},"1":{"name":"getCurrentSessionId","decl":{"start":{"line":99,"column":7},"end":{"line":101,"column":1}},"loc":{"start":{"line":99,"column":7},"end":{"line":101,"column":1}},"line":99},"2":{"name":"setCurrentSessionId","decl":{"start":{"line":106,"column":7},"end":{"line":108,"column":1}},"loc":{"start":{"line":106,"column":7},"end":{"line":108,"column":1}},"line":106},"3":{"name":"setAuditEnabled","decl":{"start":{"line":113,"column":7},"end":{"line":116,"column":1}},"loc":{"start":{"line":113,"column":7},"end":{"line":116,"column":1}},"line":113},"4":{"name":"isAuditEnabledState","decl":{"start":{"line":121,"column":7},"end":{"line":123,"column":1}},"loc":{"start":{"line":121,"column":7},"end":{"line":123,"column":1}},"line":121},"5":{"name":"persistEvent","decl":{"start":{"line":128,"column":0},"end":{"line":142,"column":1}},"loc":{"start":{"line":128,"column":0},"end":{"line":142,"column":1}},"line":128},"6":{"name":"getStoredEvents","decl":{"start":{"line":147,"column":0},"end":{"line":155,"column":1}},"loc":{"start":{"line":147,"column":0},"end":{"line":155,"column":1}},"line":147},"7":{"name":"getDefaultSeverity","decl":{"start":{"line":160,"column":0},"end":{"line":188,"column":1}},"loc":{"start":{"line":160,"column":0},"end":{"line":188,"column":1}},"line":160},"8":{"name":"logSecurityEventInternal","decl":{"start":{"line":193,"column":0},"end":{"line":226,"column":1}},"loc":{"start":{"line":193,"column":0},"end":{"line":226,"column":1}},"line":193},"9":{"name":"logSecurityEvent","decl":{"start":{"line":235,"column":7},"end":{"line":243,"column":1}},"loc":{"start":{"line":235,"column":7},"end":{"line":243,"column":1}},"line":235},"10":{"name":"logAuthEvent","decl":{"start":{"line":248,"column":7},"end":{"line":254,"column":1}},"loc":{"start":{"line":248,"column":7},"end":{"line":254,"column":1}},"line":248},"11":{"name":"logKeyEvent","decl":{"start":{"line":259,"column":7},"end":{"line":265,"column":1}},"loc":{"start":{"line":259,"column":7},"end":{"line":265,"column":1}},"line":259},"12":{"name":"logDataEvent","decl":{"start":{"line":270,"column":7},"end":{"line":276,"column":1}},"loc":{"start":{"line":270,"column":7},"end":{"line":276,"column":1}},"line":270},"13":{"name":"logSecurityViolation","decl":{"start":{"line":281,"column":7},"end":{"line":286,"column":1}},"loc":{"start":{"line":281,"column":7},"end":{"line":286,"column":1}},"line":281},"14":{"name":"logDecryptionFailure","decl":{"start":{"line":291,"column":7},"end":{"line":296,"column":1}},"loc":{"start":{"line":291,"column":7},"end":{"line":296,"column":1}},"line":291},"15":{"name":"logIntegrityFailure","decl":{"start":{"line":301,"column":7},"end":{"line":306,"column":1}},"loc":{"start":{"line":301,"column":7},"end":{"line":306,"column":1}},"line":301},"16":{"name":"logPermissionEvent","decl":{"start":{"line":311,"column":7},"end":{"line":317,"column":1}},"loc":{"start":{"line":311,"column":7},"end":{"line":317,"column":1}},"line":311},"17":{"name":"logSessionEvent","decl":{"start":{"line":322,"column":7},"end":{"line":328,"column":1}},"loc":{"start":{"line":322,"column":7},"end":{"line":328,"column":1}},"line":322},"18":{"name":"logSuspiciousActivity","decl":{"start":{"line":333,"column":7},"end":{"line":338,"column":1}},"loc":{"start":{"line":333,"column":7},"end":{"line":338,"column":1}},"line":333},"19":{"name":"logRateLimitEvent","decl":{"start":{"line":343,"column":7},"end":{"line":348,"column":1}},"loc":{"start":{"line":343,"column":7},"end":{"line":348,"column":1}},"line":343},"20":{"name":"getSecurityEvents","decl":{"start":{"line":357,"column":7},"end":{"line":359,"column":1}},"loc":{"start":{"line":357,"column":7},"end":{"line":359,"column":1}},"line":357},"21":{"name":"getSecurityEventsByType","decl":{"start":{"line":364,"column":7},"end":{"line":366,"column":1}},"loc":{"start":{"line":364,"column":7},"end":{"line":366,"column":1}},"line":364},"22":{"name":"getSecurityEventsBySeverity","decl":{"start":{"line":371,"column":7},"end":{"line":373,"column":1}},"loc":{"start":{"line":371,"column":7},"end":{"line":373,"column":1}},"line":371},"23":{"name":"getSecurityEventsByTimeRange","decl":{"start":{"line":378,"column":7},"end":{"line":386,"column":1}},"loc":{"start":{"line":378,"column":7},"end":{"line":386,"column":1}},"line":378},"24":{"name":"getRecentCriticalEvents","decl":{"start":{"line":391,"column":7},"end":{"line":395,"column":1}},"loc":{"start":{"line":391,"column":7},"end":{"line":395,"column":1}},"line":391},"25":{"name":"getSecurityEventsBySession","decl":{"start":{"line":400,"column":7},"end":{"line":402,"column":1}},"loc":{"start":{"line":400,"column":7},"end":{"line":402,"column":1}},"line":400},"26":{"name":"generateSecurityAuditReport","decl":{"start":{"line":411,"column":7},"end":{"line":460,"column":1}},"loc":{"start":{"line":411,"column":7},"end":{"line":460,"column":1}},"line":411},"27":{"name":"clearSecurityAuditLog","decl":{"start":{"line":469,"column":7},"end":{"line":472,"column":1}},"loc":{"start":{"line":469,"column":7},"end":{"line":472,"column":1}},"line":469},"28":{"name":"exportSecurityEvents","decl":{"start":{"line":477,"column":7},"end":{"line":484,"column":1}},"loc":{"start":{"line":477,"column":7},"end":{"line":484,"column":1}},"line":477},"29":{"name":"importSecurityEvents","decl":{"start":{"line":489,"column":7},"end":{"line":516,"column":1}},"loc":{"start":{"line":489,"column":7},"end":{"line":516,"column":1}},"line":489},"30":{"name":"verifyAuditLogIntegrity","decl":{"start":{"line":521,"column":0},"end":{"line":535,"column":1}},"loc":{"start":{"line":521,"column":0},"end":{"line":535,"column":1}},"line":521},"31":{"name":"initializeSecurityAudit","decl":{"start":{"line":544,"column":7},"end":{"line":553,"column":1}},"loc":{"start":{"line":544,"column":7},"end":{"line":553,"column":1}},"line":544},"32":{"name":"shutdownSecurityAudit","decl":{"start":{"line":558,"column":7},"end":{"line":564,"column":1}},"loc":{"start":{"line":558,"column":7},"end":{"line":564,"column":1}},"line":558}},"f":{"0":19,"1":0,"2":0,"3":2,"4":0,"5":19,"6":26,"7":10,"8":20,"9":12,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":3,"21":1,"22":1,"23":0,"24":1,"25":0,"26":1,"27":6,"28":0,"29":0,"30":0,"31":0,"32":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\security-index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\security-index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":77}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":71}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":37}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":86}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":41}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":61}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":1}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":57}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":69}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":59}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":59}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":1}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":52}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":4}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":96}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":72}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":106}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":67}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":72}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":66}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":10}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":40}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":56}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":61}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":55}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":47}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":19}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":4}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":1}}},"s":{"0":0,"187":0,"189":0,"190":0,"193":0,"194":0,"196":0,"197":0,"203":0,"204":0,"205":0,"207":0,"208":0,"210":0,"211":0,"216":0,"223":0,"224":0,"225":0,"226":0,"227":0,"229":0,"230":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5721},"end":{"line":241,"column":1}},"locations":[{"start":{"line":1,"column":5721},"end":{"line":241,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5721},"end":{"line":241,"column":1}},"loc":{"start":{"line":1,"column":5721},"end":{"line":241,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\security-utils.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\security-utils.ts","all":false,"statementMap":{"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":47}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":15}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":14}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":14}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":16}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":16}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":16}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":2}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":51}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":14}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":76}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":34}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":54}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":29}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":1}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":30}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":48}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":57}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":36}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":50}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":29}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":15}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":12}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":11}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":33}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":14}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":67}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":85}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":50}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":49}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":53}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":23}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":13}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":52}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":23}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":13}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":54}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":36}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":47}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":38}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":43}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":17}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":7}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":54}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":84}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":19}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":9}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":73}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":43}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":7}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":45}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":43}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":7}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":58}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":40}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":34}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":58}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":7}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":35}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":13}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":55}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":3}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":55}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":29}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":1}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":33}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":50}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":28}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":14}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":8}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":18}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":52}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":16}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":3}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":31}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":16}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":3}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":7}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":32}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":78}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":64}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":18}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":5}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":34}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":44}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":44}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":40}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":20}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":7}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":5}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":34}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":79}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":49}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":20}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":7}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":5}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":29}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":11}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":16}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":3}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":1}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":57}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":52}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":17}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":3}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":53}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":16}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":3}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":44}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":43}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":17}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":37}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":17}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":3}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":64}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":28}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":1}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":29}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":15}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":12}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":8}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":18}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":54}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":16}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":3}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":46}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":32}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":16}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":3}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":44}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":34}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":16}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":3}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":32}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":65}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":18}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":5}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":3}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":31}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":70}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":18}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":5}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":3}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":74}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":59}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":59}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":18}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":3}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":75}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":42}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":11}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":76}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":44}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":22}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":9}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":30}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":15}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":20}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":7}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":3}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":20}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":1}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":54}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":78}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":17}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":3}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":156}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":32}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":1}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":32}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":19}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":12}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":8}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":12}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":43}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":44}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":66}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":37}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":17}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":3}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":67}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":17}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":3}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":37}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":1}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":41}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":19}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":12}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":8}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":3}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":43}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":45}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":30}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":16}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":37}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":77}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":3}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":36}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":69}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":10}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":51}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":3}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":36}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":68}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":3}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":70}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":61}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":38}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":16}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":3}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":70}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":60}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":38}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":16}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":3}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":67}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":50}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":38}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":16}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":3}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":100}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":61}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":70}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":16}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":3}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":26}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":10}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":11}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":11}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":16}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":13}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":15}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":4}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":41}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":33}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":56}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":18}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":12}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":5}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":3}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":10}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":31}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":45}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":11}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":4}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":1}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":60}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":37}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":14}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":3}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":51}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":43}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":56}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":51}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":57}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":31}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":43}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":61}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":81}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":3}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":19}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":1}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":67}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":33}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":16}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":3}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":7}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":36}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":56}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":70}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":40}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":28}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":58}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":9}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":7}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":5}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":23}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":11}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":16}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":3}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":1}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":57}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":30}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":14}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":22}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":18}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":12}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":25}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":40}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":38}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":29}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":15}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":30}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":7}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":17}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":3}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":35}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":16}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":3}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":16}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":15}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":1}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":51}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":29}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":1}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":80}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":40}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":45}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":23}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":3}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":48}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":1}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":44}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":59}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":45}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":1}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":39}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":26}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":96}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":40}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":35}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":23}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":35}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":30}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":23}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":26}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":2}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":31}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":77}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":11}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":62}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":31}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":45}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":16}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":1}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":41}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":3}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":30}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":38}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":92}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":59}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":5}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":48}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":5}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":3}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":10}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":32}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":11}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":4}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":1}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":66}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":63}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":26}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":46}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":14}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":1}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":63}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":44}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":40}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":80}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":1}}},"s":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"39":1,"40":3,"41":0,"42":0,"43":3,"44":3,"52":1,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"65":1,"66":1,"67":1,"68":1,"69":1,"74":1,"75":1,"76":1,"86":1,"87":4,"88":4,"92":4,"93":4,"94":4,"95":0,"96":0,"98":4,"99":4,"102":4,"103":4,"106":4,"108":7,"109":1,"110":1,"111":1,"114":7,"115":0,"116":0,"117":0,"120":6,"121":7,"122":2,"125":2,"126":1,"127":1,"128":1,"131":2,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"140":2,"141":0,"142":0,"143":0,"146":0,"147":0,"148":0,"149":2,"152":7,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"162":6,"163":7,"166":4,"168":4,"169":4,"178":1,"179":1,"180":1,"189":1,"190":5,"191":5,"196":5,"197":5,"198":5,"199":0,"200":0,"202":5,"203":5,"204":0,"205":0,"207":5,"208":5,"211":5,"212":5,"213":2,"214":2,"217":5,"218":2,"219":1,"220":2,"221":1,"222":1,"223":2,"226":2,"227":2,"228":2,"229":0,"230":0,"231":2,"233":2,"234":5,"235":0,"236":0,"237":5,"246":1,"247":0,"248":0,"249":0,"252":0,"253":0,"254":0,"257":0,"258":0,"259":0,"260":0,"263":0,"264":0,"265":0,"268":0,"269":0,"270":0,"283":1,"284":4,"285":4,"291":4,"292":4,"293":4,"294":0,"295":0,"297":4,"298":4,"299":0,"300":0,"303":4,"306":4,"307":1,"308":1,"311":3,"312":3,"313":1,"314":1,"315":3,"318":2,"319":2,"320":1,"321":1,"322":2,"325":4,"326":0,"327":0,"328":0,"329":0,"330":0,"333":4,"334":0,"335":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"349":1,"350":1,"362":1,"363":5,"364":0,"365":0,"368":5,"369":5,"370":5,"379":1,"380":0,"381":0,"385":0,"386":0,"387":0,"388":0,"389":0,"391":0,"392":0,"393":0,"395":0,"396":0,"397":0,"399":0,"400":0,"409":1,"410":3,"411":3,"418":3,"423":3,"424":3,"425":3,"426":3,"427":3,"429":3,"430":0,"431":0,"433":3,"434":1,"435":3,"436":2,"437":2,"439":3,"440":0,"441":0,"443":3,"444":2,"445":3,"446":1,"447":1,"449":3,"450":0,"451":3,"452":3,"453":3,"455":3,"456":1,"457":3,"458":2,"459":2,"461":3,"462":2,"463":3,"464":1,"465":1,"468":3,"469":3,"470":3,"471":3,"472":3,"473":3,"474":3,"475":3,"477":3,"478":13,"479":1,"480":1,"481":1,"482":1,"483":13,"485":3,"486":3,"487":3,"488":3,"489":3,"490":3,"498":1,"499":3,"500":0,"501":0,"504":3,"507":3,"510":3,"513":3,"516":3,"519":3,"520":0,"521":0,"522":0,"523":0,"525":3,"526":3,"535":1,"536":3,"537":0,"538":0,"540":3,"541":3,"544":3,"545":2,"546":2,"547":6,"548":4,"549":4,"550":6,"551":2,"553":2,"554":3,"555":1,"556":1,"557":3,"568":1,"578":1,"579":14,"580":14,"581":14,"582":14,"583":14,"584":14,"586":14,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"594":14,"595":8,"596":8,"598":4,"599":4,"600":4,"607":1,"608":0,"609":0,"618":1,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"635":1,"636":0,"637":0,"638":0,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"661":1,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"677":1,"680":0,"681":0,"684":0,"685":0,"686":0,"687":0,"690":0,"692":0,"693":0,"695":0,"696":0,"697":0,"698":0,"699":0,"711":1,"712":5,"713":5,"714":5,"715":5,"716":5,"724":1,"725":2,"726":2,"727":2,"728":2},"branchMap":{"0":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":7},"end":{"line":45,"column":1}},"locations":[{"start":{"line":40,"column":7},"end":{"line":45,"column":1}}]},"1":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":33},"end":{"line":43,"column":3}},"locations":[{"start":{"line":41,"column":33},"end":{"line":43,"column":3}}]},"2":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":39},"end":{"line":44,"column":74}},"locations":[{"start":{"line":44,"column":39},"end":{"line":44,"column":74}}]},"3":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":65},"end":{"line":44,"column":74}},"locations":[{"start":{"line":44,"column":65},"end":{"line":44,"column":74}}]},"4":{"type":"branch","line":87,"loc":{"start":{"line":87,"column":7},"end":{"line":170,"column":1}},"locations":[{"start":{"line":87,"column":7},"end":{"line":170,"column":1}}]},"5":{"type":"branch","line":95,"loc":{"start":{"line":95,"column":32},"end":{"line":97,"column":3}},"locations":[{"start":{"line":95,"column":32},"end":{"line":97,"column":3}}]},"6":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":2},"end":{"line":164,"column":3}},"locations":[{"start":{"line":107,"column":2},"end":{"line":164,"column":3}}]},"7":{"type":"branch","line":109,"loc":{"start":{"line":109,"column":52},"end":{"line":112,"column":5}},"locations":[{"start":{"line":109,"column":52},"end":{"line":112,"column":5}}]},"8":{"type":"branch","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":115,"column":51}},"locations":[{"start":{"line":112,"column":4},"end":{"line":115,"column":51}}]},"9":{"type":"branch","line":115,"loc":{"start":{"line":115,"column":51},"end":{"line":118,"column":5}},"locations":[{"start":{"line":115,"column":51},"end":{"line":118,"column":5}}]},"10":{"type":"branch","line":118,"loc":{"start":{"line":118,"column":4},"end":{"line":122,"column":35}},"locations":[{"start":{"line":118,"column":4},"end":{"line":122,"column":35}}]},"11":{"type":"branch","line":122,"loc":{"start":{"line":122,"column":35},"end":{"line":150,"column":5}},"locations":[{"start":{"line":122,"column":35},"end":{"line":150,"column":5}}]},"12":{"type":"branch","line":126,"loc":{"start":{"line":126,"column":37},"end":{"line":132,"column":33}},"locations":[{"start":{"line":126,"column":37},"end":{"line":132,"column":33}}]},"13":{"type":"branch","line":132,"loc":{"start":{"line":132,"column":23},"end":{"line":132,"column":53}},"locations":[{"start":{"line":132,"column":23},"end":{"line":132,"column":53}}]},"14":{"type":"branch","line":132,"loc":{"start":{"line":132,"column":53},"end":{"line":138,"column":7}},"locations":[{"start":{"line":132,"column":53},"end":{"line":138,"column":7}}]},"15":{"type":"branch","line":134,"loc":{"start":{"line":134,"column":42},"end":{"line":134,"column":83}},"locations":[{"start":{"line":134,"column":42},"end":{"line":134,"column":83}}]},"16":{"type":"branch","line":138,"loc":{"start":{"line":138,"column":6},"end":{"line":141,"column":72}},"locations":[{"start":{"line":138,"column":6},"end":{"line":141,"column":72}}]},"17":{"type":"branch","line":141,"loc":{"start":{"line":141,"column":72},"end":{"line":149,"column":7}},"locations":[{"start":{"line":141,"column":72},"end":{"line":149,"column":7}}]},"18":{"type":"branch","line":150,"loc":{"start":{"line":150,"column":4},"end":{"line":153,"column":57}},"locations":[{"start":{"line":150,"column":4},"end":{"line":153,"column":57}}]},"19":{"type":"branch","line":153,"loc":{"start":{"line":153,"column":57},"end":{"line":160,"column":5}},"locations":[{"start":{"line":153,"column":57},"end":{"line":160,"column":5}}]},"20":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":4},"end":{"line":163,"column":55}},"locations":[{"start":{"line":160,"column":4},"end":{"line":163,"column":55}}]},"21":{"type":"branch","line":190,"loc":{"start":{"line":190,"column":7},"end":{"line":238,"column":1}},"locations":[{"start":{"line":190,"column":7},"end":{"line":238,"column":1}}]},"22":{"type":"branch","line":199,"loc":{"start":{"line":199,"column":51},"end":{"line":201,"column":3}},"locations":[{"start":{"line":199,"column":51},"end":{"line":201,"column":3}}]},"23":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":30},"end":{"line":206,"column":3}},"locations":[{"start":{"line":204,"column":30},"end":{"line":206,"column":3}}]},"24":{"type":"branch","line":213,"loc":{"start":{"line":213,"column":63},"end":{"line":215,"column":5}},"locations":[{"start":{"line":213,"column":63},"end":{"line":215,"column":5}}]},"25":{"type":"branch","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":218,"column":33}},"locations":[{"start":{"line":215,"column":4},"end":{"line":218,"column":33}}]},"26":{"type":"branch","line":218,"loc":{"start":{"line":218,"column":33},"end":{"line":235,"column":10}},"locations":[{"start":{"line":218,"column":33},"end":{"line":235,"column":10}}]},"27":{"type":"branch","line":219,"loc":{"start":{"line":219,"column":30},"end":{"line":220,"column":44}},"locations":[{"start":{"line":219,"column":30},"end":{"line":220,"column":44}}]},"28":{"type":"branch","line":220,"loc":{"start":{"line":220,"column":30},"end":{"line":221,"column":39}},"locations":[{"start":{"line":220,"column":30},"end":{"line":221,"column":39}}]},"29":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":39},"end":{"line":223,"column":7}},"locations":[{"start":{"line":221,"column":39},"end":{"line":223,"column":7}}]},"30":{"type":"branch","line":229,"loc":{"start":{"line":229,"column":48},"end":{"line":231,"column":7}},"locations":[{"start":{"line":229,"column":48},"end":{"line":231,"column":7}}]},"31":{"type":"branch","line":235,"loc":{"start":{"line":235,"column":2},"end":{"line":237,"column":3}},"locations":[{"start":{"line":235,"column":2},"end":{"line":237,"column":3}}]},"32":{"type":"branch","line":284,"loc":{"start":{"line":284,"column":7},"end":{"line":351,"column":1}},"locations":[{"start":{"line":284,"column":7},"end":{"line":351,"column":1}}]},"33":{"type":"branch","line":294,"loc":{"start":{"line":294,"column":53},"end":{"line":296,"column":3}},"locations":[{"start":{"line":294,"column":53},"end":{"line":296,"column":3}}]},"34":{"type":"branch","line":299,"loc":{"start":{"line":299,"column":31},"end":{"line":301,"column":3}},"locations":[{"start":{"line":299,"column":31},"end":{"line":301,"column":3}}]},"35":{"type":"branch","line":307,"loc":{"start":{"line":307,"column":33},"end":{"line":309,"column":3}},"locations":[{"start":{"line":307,"column":33},"end":{"line":309,"column":3}}]},"36":{"type":"branch","line":309,"loc":{"start":{"line":309,"column":2},"end":{"line":316,"column":3}},"locations":[{"start":{"line":309,"column":2},"end":{"line":316,"column":3}}]},"37":{"type":"branch","line":313,"loc":{"start":{"line":313,"column":32},"end":{"line":313,"column":64}},"locations":[{"start":{"line":313,"column":32},"end":{"line":313,"column":64}}]},"38":{"type":"branch","line":313,"loc":{"start":{"line":313,"column":64},"end":{"line":315,"column":5}},"locations":[{"start":{"line":313,"column":64},"end":{"line":315,"column":5}}]},"39":{"type":"branch","line":316,"loc":{"start":{"line":316,"column":2},"end":{"line":323,"column":3}},"locations":[{"start":{"line":316,"column":2},"end":{"line":323,"column":3}}]},"40":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":33},"end":{"line":320,"column":69}},"locations":[{"start":{"line":320,"column":33},"end":{"line":320,"column":69}}]},"41":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":69},"end":{"line":322,"column":5}},"locations":[{"start":{"line":320,"column":69},"end":{"line":322,"column":5}}]},"42":{"type":"branch","line":323,"loc":{"start":{"line":323,"column":2},"end":{"line":326,"column":35}},"locations":[{"start":{"line":323,"column":2},"end":{"line":326,"column":35}}]},"43":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":14},"end":{"line":326,"column":73}},"locations":[{"start":{"line":326,"column":14},"end":{"line":326,"column":73}}]},"44":{"type":"branch","line":326,"loc":{"start":{"line":326,"column":73},"end":{"line":331,"column":3}},"locations":[{"start":{"line":326,"column":73},"end":{"line":331,"column":3}}]},"45":{"type":"branch","line":331,"loc":{"start":{"line":331,"column":2},"end":{"line":334,"column":23}},"locations":[{"start":{"line":331,"column":2},"end":{"line":334,"column":23}}]},"46":{"type":"branch","line":334,"loc":{"start":{"line":334,"column":23},"end":{"line":348,"column":3}},"locations":[{"start":{"line":334,"column":23},"end":{"line":348,"column":3}}]},"47":{"type":"branch","line":348,"loc":{"start":{"line":348,"column":2},"end":{"line":351,"column":1}},"locations":[{"start":{"line":348,"column":2},"end":{"line":351,"column":1}}]},"48":{"type":"branch","line":363,"loc":{"start":{"line":363,"column":7},"end":{"line":371,"column":1}},"locations":[{"start":{"line":363,"column":7},"end":{"line":371,"column":1}}]},"49":{"type":"branch","line":364,"loc":{"start":{"line":364,"column":77},"end":{"line":366,"column":3}},"locations":[{"start":{"line":364,"column":77},"end":{"line":366,"column":3}}]},"50":{"type":"branch","line":410,"loc":{"start":{"line":410,"column":7},"end":{"line":491,"column":1}},"locations":[{"start":{"line":410,"column":7},"end":{"line":491,"column":1}}]},"51":{"type":"branch","line":430,"loc":{"start":{"line":430,"column":36},"end":{"line":432,"column":3}},"locations":[{"start":{"line":430,"column":36},"end":{"line":432,"column":3}}]},"52":{"type":"branch","line":434,"loc":{"start":{"line":434,"column":35},"end":{"line":436,"column":9}},"locations":[{"start":{"line":434,"column":35},"end":{"line":436,"column":9}}]},"53":{"type":"branch","line":436,"loc":{"start":{"line":436,"column":2},"end":{"line":438,"column":3}},"locations":[{"start":{"line":436,"column":2},"end":{"line":438,"column":3}}]},"54":{"type":"branch","line":440,"loc":{"start":{"line":440,"column":35},"end":{"line":442,"column":3}},"locations":[{"start":{"line":440,"column":35},"end":{"line":442,"column":3}}]},"55":{"type":"branch","line":444,"loc":{"start":{"line":444,"column":69},"end":{"line":446,"column":13}},"locations":[{"start":{"line":444,"column":69},"end":{"line":446,"column":13}}]},"56":{"type":"branch","line":446,"loc":{"start":{"line":446,"column":2},"end":{"line":448,"column":3}},"locations":[{"start":{"line":446,"column":2},"end":{"line":448,"column":3}}]},"57":{"type":"branch","line":450,"loc":{"start":{"line":450,"column":69},"end":{"line":452,"column":13}},"locations":[{"start":{"line":450,"column":69},"end":{"line":452,"column":13}}]},"58":{"type":"branch","line":456,"loc":{"start":{"line":456,"column":66},"end":{"line":458,"column":13}},"locations":[{"start":{"line":456,"column":66},"end":{"line":458,"column":13}}]},"59":{"type":"branch","line":458,"loc":{"start":{"line":458,"column":2},"end":{"line":460,"column":3}},"locations":[{"start":{"line":458,"column":2},"end":{"line":460,"column":3}}]},"60":{"type":"branch","line":462,"loc":{"start":{"line":462,"column":99},"end":{"line":464,"column":13}},"locations":[{"start":{"line":462,"column":99},"end":{"line":464,"column":13}}]},"61":{"type":"branch","line":464,"loc":{"start":{"line":464,"column":2},"end":{"line":466,"column":3}},"locations":[{"start":{"line":464,"column":2},"end":{"line":466,"column":3}}]},"62":{"type":"branch","line":478,"loc":{"start":{"line":478,"column":40},"end":{"line":484,"column":3}},"locations":[{"start":{"line":478,"column":40},"end":{"line":484,"column":3}}]},"63":{"type":"branch","line":479,"loc":{"start":{"line":479,"column":32},"end":{"line":483,"column":5}},"locations":[{"start":{"line":479,"column":32},"end":{"line":483,"column":5}}]},"64":{"type":"branch","line":499,"loc":{"start":{"line":499,"column":7},"end":{"line":527,"column":1}},"locations":[{"start":{"line":499,"column":7},"end":{"line":527,"column":1}}]},"65":{"type":"branch","line":500,"loc":{"start":{"line":500,"column":36},"end":{"line":502,"column":3}},"locations":[{"start":{"line":500,"column":36},"end":{"line":502,"column":3}}]},"66":{"type":"branch","line":520,"loc":{"start":{"line":520,"column":30},"end":{"line":524,"column":3}},"locations":[{"start":{"line":520,"column":30},"end":{"line":524,"column":3}}]},"67":{"type":"branch","line":536,"loc":{"start":{"line":536,"column":7},"end":{"line":558,"column":1}},"locations":[{"start":{"line":536,"column":7},"end":{"line":558,"column":1}}]},"68":{"type":"branch","line":537,"loc":{"start":{"line":537,"column":32},"end":{"line":539,"column":3}},"locations":[{"start":{"line":537,"column":32},"end":{"line":539,"column":3}}]},"69":{"type":"branch","line":545,"loc":{"start":{"line":545,"column":26},"end":{"line":545,"column":55}},"locations":[{"start":{"line":545,"column":26},"end":{"line":545,"column":55}}]},"70":{"type":"branch","line":545,"loc":{"start":{"line":545,"column":55},"end":{"line":555,"column":10}},"locations":[{"start":{"line":545,"column":55},"end":{"line":555,"column":10}}]},"71":{"type":"branch","line":547,"loc":{"start":{"line":547,"column":39},"end":{"line":551,"column":7}},"locations":[{"start":{"line":547,"column":39},"end":{"line":551,"column":7}}]},"72":{"type":"branch","line":548,"loc":{"start":{"line":548,"column":27},"end":{"line":550,"column":9}},"locations":[{"start":{"line":548,"column":27},"end":{"line":550,"column":9}}]},"73":{"type":"branch","line":555,"loc":{"start":{"line":555,"column":2},"end":{"line":557,"column":3}},"locations":[{"start":{"line":555,"column":2},"end":{"line":557,"column":3}}]},"74":{"type":"branch","line":579,"loc":{"start":{"line":579,"column":7},"end":{"line":601,"column":1}},"locations":[{"start":{"line":579,"column":7},"end":{"line":601,"column":1}}]},"75":{"type":"branch","line":587,"loc":{"start":{"line":587,"column":7},"end":{"line":587,"column":37}},"locations":[{"start":{"line":587,"column":7},"end":{"line":587,"column":37}}]},"76":{"type":"branch","line":587,"loc":{"start":{"line":587,"column":37},"end":{"line":593,"column":3}},"locations":[{"start":{"line":587,"column":37},"end":{"line":593,"column":3}}]},"77":{"type":"branch","line":593,"loc":{"start":{"line":593,"column":2},"end":{"line":595,"column":34}},"locations":[{"start":{"line":593,"column":2},"end":{"line":595,"column":34}}]},"78":{"type":"branch","line":595,"loc":{"start":{"line":595,"column":34},"end":{"line":597,"column":3}},"locations":[{"start":{"line":595,"column":34},"end":{"line":597,"column":3}}]},"79":{"type":"branch","line":597,"loc":{"start":{"line":597,"column":2},"end":{"line":601,"column":1}},"locations":[{"start":{"line":597,"column":2},"end":{"line":601,"column":1}}]},"80":{"type":"branch","line":712,"loc":{"start":{"line":712,"column":7},"end":{"line":717,"column":1}},"locations":[{"start":{"line":712,"column":7},"end":{"line":717,"column":1}}]},"81":{"type":"branch","line":715,"loc":{"start":{"line":715,"column":9},"end":{"line":715,"column":45}},"locations":[{"start":{"line":715,"column":9},"end":{"line":715,"column":45}}]},"82":{"type":"branch","line":725,"loc":{"start":{"line":725,"column":7},"end":{"line":729,"column":1}},"locations":[{"start":{"line":725,"column":7},"end":{"line":729,"column":1}}]},"83":{"type":"branch","line":728,"loc":{"start":{"line":728,"column":9},"end":{"line":728,"column":55}},"locations":[{"start":{"line":728,"column":9},"end":{"line":728,"column":55}}]},"84":{"type":"branch","line":728,"loc":{"start":{"line":728,"column":50},"end":{"line":728,"column":80}},"locations":[{"start":{"line":728,"column":50},"end":{"line":728,"column":80}}]}},"b":{"0":[3],"1":[0],"2":[8],"3":[0],"4":[4],"5":[0],"6":[7],"7":[1],"8":[6],"9":[0],"10":[6],"11":[2],"12":[1],"13":[0],"14":[1],"15":[0],"16":[0],"17":[0],"18":[6],"19":[0],"20":[6],"21":[5],"22":[0],"23":[0],"24":[2],"25":[3],"26":[2],"27":[1],"28":[1],"29":[1],"30":[0],"31":[0],"32":[4],"33":[0],"34":[0],"35":[1],"36":[3],"37":[2],"38":[1],"39":[2],"40":[1],"41":[1],"42":[1],"43":[0],"44":[0],"45":[1],"46":[0],"47":[1],"48":[5],"49":[0],"50":[3],"51":[0],"52":[1],"53":[2],"54":[0],"55":[2],"56":[1],"57":[0],"58":[1],"59":[2],"60":[2],"61":[1],"62":[13],"63":[1],"64":[3],"65":[0],"66":[0],"67":[3],"68":[0],"69":[2],"70":[2],"71":[6],"72":[4],"73":[1],"74":[14],"75":[13],"76":[2],"77":[12],"78":[8],"79":[4],"80":[5],"81":[96],"82":[2],"83":[1],"84":[1]},"fnMap":{"0":{"name":"escapeHtml","decl":{"start":{"line":40,"column":7},"end":{"line":45,"column":1}},"loc":{"start":{"line":40,"column":7},"end":{"line":45,"column":1}},"line":40},"1":{"name":"unescapeHtml","decl":{"start":{"line":53,"column":7},"end":{"line":61,"column":1}},"loc":{"start":{"line":53,"column":7},"end":{"line":61,"column":1}},"line":53},"2":{"name":"sanitizeHtml","decl":{"start":{"line":87,"column":7},"end":{"line":170,"column":1}},"loc":{"start":{"line":87,"column":7},"end":{"line":170,"column":1}},"line":87},"3":{"name":"cleanElement","decl":{"start":{"line":107,"column":2},"end":{"line":164,"column":3}},"loc":{"start":{"line":107,"column":2},"end":{"line":164,"column":3}},"line":107},"4":{"name":"validateUrl","decl":{"start":{"line":190,"column":7},"end":{"line":238,"column":1}},"loc":{"start":{"line":190,"column":7},"end":{"line":238,"column":1}},"line":190},"5":{"name":"isSafeRedirectUrl","decl":{"start":{"line":247,"column":7},"end":{"line":271,"column":1}},"loc":{"start":{"line":247,"column":7},"end":{"line":271,"column":1}},"line":247},"6":{"name":"validatePath","decl":{"start":{"line":284,"column":7},"end":{"line":351,"column":1}},"loc":{"start":{"line":284,"column":7},"end":{"line":351,"column":1}},"line":284},"7":{"name":"isValidEmail","decl":{"start":{"line":363,"column":7},"end":{"line":371,"column":1}},"loc":{"start":{"line":363,"column":7},"end":{"line":371,"column":1}},"line":363},"8":{"name":"isValidUsername","decl":{"start":{"line":380,"column":7},"end":{"line":401,"column":1}},"loc":{"start":{"line":380,"column":7},"end":{"line":401,"column":1}},"line":380},"9":{"name":"validatePasswordStrength","decl":{"start":{"line":410,"column":7},"end":{"line":491,"column":1}},"loc":{"start":{"line":410,"column":7},"end":{"line":491,"column":1}},"line":410},"10":{"name":"sanitizeFilename","decl":{"start":{"line":499,"column":7},"end":{"line":527,"column":1}},"loc":{"start":{"line":499,"column":7},"end":{"line":527,"column":1}},"line":499},"11":{"name":"sanitizeJson","decl":{"start":{"line":536,"column":7},"end":{"line":558,"column":1}},"loc":{"start":{"line":536,"column":7},"end":{"line":558,"column":1}},"line":536},"12":{"name":"isRateLimited","decl":{"start":{"line":579,"column":7},"end":{"line":601,"column":1}},"loc":{"start":{"line":579,"column":7},"end":{"line":601,"column":1}},"line":579},"13":{"name":"resetRateLimit","decl":{"start":{"line":608,"column":7},"end":{"line":610,"column":1}},"loc":{"start":{"line":608,"column":7},"end":{"line":610,"column":1}},"line":608},"14":{"name":"getRemainingAttempts","decl":{"start":{"line":619,"column":7},"end":{"line":625,"column":1}},"loc":{"start":{"line":619,"column":7},"end":{"line":625,"column":1}},"line":619},"15":{"name":"generateCspNonce","decl":{"start":{"line":636,"column":7},"end":{"line":639,"column":1}},"loc":{"start":{"line":636,"column":7},"end":{"line":639,"column":1}},"line":636},"16":{"name":"buildCspHeader","decl":{"start":{"line":662,"column":7},"end":{"line":669,"column":1}},"loc":{"start":{"line":662,"column":7},"end":{"line":669,"column":1}},"line":662},"17":{"name":"checkSecurityHeaders","decl":{"start":{"line":678,"column":7},"end":{"line":700,"column":1}},"loc":{"start":{"line":678,"column":7},"end":{"line":700,"column":1}},"line":678},"18":{"name":"generateSecureToken","decl":{"start":{"line":712,"column":7},"end":{"line":717,"column":1}},"loc":{"start":{"line":712,"column":7},"end":{"line":717,"column":1}},"line":712},"19":{"name":"generateSecureId","decl":{"start":{"line":725,"column":7},"end":{"line":729,"column":1}},"loc":{"start":{"line":725,"column":7},"end":{"line":729,"column":1}},"line":725}},"f":{"0":3,"1":0,"2":4,"3":7,"4":5,"5":0,"6":4,"7":5,"8":0,"9":3,"10":3,"11":3,"12":14,"13":0,"14":0,"15":0,"16":0,"17":0,"18":5,"19":2}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\skill-adapter.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\skill-adapter.ts","all":true,"statementMap":{"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":53}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":105}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":70}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":74}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":64}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":71}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":66}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":47}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":59}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":71}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":2}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":68}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":72}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":73}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":59}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":5}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":19}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":76}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":27}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":17}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":34}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":44}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":64}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":60}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":30}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":22}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":24}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":23}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":46}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":12}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":1}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":74}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":26}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":33}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":33}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":69}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":47}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":39}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":25}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":9}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":75}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":49}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":38}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":24}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":9}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":7}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":5}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":3}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":26}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":69}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":10}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":21}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":41}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":46}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":45}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":45}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":38}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":35}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":21}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":25}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":4}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":71}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":36}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":83}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":39}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":70}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":38}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":18}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":58}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":64}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":43}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":47}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":63}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":5}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":43}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":52}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":63}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":70}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":45}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":62}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":7}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":79}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":28}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":5}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":29}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":38}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":23}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":1}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":64}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":39}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":31}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":25}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":37}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":5}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":3}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":32}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":1}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":78}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":29}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":1}}},"s":{"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"43":0,"44":0,"46":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"58":0,"59":0,"61":0,"62":0,"63":0,"64":0,"69":0,"71":0,"72":0,"73":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"88":0,"89":0,"91":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"110":0,"111":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"134":0,"135":0,"136":0,"141":0,"142":0,"143":0,"145":0,"147":0,"148":0,"151":0,"154":0,"157":0,"158":0,"159":0,"160":0,"161":0,"164":0,"165":0,"166":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"178":0,"180":0,"181":0,"183":0,"184":0,"185":0,"186":0,"187":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"212":0,"213":0,"214":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5937},"end":{"line":215,"column":1}},"locations":[{"start":{"line":1,"column":5937},"end":{"line":215,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5937},"end":{"line":215,"column":1}},"loc":{"start":{"line":1,"column":5937},"end":{"line":215,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\skill-discovery.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\skill-discovery.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":44}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":56}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":35}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":35}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":52}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":45}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":17}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":21}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":50}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":9}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":62}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":75}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":63}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":36}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":23}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":87}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":21}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":82}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":37}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":5}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":68}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":12}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":25}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":39}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":53}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":41}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":25}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":54}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":33}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":45}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":6}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":3}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":53}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":62}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":79}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":16}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":9}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":63}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":36}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":23}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":77}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":32}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":21}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":73}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":18}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":3}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":34}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":34}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":3}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":50}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":41}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":13}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":86}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":5}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":72}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":45}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":60}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":66}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":45}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":45}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":49}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":65}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":7}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":45}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":54}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":7}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":35}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":65}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":72}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":47}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":64}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":9}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":7}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":81}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":30}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":7}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":26}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":31}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":40}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":25}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":66}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":3}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":22}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":47}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":20}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":21}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":33}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":46}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":59}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":38}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":43}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":25}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":35}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":47}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":47}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":105}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":66}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":30}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":11}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":9}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":47}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":55}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":61}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":30}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":11}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":9}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":7}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":11}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":65}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":18}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":19}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":27}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":11}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":34}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":62}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":46}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":9}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":36}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":57}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":26}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":16}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":56}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":46}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":26}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":11}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":7}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":5}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":30}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":50}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":23}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":36}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":27}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":18}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":3}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":31}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":28}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":3}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":54}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":60}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":3}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":29}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":86}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":41}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":67}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":24}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":36}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":12}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":30}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":5}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":21}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":3}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":20}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":20}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":23}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":45}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":44}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":58}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":17}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":71}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":5}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":38}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":69}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":65}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":87}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":24}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":59}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":7}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":5}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":32}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":21}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":96}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":29}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":3}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":43}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":39}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":3}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":73}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":37}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":22}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":21}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":21}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":21}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":21}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":21}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":21}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":22}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":22}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":59}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":74}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":43}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":6}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":69}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":39}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":54}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":38}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":54}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":56}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":30}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":11}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":9}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":7}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":5}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":36}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":3}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":29}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":9}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":56}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":45}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":13}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":23}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":3}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":29}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":9}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":73}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":28}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":3}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":35}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":9}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":62}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":56}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":13}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":34}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":5}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":3}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":35}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":9}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":90}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":28}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":3}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":1}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":50}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":59}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":19}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":43}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":3}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":19}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":1}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":45}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":19}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":1}}},"s":{"0":0,"64":0,"65":0,"69":0,"70":0,"71":0,"72":0,"74":0,"75":0,"76":0,"78":0,"79":0,"85":0,"86":0,"88":0,"89":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"146":0,"147":0,"148":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"163":0,"164":0,"167":0,"170":0,"173":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"194":0,"196":0,"197":0,"199":0,"200":0,"201":0,"202":0,"204":0,"205":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"220":0,"223":0,"224":0,"225":0,"227":0,"228":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"272":0,"273":0,"274":0,"277":0,"278":0,"280":0,"281":0,"288":0,"289":0,"290":0,"295":0,"296":0,"297":0,"302":0,"303":0,"304":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"334":0,"335":0,"336":0,"337":0,"339":0,"340":0,"341":0,"342":0,"344":0,"345":0,"346":0,"347":0,"348":0,"353":0,"354":0,"355":0,"359":0,"360":0,"362":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"373":0,"375":0,"377":0,"378":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"392":0,"393":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"430":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"439":0,"440":0,"441":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":12096},"end":{"line":442,"column":1}},"locations":[{"start":{"line":1,"column":12096},"end":{"line":442,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":12096},"end":{"line":442,"column":1}},"loc":{"start":{"line":1,"column":12096},"end":{"line":442,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\tauri-gateway.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\tauri-gateway.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":99}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":10}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":14}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":24}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":22}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":23}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":25}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":24}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":20}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":15}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":19}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":21}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":10}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":12}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":43}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":74}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":79}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":26}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":38}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":45}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":1}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":72}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":76}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":44}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":1}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":72}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":43}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":71}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":42}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":74}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":45}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":72}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":26}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":12}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":23}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":25}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":56}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":89}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":26}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":12}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":23}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":28}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":30}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":6}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":3}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":72}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":1}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":157}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":26}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":22}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":21}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":3}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":86}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":13}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":20}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":8}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":78}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":26}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":12}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":20}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":20}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":26}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":62}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":1}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":45}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":15}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":16}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":33}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":26}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":12}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":23}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":15}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":15}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":26}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":6}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":3}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":63}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":8}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":10}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":1}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":70}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":12}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":25}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":22}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":26}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":14}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":6}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":3}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":53}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":1}}},"s":{"0":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"59":0,"60":0,"61":0,"62":0,"64":0,"65":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"95":0,"96":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"173":0,"174":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"197":0,"198":0,"199":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"217":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5266},"end":{"line":218,"column":1}},"locations":[{"start":{"line":1,"column":5266},"end":{"line":218,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5266},"end":{"line":218,"column":1}},"loc":{"start":{"line":1,"column":5266},"end":{"line":218,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\team-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\team-client.ts","all":false,"statementMap":{"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":41}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":20}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":30}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":28}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":28}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":19}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":31}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":3}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":1}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":26}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":19}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":27}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":39}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":7}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":39}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":16}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":43}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":27}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":8}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":17}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":7}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":23}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":64}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":29}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":55}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":24}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":17}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":8}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":27}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":19}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":40}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":18}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":5}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":27}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":31}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":8}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":15}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":11}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":6}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":78}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":61}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":1}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":70}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":51}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":1}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":82}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":42}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":19}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":33}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":17}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":74}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":52}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":18}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":31}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":1}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":81}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":60}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":21}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":1}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":36}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":17}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":22}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":54}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":59}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":31}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":5}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":21}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":46}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":5}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":4}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":1}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":39}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":17}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":18}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":34}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":39}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":43}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":24}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":4}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":1}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":39}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":17}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":19}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":22}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":54}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":59}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":43}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":5}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":37}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":4}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":1}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":34}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":50}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":55}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":34}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":5}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":21}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":28}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":26}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":38}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":32}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":24}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":36}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":40}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":32}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":9}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":4}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":1}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":39}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":17}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":28}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":50}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":55}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":39}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":5}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":20}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":39}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":4}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":1}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":33}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":17}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":17}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":18}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":50}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":55}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":46}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":5}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":21}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":41}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":5}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":4}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":1}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":40}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":17}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":17}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":30}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":50}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":55}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":51}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":21}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":40}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":5}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":4}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":1}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":37}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":17}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":17}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":22}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":20}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":51}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":56}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":29}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":5}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":21}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":64}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":5}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":4}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":1}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":35}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":17}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":17}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":61}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":51}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":56}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":46}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":21}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":37}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":5}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":4}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":1}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":38}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":17}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":17}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":27}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":51}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":56}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":5}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":20}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":38}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":4}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":1}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":76}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":58}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":1}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":36}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":17}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":16}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":61}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":47}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":66}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":37}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":4}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":1}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":38}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":45}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":46}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":15}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":15}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":50}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":9}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":42}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":39}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":56}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":45}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":9}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":7}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":13}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":5}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":4}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":48}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":41}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":28}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":24}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":49}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":8}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":3}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":16}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":53}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":43}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":30}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":28}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":51}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":10}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":5}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":4}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":1}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":27}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":12}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":10}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":13}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":13}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":13}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":16}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":19}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":19}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":14}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":19}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":13}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":20}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":17}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":15}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":18}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":17}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":16}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":24}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":2}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":26}}},"s":{"30":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"48":17,"49":17,"50":17,"51":17,"52":17,"54":17,"55":17,"56":17,"57":17,"58":17,"59":17,"60":17,"61":17,"63":17,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"73":17,"74":17,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":17,"92":1,"93":1,"94":1,"99":1,"100":1,"101":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"129":1,"130":1,"131":1,"132":1,"133":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"319":1,"320":1,"321":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"376":0,"377":0,"378":0,"379":0,"380":1,"382":1,"383":1,"385":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"396":1,"397":1,"398":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"409":1,"411":1,"412":1,"413":1,"414":1,"415":1,"418":1,"419":1,"420":1,"423":1,"424":1,"425":1,"426":1,"429":1,"430":1,"431":1,"434":1,"435":1,"436":1,"437":1,"439":1},"branchMap":{"0":{"type":"branch","line":36,"loc":{"start":{"line":36,"column":2},"end":{"line":44,"column":3}},"locations":[{"start":{"line":36,"column":2},"end":{"line":44,"column":3}}]},"1":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":0},"end":{"line":86,"column":1}},"locations":[{"start":{"line":49,"column":0},"end":{"line":86,"column":1}}]},"2":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":22},"end":{"line":72,"column":5}},"locations":[{"start":{"line":64,"column":22},"end":{"line":72,"column":5}}]},"3":{"type":"branch","line":75,"loc":{"start":{"line":75,"column":2},"end":{"line":85,"column":3}},"locations":[{"start":{"line":75,"column":2},"end":{"line":85,"column":3}}]},"4":{"type":"branch","line":93,"loc":{"start":{"line":93,"column":0},"end":{"line":95,"column":1}},"locations":[{"start":{"line":93,"column":0},"end":{"line":95,"column":1}}]},"5":{"type":"branch","line":100,"loc":{"start":{"line":100,"column":0},"end":{"line":102,"column":1}},"locations":[{"start":{"line":100,"column":0},"end":{"line":102,"column":1}}]},"6":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":0},"end":{"line":112,"column":1}},"locations":[{"start":{"line":107,"column":0},"end":{"line":112,"column":1}}]},"7":{"type":"branch","line":117,"loc":{"start":{"line":117,"column":0},"end":{"line":125,"column":1}},"locations":[{"start":{"line":117,"column":0},"end":{"line":125,"column":1}}]},"8":{"type":"branch","line":130,"loc":{"start":{"line":130,"column":0},"end":{"line":134,"column":1}},"locations":[{"start":{"line":130,"column":0},"end":{"line":134,"column":1}}]},"9":{"type":"branch","line":141,"loc":{"start":{"line":141,"column":0},"end":{"line":153,"column":1}},"locations":[{"start":{"line":141,"column":0},"end":{"line":153,"column":1}}]},"10":{"type":"branch","line":158,"loc":{"start":{"line":158,"column":0},"end":{"line":166,"column":1}},"locations":[{"start":{"line":158,"column":0},"end":{"line":166,"column":1}}]},"11":{"type":"branch","line":171,"loc":{"start":{"line":171,"column":0},"end":{"line":183,"column":1}},"locations":[{"start":{"line":171,"column":0},"end":{"line":183,"column":1}}]},"12":{"type":"branch","line":190,"loc":{"start":{"line":190,"column":0},"end":{"line":208,"column":1}},"locations":[{"start":{"line":190,"column":0},"end":{"line":208,"column":1}}]},"13":{"type":"branch","line":213,"loc":{"start":{"line":213,"column":0},"end":{"line":225,"column":1}},"locations":[{"start":{"line":213,"column":0},"end":{"line":225,"column":1}}]},"14":{"type":"branch","line":230,"loc":{"start":{"line":230,"column":0},"end":{"line":242,"column":1}},"locations":[{"start":{"line":230,"column":0},"end":{"line":242,"column":1}}]},"15":{"type":"branch","line":247,"loc":{"start":{"line":247,"column":0},"end":{"line":259,"column":1}},"locations":[{"start":{"line":247,"column":0},"end":{"line":259,"column":1}}]},"16":{"type":"branch","line":266,"loc":{"start":{"line":266,"column":0},"end":{"line":279,"column":1}},"locations":[{"start":{"line":266,"column":0},"end":{"line":279,"column":1}}]},"17":{"type":"branch","line":284,"loc":{"start":{"line":284,"column":0},"end":{"line":296,"column":1}},"locations":[{"start":{"line":284,"column":0},"end":{"line":296,"column":1}}]},"18":{"type":"branch","line":301,"loc":{"start":{"line":301,"column":0},"end":{"line":313,"column":1}},"locations":[{"start":{"line":301,"column":0},"end":{"line":313,"column":1}}]},"19":{"type":"branch","line":320,"loc":{"start":{"line":320,"column":0},"end":{"line":322,"column":1}},"locations":[{"start":{"line":320,"column":0},"end":{"line":322,"column":1}}]},"20":{"type":"branch","line":327,"loc":{"start":{"line":327,"column":0},"end":{"line":335,"column":1}},"locations":[{"start":{"line":327,"column":0},"end":{"line":335,"column":1}}]},"21":{"type":"branch","line":331,"loc":{"start":{"line":331,"column":39},"end":{"line":331,"column":47}},"locations":[{"start":{"line":331,"column":39},"end":{"line":331,"column":47}}]},"22":{"type":"branch","line":367,"loc":{"start":{"line":367,"column":7},"end":{"line":406,"column":1}},"locations":[{"start":{"line":367,"column":7},"end":{"line":406,"column":1}}]},"23":{"type":"branch","line":392,"loc":{"start":{"line":392,"column":36},"end":{"line":392,"column":49}},"locations":[{"start":{"line":392,"column":36},"end":{"line":392,"column":49}}]},"24":{"type":"branch","line":372,"loc":{"start":{"line":372,"column":24},"end":{"line":384,"column":4}},"locations":[{"start":{"line":372,"column":24},"end":{"line":384,"column":4}}]},"25":{"type":"branch","line":375,"loc":{"start":{"line":375,"column":38},"end":{"line":380,"column":7}},"locations":[{"start":{"line":375,"column":38},"end":{"line":380,"column":7}}]},"26":{"type":"branch","line":397,"loc":{"start":{"line":397,"column":9},"end":{"line":405,"column":4}},"locations":[{"start":{"line":397,"column":9},"end":{"line":405,"column":4}}]},"27":{"type":"branch","line":402,"loc":{"start":{"line":402,"column":38},"end":{"line":402,"column":51}},"locations":[{"start":{"line":402,"column":38},"end":{"line":402,"column":51}}]}},"b":{"0":[1],"1":[17],"2":[0],"3":[0],"4":[1],"5":[1],"6":[1],"7":[1],"8":[1],"9":[1],"10":[1],"11":[1],"12":[1],"13":[1],"14":[1],"15":[1],"16":[1],"17":[1],"18":[1],"19":[1],"20":[1],"21":[0],"22":[1],"23":[0],"24":[1],"25":[0],"26":[1],"27":[0]},"fnMap":{"0":{"name":"TeamAPIError","decl":{"start":{"line":36,"column":2},"end":{"line":44,"column":3}},"loc":{"start":{"line":36,"column":2},"end":{"line":44,"column":3}},"line":36},"1":{"name":"request","decl":{"start":{"line":49,"column":0},"end":{"line":86,"column":1}},"loc":{"start":{"line":49,"column":0},"end":{"line":86,"column":1}},"line":49},"2":{"name":"listTeams","decl":{"start":{"line":93,"column":0},"end":{"line":95,"column":1}},"loc":{"start":{"line":93,"column":0},"end":{"line":95,"column":1}},"line":93},"3":{"name":"getTeam","decl":{"start":{"line":100,"column":0},"end":{"line":102,"column":1}},"loc":{"start":{"line":100,"column":0},"end":{"line":102,"column":1}},"line":100},"4":{"name":"createTeam","decl":{"start":{"line":107,"column":0},"end":{"line":112,"column":1}},"loc":{"start":{"line":107,"column":0},"end":{"line":112,"column":1}},"line":107},"5":{"name":"updateTeam","decl":{"start":{"line":117,"column":0},"end":{"line":125,"column":1}},"loc":{"start":{"line":117,"column":0},"end":{"line":125,"column":1}},"line":117},"6":{"name":"deleteTeam","decl":{"start":{"line":130,"column":0},"end":{"line":134,"column":1}},"loc":{"start":{"line":130,"column":0},"end":{"line":134,"column":1}},"line":130},"7":{"name":"addTeamMember","decl":{"start":{"line":141,"column":0},"end":{"line":153,"column":1}},"loc":{"start":{"line":141,"column":0},"end":{"line":153,"column":1}},"line":141},"8":{"name":"removeTeamMember","decl":{"start":{"line":158,"column":0},"end":{"line":166,"column":1}},"loc":{"start":{"line":158,"column":0},"end":{"line":166,"column":1}},"line":158},"9":{"name":"updateMemberRole","decl":{"start":{"line":171,"column":0},"end":{"line":183,"column":1}},"loc":{"start":{"line":171,"column":0},"end":{"line":183,"column":1}},"line":171},"10":{"name":"addTeamTask","decl":{"start":{"line":190,"column":0},"end":{"line":208,"column":1}},"loc":{"start":{"line":190,"column":0},"end":{"line":208,"column":1}},"line":190},"11":{"name":"updateTaskStatus","decl":{"start":{"line":213,"column":0},"end":{"line":225,"column":1}},"loc":{"start":{"line":213,"column":0},"end":{"line":225,"column":1}},"line":213},"12":{"name":"assignTask","decl":{"start":{"line":230,"column":0},"end":{"line":242,"column":1}},"loc":{"start":{"line":230,"column":0},"end":{"line":242,"column":1}},"line":230},"13":{"name":"submitDeliverable","decl":{"start":{"line":247,"column":0},"end":{"line":259,"column":1}},"loc":{"start":{"line":247,"column":0},"end":{"line":259,"column":1}},"line":247},"14":{"name":"startDevQALoop","decl":{"start":{"line":266,"column":0},"end":{"line":279,"column":1}},"loc":{"start":{"line":266,"column":0},"end":{"line":279,"column":1}},"line":266},"15":{"name":"submitReview","decl":{"start":{"line":284,"column":0},"end":{"line":296,"column":1}},"loc":{"start":{"line":284,"column":0},"end":{"line":296,"column":1}},"line":284},"16":{"name":"updateLoopState","decl":{"start":{"line":301,"column":0},"end":{"line":313,"column":1}},"loc":{"start":{"line":301,"column":0},"end":{"line":313,"column":1}},"line":301},"17":{"name":"getTeamMetrics","decl":{"start":{"line":320,"column":0},"end":{"line":322,"column":1}},"loc":{"start":{"line":320,"column":0},"end":{"line":322,"column":1}},"line":320},"18":{"name":"getTeamEvents","decl":{"start":{"line":327,"column":0},"end":{"line":335,"column":1}},"loc":{"start":{"line":327,"column":0},"end":{"line":335,"column":1}},"line":327},"19":{"name":"subscribeToTeamEvents","decl":{"start":{"line":367,"column":7},"end":{"line":406,"column":1}},"loc":{"start":{"line":367,"column":7},"end":{"line":406,"column":1}},"line":367},"20":{"name":"handleMessage","decl":{"start":{"line":372,"column":24},"end":{"line":384,"column":4}},"loc":{"start":{"line":372,"column":24},"end":{"line":384,"column":4}},"line":372}},"f":{"0":1,"1":17,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\toml-utils.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\toml-utils.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":43}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":14}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":20}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":35}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":5}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":19}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":1}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":47}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":14}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":20}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":35}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":5}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":19}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":37}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":1}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":26}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":63}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":9}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":38}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":21}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":50}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":31}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":86}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":13}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":8}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":4}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":57}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":34}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":21}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":54}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":35}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":90}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":13}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":48}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":16}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":70}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":20}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":38}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":7}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":83}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":8}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":16}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":7}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":50}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":20}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":48}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":11}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":64}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":40}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":4}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":55}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":39}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":4}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":54}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":55}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":36}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":34}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":26}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":29}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":4}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":2}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":25}}},"s":{"0":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"40":1,"58":1,"59":8,"60":8,"61":8,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":8,"84":1,"85":3,"86":3,"87":3,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":3,"116":1,"117":7,"118":7,"119":7,"120":7,"122":5,"123":4,"124":4,"128":1,"129":1,"130":1,"131":1,"132":7,"133":7,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"165":1,"166":4,"167":4,"175":1,"176":4,"177":4,"178":4,"179":4,"180":4,"181":4,"182":4,"183":1,"185":1},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":2},"end":{"line":22,"column":3}},"locations":[{"start":{"line":16,"column":2},"end":{"line":22,"column":3}}]},"1":{"type":"branch","line":29,"loc":{"start":{"line":29,"column":2},"end":{"line":35,"column":3}},"locations":[{"start":{"line":29,"column":2},"end":{"line":35,"column":3}}]},"2":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":9},"end":{"line":69,"column":4}},"locations":[{"start":{"line":59,"column":9},"end":{"line":69,"column":4}}]},"3":{"type":"branch","line":62,"loc":{"start":{"line":62,"column":4},"end":{"line":68,"column":5}},"locations":[{"start":{"line":62,"column":4},"end":{"line":68,"column":5}}]},"4":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":60},"end":{"line":65,"column":83}},"locations":[{"start":{"line":65,"column":60},"end":{"line":65,"column":83}}]},"5":{"type":"branch","line":85,"loc":{"start":{"line":85,"column":13},"end":{"line":95,"column":4}},"locations":[{"start":{"line":85,"column":13},"end":{"line":95,"column":4}}]},"6":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":4},"end":{"line":94,"column":5}},"locations":[{"start":{"line":88,"column":4},"end":{"line":94,"column":5}}]},"7":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":64},"end":{"line":91,"column":87}},"locations":[{"start":{"line":91,"column":64},"end":{"line":91,"column":87}}]},"8":{"type":"branch","line":117,"loc":{"start":{"line":117,"column":18},"end":{"line":134,"column":4}},"locations":[{"start":{"line":117,"column":18},"end":{"line":134,"column":4}}]},"9":{"type":"branch","line":121,"loc":{"start":{"line":121,"column":45},"end":{"line":133,"column":5}},"locations":[{"start":{"line":121,"column":45},"end":{"line":133,"column":5}}]},"10":{"type":"branch","line":123,"loc":{"start":{"line":123,"column":19},"end":{"line":125,"column":7}},"locations":[{"start":{"line":123,"column":19},"end":{"line":125,"column":7}}]},"11":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":30},"end":{"line":124,"column":38}},"locations":[{"start":{"line":124,"column":30},"end":{"line":124,"column":38}}]},"12":{"type":"branch","line":125,"loc":{"start":{"line":125,"column":6},"end":{"line":132,"column":16}},"locations":[{"start":{"line":125,"column":6},"end":{"line":132,"column":16}}]},"13":{"type":"branch","line":152,"loc":{"start":{"line":152,"column":20},"end":{"line":158,"column":4}},"locations":[{"start":{"line":152,"column":20},"end":{"line":158,"column":4}}]},"14":{"type":"branch","line":166,"loc":{"start":{"line":166,"column":24},"end":{"line":168,"column":4}},"locations":[{"start":{"line":166,"column":24},"end":{"line":168,"column":4}}]},"15":{"type":"branch","line":176,"loc":{"start":{"line":176,"column":22},"end":{"line":183,"column":4}},"locations":[{"start":{"line":176,"column":22},"end":{"line":183,"column":4}}]},"16":{"type":"branch","line":179,"loc":{"start":{"line":179,"column":33},"end":{"line":181,"column":5}},"locations":[{"start":{"line":179,"column":33},"end":{"line":181,"column":5}}]}},"b":{"0":[1],"1":[1],"2":[8],"3":[1],"4":[0],"5":[3],"6":[1],"7":[0],"8":[7],"9":[5],"10":[4],"11":[0],"12":[1],"13":[1],"14":[4],"15":[4],"16":[4]},"fnMap":{"0":{"name":"TomlParseError","decl":{"start":{"line":16,"column":2},"end":{"line":22,"column":3}},"loc":{"start":{"line":16,"column":2},"end":{"line":22,"column":3}},"line":16},"1":{"name":"TomlStringifyError","decl":{"start":{"line":29,"column":2},"end":{"line":35,"column":3}},"loc":{"start":{"line":29,"column":2},"end":{"line":35,"column":3}},"line":29},"2":{"name":"parse","decl":{"start":{"line":59,"column":9},"end":{"line":69,"column":4}},"loc":{"start":{"line":59,"column":9},"end":{"line":69,"column":4}},"line":59},"3":{"name":"stringify","decl":{"start":{"line":85,"column":13},"end":{"line":95,"column":4}},"loc":{"start":{"line":85,"column":13},"end":{"line":95,"column":4}},"line":85},"4":{"name":"resolveEnvVars","decl":{"start":{"line":117,"column":18},"end":{"line":134,"column":4}},"loc":{"start":{"line":117,"column":18},"end":{"line":134,"column":4}},"line":117},"5":{"name":"parseWithEnvVars","decl":{"start":{"line":152,"column":20},"end":{"line":158,"column":4}},"loc":{"start":{"line":152,"column":20},"end":{"line":158,"column":4}},"line":152},"6":{"name":"hasUnresolvedEnvVars","decl":{"start":{"line":166,"column":24},"end":{"line":168,"column":4}},"loc":{"start":{"line":166,"column":24},"end":{"line":168,"column":4}},"line":166},"7":{"name":"extractEnvVarNames","decl":{"start":{"line":176,"column":22},"end":{"line":183,"column":4}},"loc":{"start":{"line":176,"column":22},"end":{"line":183,"column":4}},"line":176}},"f":{"0":1,"1":1,"2":8,"3":3,"4":7,"5":1,"6":4,"7":4}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\use-onboarding.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\use-onboarding.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":62}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":46}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":50}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":50}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":51}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":75}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":19}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":9}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":71}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":64}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":47}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":62}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":32}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":27}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":26}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":7}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":19}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":24}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":15}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":5}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":9}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":84}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":38}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":17}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":44}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":6}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":9}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":61}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":74}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":34}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":25}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":86}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":19}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":78}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":5}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":9}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":45}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":9}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":56}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":48}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":27}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":24}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":54}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":19}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":72}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":5}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":9}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":10}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":13}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":16}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":18}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":20}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":4}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":60}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":62}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":51}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":17}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":69}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":3}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":14}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":1}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":50}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":67}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":1}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":29}}},"s":{"0":0,"9":0,"10":0,"38":0,"39":0,"40":0,"41":0,"44":0,"45":0,"46":0,"47":0,"49":0,"50":0,"51":0,"52":0,"53":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"66":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"123":0,"124":0,"125":0,"127":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3628},"end":{"line":128,"column":29}},"locations":[{"start":{"line":1,"column":3628},"end":{"line":128,"column":29}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3628},"end":{"line":128,"column":29}},"loc":{"start":{"line":1,"column":3628},"end":{"line":128,"column":29}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\useProposalNotifications.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\useProposalNotifications.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":44}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":81}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":58}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":46}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":64}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":17}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":53}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":5}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":11}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":3}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":19}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":1}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":7}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":44}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":70}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":11}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":3}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":45}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":3}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":35}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":36}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":44}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":62}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":56}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":49}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":32}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":87}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":49}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":44}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":78}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":8}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":36}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":31}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":80}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":69}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":21}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":41}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":13}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":38}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":48}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":9}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":39}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":49}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":9}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":60}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":7}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":78}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":35}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":16}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":19}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":25}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":27}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":75}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":18}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":32}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":6}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":38}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":42}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":31}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":6}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":74}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":79}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":6}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":29}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":10}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":42}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":34}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":4}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":1}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":53}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":19}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":55}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":66}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":43}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":80}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":6}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":81}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":18}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":86}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":6}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":9}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":14}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":1}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":40}}},"s":{"0":0,"18":0,"19":0,"22":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"35":0,"36":0,"37":0,"42":0,"43":0,"45":0,"46":0,"47":0,"49":0,"50":0,"60":0,"63":0,"64":0,"65":0,"67":0,"68":0,"69":0,"70":0,"72":0,"73":0,"75":0,"77":0,"78":0,"79":0,"82":0,"83":0,"84":0,"86":0,"87":0,"90":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"101":0,"102":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"118":0,"119":0,"122":0,"125":0,"127":0,"128":0,"129":0,"130":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"140":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"149":0,"150":0,"151":0,"158":0,"160":0,"161":0,"162":0,"163":0,"166":0,"170":0,"172":0,"174":0,"175":0,"176":0,"177":0,"179":0,"180":0,"182":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5275},"end":{"line":183,"column":40}},"locations":[{"start":{"line":1,"column":5275},"end":{"line":183,"column":40}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5275},"end":{"line":183,"column":40}},"loc":{"start":{"line":1,"column":5275},"end":{"line":183,"column":40}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\useTeamEvents.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\useTeamEvents.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":67}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":59}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":9}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":13}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":14}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":36}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":7}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":21}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":46}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":31}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":77}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":33}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":37}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":8}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":22}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":34}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":35}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":65}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":29}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":47}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":43}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":14}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":34}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":64}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":28}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":29}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":47}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":42}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":14}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":11}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":28}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":28}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":65}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":16}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":7}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":6}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":72}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":42}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":13}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":5}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":42}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":5}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":25}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":52}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":11}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":44}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":41}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":52}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":9}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":7}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":6}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":50}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":43}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":14}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":24}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":28}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":53}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":10}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":8}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":5}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":36}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":55}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":45}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":16}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":32}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":55}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":12}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":10}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":7}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":6}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":35}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":33}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":38}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":7}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":6}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":49}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":10}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":49}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":4}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":1}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":52}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":35}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":1}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":86}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":53}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":1}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":77}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":70}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":43}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":43}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":43}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":43}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":45}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":52}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":36}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":37}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":42}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":39}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":40}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":46}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":42}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":43}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":4}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":46}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":1}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":33}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":7}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":62}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":11}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":3}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":1}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}}},"s":{"0":0,"27":0,"28":0,"29":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"38":0,"40":0,"41":0,"43":0,"44":0,"45":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"81":0,"82":0,"83":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"92":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"102":0,"104":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"116":0,"118":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"153":0,"158":0,"159":0,"160":0,"165":0,"166":0,"167":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"191":0,"192":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"201":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5846},"end":{"line":202,"column":29}},"locations":[{"start":{"line":1,"column":5846},"end":{"line":202,"column":29}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5846},"end":{"line":202,"column":29}},"loc":{"start":{"line":1,"column":5846},"end":{"line":202,"column":29}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\utils.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\utils.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":45}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":31}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":1}}},"s":{"0":0,"3":0,"4":0,"5":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":168},"end":{"line":6,"column":1}},"locations":[{"start":{"line":1,"column":168},"end":{"line":6,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":168},"end":{"line":6,"column":1}},"loc":{"start":{"line":1,"column":168},"end":{"line":6,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\viking-client.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\viking-client.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":64}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":47}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":1}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":40}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":14}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":17}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":29}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":65}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":1}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":46}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":14}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":17}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":29}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":72}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":1}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":42}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":16}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":17}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":32}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":76}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":42}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":18}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":15}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":26}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":16}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":32}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":52}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":8}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":18}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":5}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":1}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":84}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":57}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":41}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":14}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":20}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":55}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":1}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":72}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":48}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":1}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":36}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":15}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":16}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":37}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":73}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":1}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":76}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":60}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":1}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":58}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":45}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":1}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":57}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":44}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":60}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":47}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":1}}},"s":{"0":0,"52":0,"53":0,"54":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"107":0,"108":0,"109":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"124":0,"125":0,"126":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"150":0,"151":0,"152":0,"157":0,"158":0,"159":0,"164":0,"165":0,"166":0,"171":0,"172":0,"173":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3521},"end":{"line":174,"column":1}},"locations":[{"start":{"line":1,"column":3521},"end":{"line":174,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3521},"end":{"line":174,"column":1}},"loc":{"start":{"line":1,"column":3521},"end":{"line":174,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\__tests__\\autonomy-manager.test.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\__tests__\\autonomy-manager.test.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":29}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":76}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":25}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":68}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":51}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":20}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":40}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":19}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":5}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":55}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":72}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":43}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":5}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":58}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":55}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":44}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":5}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":60}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":57}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":44}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":42}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":79}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":44}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":5}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":53}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":27}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":33}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":22}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":44}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":7}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":57}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":74}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":51}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":43}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":7}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":63}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":77}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":7}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":5}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":35}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":33}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":22}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":42}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":7}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":70}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":74}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":42}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":52}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":7}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":69}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":74}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":51}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":7}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":70}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":76}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":51}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":43}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":7}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":58}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":78}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":43}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":51}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":7}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":37}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":33}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":22}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":44}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":7}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":76}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":76}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":42}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":52}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":7}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":69}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":76}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":43}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":51}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":7}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":59}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":28}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":25}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":48}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":34}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":10}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":9}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":78}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":43}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":7}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":5}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":3}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":53}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":31}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":20}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":42}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":5}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":27}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":5}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":62}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":53}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":57}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":45}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":57}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":5}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":45}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":53}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":57}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":47}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":30}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":57}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":5}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":44}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":53}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":57}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":46}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":30}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":57}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":5}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":61}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":56}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":55}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":5}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":3}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":45}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":31}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":20}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":40}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":28}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":19}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":27}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":5}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":36}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":55}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":38}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":31}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":46}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":5}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":47}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":35}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":62}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":5}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":41}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":33}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":5}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":38}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":36}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":39}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":49}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":28}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":49}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":5}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":39}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":36}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":38}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":30}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":45}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":30}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":45}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":54}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":53}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":5}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":48}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":36}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":38}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":30}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":30}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":45}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":31}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":5}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":3}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":53}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":31}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":20}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":40}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":5}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":19}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":5}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":41}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":39}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":42}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":60}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":5}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":36}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":26}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":26}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":25}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":26}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":8}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":7}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":39}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":59}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":5}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":35}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":35}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":39}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":44}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":60}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":64}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":5}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":3}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":36}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":20}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":27}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":65}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":5}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":19}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":36}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":64}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":54}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":43}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":7}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":66}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":56}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":44}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":7}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":41}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":72}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":60}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":75}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":41}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":44}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":42}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":7}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":67}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":60}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":77}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":42}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":46}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":46}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":7}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":61}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":60}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":39}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":80}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":50}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":7}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":3}}},"s":{"0":0,"11":0,"20":0,"24":0,"25":0,"26":0,"27":0,"31":0,"32":0,"34":0,"35":0,"36":0,"38":0,"39":0,"40":0,"42":0,"43":0,"44":0,"45":0,"47":0,"48":0,"49":0,"50":0,"52":0,"53":0,"54":0,"55":0,"57":0,"58":0,"59":0,"60":0,"61":0,"65":0,"66":0,"67":0,"68":0,"70":0,"71":0,"73":0,"74":0,"75":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"120":0,"121":0,"123":0,"124":0,"125":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0,"150":0,"151":0,"152":0,"156":0,"157":0,"159":0,"160":0,"161":0,"163":0,"164":0,"165":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"179":0,"180":0,"181":0,"182":0,"184":0,"185":0,"186":0,"188":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"197":0,"201":0,"202":0,"204":0,"205":0,"206":0,"207":0,"209":0,"210":0,"211":0,"213":0,"214":0,"216":0,"217":0,"218":0,"219":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"234":0,"236":0,"238":0,"239":0,"241":0,"242":0,"243":0,"244":0,"246":0,"248":0,"250":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"258":0,"260":0,"261":0,"263":0,"264":0,"265":0,"269":0,"270":0,"272":0,"273":0,"274":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"283":0,"284":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0,"295":0,"296":0,"298":0,"299":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"310":0,"311":0,"312":0,"313":0,"314":0,"316":0,"317":0,"318":0,"320":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"332":0,"333":0,"334":0,"336":0,"338":0,"339":0,"340":0,"341":0,"343":0,"344":0,"346":0,"348":0,"349":0,"350":0,"351":0,"353":0,"354":0,"355":0,"357":0,"359":0,"360":0,"361":0,"362":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":363,"column":-1490}},"locations":[{"start":{"line":1,"column":0},"end":{"line":363,"column":-1490}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":363,"column":-1490}},"loc":{"start":{"line":1,"column":0},"end":{"line":363,"column":-1490}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\workflow-builder\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\workflow-builder\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":33}}},"s":{"0":0,"6":0,"7":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":295},"end":{"line":11,"column":60}},"locations":[{"start":{"line":1,"column":295},"end":{"line":11,"column":60}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":295},"end":{"line":11,"column":60}},"loc":{"start":{"line":1,"column":295},"end":{"line":11,"column":60}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\workflow-builder\\types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\workflow-builder\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":8267},"end":{"line":329,"column":1}},"locations":[{"start":{"line":1,"column":8267},"end":{"line":329,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":8267},"end":{"line":329,"column":1}},"loc":{"start":{"line":1,"column":8267},"end":{"line":329,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\lib\\workflow-builder\\yaml-converter.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\lib\\workflow-builder\\yaml-converter.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":62}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":34}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":27}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":21}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":15}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":24}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":38}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":6}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":11}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":41}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":54}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":43}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":6}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":4}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":30}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":18}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":17}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":20}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":5}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":1}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":84}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":45}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":37}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":46}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":60}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":5}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":3}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":84}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":45}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":38}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":67}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":5}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":3}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":63}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":1}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":81}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":52}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":20}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":67}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":34}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":63}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":1}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":66}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":25}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":49}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":34}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":16}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":16}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":15}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":4}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":39}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":21}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":42}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":21}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":23}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":37}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":58}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":31}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":43}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":40}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":38}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":10}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":8}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":12}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":19}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":46}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":21}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":38}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":41}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":10}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":8}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":12}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":18}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":44}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":15}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":35}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":39}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":34}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":10}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":8}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":12}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":27}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":125}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":21}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":30}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":37}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":32}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":40}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":10}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":8}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":12}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":5}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":23}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":49}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":40}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":69}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":62}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":14}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":10}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":8}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":12}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":5}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":22}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":47}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":21}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":29}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":56}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":42}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":10}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":8}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":5}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":83}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":21}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":15}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":30}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":37}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":39}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":56}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":10}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":12}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":5}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":20}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":48}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":22}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":38}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":46}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":43}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":10}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":8}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":5}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":18}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":111}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":21}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":23}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":28}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":34}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":36}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":30}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":10}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":8}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":12}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":20}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":70}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":21}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":18}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":37}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":31}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":10}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":8}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":12}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":5}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":19}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":47}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":21}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":16}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":27}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":10}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":8}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":12}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":5}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":17}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":18}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":12}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":53}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":18}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":3}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":14}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":1}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":80}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":53}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":45}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":48}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":29}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":31}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":3}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":29}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":53}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":30}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":40}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":68}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":3}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":29}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":36}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":44}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":23}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":25}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":5}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":3}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":28}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":34}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":37}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":15}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":24}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":5}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":50}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":39}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":58}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":40}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":28}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":29}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":5}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":3}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":16}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":1}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":75}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":33}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":46}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":44}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":32}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":55}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":34}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":28}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":46}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":5}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":16}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":1}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":66}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":57}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":35}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":27}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":28}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":15}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":80}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":18}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":31}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":22}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":31}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":15}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":24}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":25}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":32}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":23}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":10}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":9}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":15}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":5}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":28}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":16}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":15}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":45}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":42}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":17}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":25}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":17}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":7}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":5}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":3}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":55}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":10}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":33}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":57}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":48}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":25}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":25}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":10}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":38}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":15}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":42}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":42}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":42}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":23}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":6}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":4}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":1}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":88}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":29}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":44}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":40}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":20}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":32}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":4}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":23}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":24}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":14}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":20}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":20}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":27}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":15}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":22}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":22}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":73}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":32}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":58}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":76}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":72}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":79}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":30}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":8}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":17}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":14}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":20}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":22}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":27}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":15}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":24}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":22}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":72}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":88}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":30}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":8}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":16}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":14}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":20}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":21}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":27}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":15}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":23}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":22}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":69}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":77}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":83}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":30}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":8}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":31}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":14}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":20}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":30}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":27}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":15}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":32}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":22}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":66}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":75}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":88}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":30}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":8}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":21}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":14}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":20}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":26}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":27}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":15}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":28}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":22}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":76}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":103}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":25}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":39}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":14}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":27}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":30}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":8}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":20}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":14}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":20}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":25}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":27}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":15}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":27}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":22}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":61}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":80}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":30}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":8}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":23}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":14}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":20}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":23}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":27}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":15}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":25}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":22}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":72}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":72}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":30}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":8}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":24}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":14}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":20}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":21}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":27}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":15}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":23}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":22}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":58}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":119}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":86}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":55}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":30}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":8}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":19}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":14}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":20}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":23}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":27}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":15}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":25}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":22}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":69}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":64}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":30}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":8}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":17}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":14}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":20}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":22}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":27}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":15}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":24}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":22}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":54}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":30}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":8}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":12}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":57}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":18}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":3}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":1}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":88}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":48}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":45}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":23}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":18}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":17}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":17}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":16}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":16}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":5}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":29}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":33}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":17}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":18}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":7}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":3}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":29}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":49}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":3}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":27}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":28}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":47}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":20}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":14}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":16}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":19}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":47}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":48}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":10}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":8}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":5}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":16}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":5}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":1}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":74}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":39}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":41}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":34}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":17}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":23}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":35}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":24}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":7}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":46}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":3}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":67}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":18}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":19}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":23}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":40}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":26}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":7}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":3}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":45}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":36}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":38}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":38}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":3}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":36}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":98}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":21}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":24}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":62}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":28}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":9}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":5}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":3}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":36}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":42}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":31}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":3}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":45}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":17}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":23}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":43}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":24}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":7}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":3}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":10}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":31}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":11}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":13}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":4}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":1}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":62}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":39}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":25}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":22}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":15}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":27}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":21}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":26}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":28}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":42}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":28}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":11}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":7}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":12}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":17}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":26}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":21}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":26}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":27}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":42}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":28}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":11}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":7}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":12}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":16}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":25}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":21}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":26}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":26}},"719":{"start":{"line":720,"column":0},"end":{"line":720,"column":41}},"720":{"start":{"line":721,"column":0},"end":{"line":721,"column":28}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":11}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":7}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":25}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":21}},"725":{"start":{"line":726,"column":0},"end":{"line":726,"column":26}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":26}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":40}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":28}},"729":{"start":{"line":730,"column":0},"end":{"line":730,"column":11}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":7}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":12}},"733":{"start":{"line":734,"column":0},"end":{"line":734,"column":16}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":22}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":21}},"736":{"start":{"line":737,"column":0},"end":{"line":737,"column":26}},"737":{"start":{"line":738,"column":0},"end":{"line":738,"column":23}},"738":{"start":{"line":739,"column":0},"end":{"line":739,"column":37}},"739":{"start":{"line":740,"column":0},"end":{"line":740,"column":28}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":11}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":7}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":12}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":17}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":31}},"746":{"start":{"line":747,"column":0},"end":{"line":747,"column":21}},"747":{"start":{"line":748,"column":0},"end":{"line":748,"column":26}},"748":{"start":{"line":749,"column":0},"end":{"line":749,"column":32}},"749":{"start":{"line":750,"column":0},"end":{"line":750,"column":47}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":28}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":11}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":7}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":12}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":3}},"756":{"start":{"line":757,"column":0},"end":{"line":757,"column":16}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":1}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":66}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":48}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":36}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":37}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":29}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":31}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":3}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":29}},"772":{"start":{"line":773,"column":0},"end":{"line":773,"column":55}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":32}},"774":{"start":{"line":775,"column":0},"end":{"line":775,"column":42}},"775":{"start":{"line":776,"column":0},"end":{"line":776,"column":3}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":41}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":24}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":25}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":50}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":39}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":35}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":39}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":42}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":20}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":7}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":5}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":28}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":17}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":3}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":29}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":32}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":36}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":5}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":3}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":15}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":1}}},"s":{"0":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"61":0,"62":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"77":0,"78":0,"80":0,"81":0,"83":0,"84":0,"85":0,"87":0,"88":0,"93":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"253":0,"255":0,"257":0,"258":0,"259":0,"260":0,"262":0,"263":0,"268":0,"269":0,"270":0,"271":0,"274":0,"275":0,"276":0,"277":0,"280":0,"281":0,"282":0,"283":0,"285":0,"286":0,"289":0,"290":0,"292":0,"293":0,"294":0,"295":0,"296":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"315":0,"316":0,"321":0,"322":0,"323":0,"324":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"334":0,"335":0,"344":0,"345":0,"347":0,"348":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"370":0,"371":0,"372":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"381":0,"384":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"406":0,"407":0,"408":0,"409":0,"411":0,"412":0,"413":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"545":0,"546":0,"547":0,"548":0,"549":0,"550":0,"551":0,"552":0,"553":0,"554":0,"555":0,"557":0,"558":0,"559":0,"560":0,"561":0,"570":0,"571":0,"572":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"583":0,"584":0,"585":0,"586":0,"587":0,"588":0,"591":0,"592":0,"593":0,"596":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"621":0,"622":0,"623":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"646":0,"647":0,"648":0,"649":0,"650":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"663":0,"664":0,"665":0,"666":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"687":0,"688":0,"689":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":0,"730":0,"731":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"756":0,"757":0,"762":0,"763":0,"764":0,"765":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"778":0,"779":0,"780":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"791":0,"792":0,"793":0,"795":0,"796":0,"797":0,"798":0,"799":0,"801":0,"802":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":20175},"end":{"line":803,"column":1}},"locations":[{"start":{"line":1,"column":20175},"end":{"line":803,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":20175},"end":{"line":803,"column":1}},"loc":{"start":{"line":1,"column":20175},"end":{"line":803,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\shared\\error-handling.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\shared\\error-handling.ts","all":true,"statementMap":{"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":37}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":20}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":5}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":19}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":27}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":62}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":19}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":5}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":90}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":3}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":44}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":84}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":43}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":31}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":1}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":47}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":79}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":46}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":34}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":3}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":1}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":41}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":75}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":40}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":28}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":3}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":57}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":32}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":1}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":57}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":23}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":25}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":34}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":67}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":43}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":63}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":35}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":1}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":71}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":39}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":1}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":77}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":42}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":1}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":65}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":36}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":1}}},"s":{"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"63":0,"64":0,"65":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"83":0,"84":0,"85":0,"90":0,"91":0,"92":0,"94":0,"95":0,"96":0,"98":0,"99":0,"100":0,"102":0,"103":0,"104":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2359},"end":{"line":105,"column":1}},"locations":[{"start":{"line":1,"column":2359},"end":{"line":105,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2359},"end":{"line":105,"column":1}},"loc":{"start":{"line":1,"column":2359},"end":{"line":105,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\shared\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\shared\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":435},"end":{"line":31,"column":26}},"locations":[{"start":{"line":1,"column":435},"end":{"line":31,"column":26}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":435},"end":{"line":31,"column":26}},"loc":{"start":{"line":1,"column":435},"end":{"line":31,"column":26}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\shared\\types.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\shared\\types.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":979},"end":{"line":58,"column":1}},"locations":[{"start":{"line":1,"column":979},"end":{"line":58,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":979},"end":{"line":58,"column":1}},"loc":{"start":{"line":1,"column":979},"end":{"line":58,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\activeLearningStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\activeLearningStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":44}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":24}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":36}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":67}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":78}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":100}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":101}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":67}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":67}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":19}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":1}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":60}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":39}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":89}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":24}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":89}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":24}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":3}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":90}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":21}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":3}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":89}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":22}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":3}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":20}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":1}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":71}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":33}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":52}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":52}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":51}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":25}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":3}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":33}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":52}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":53}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":54}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":26}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":3}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":18}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":68}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":10}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":20}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":22}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":15}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":22}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":27}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":30}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":30}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":8}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":23}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":18}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":37}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":41}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":69}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":41}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":40}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":44}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":31}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":23}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":41}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":32}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":17}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":23}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":73}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":68}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":51}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":17}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":17}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":12}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":35}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":9}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":41}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":19}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":32}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":32}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":30}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":26}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":10}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":70}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":74}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":79}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":13}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":32}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":56}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":65}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":11}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":24}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":8}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":72}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":33}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":41}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":53}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":48}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":34}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":15}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":18}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":20}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":46}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":32}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":18}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":67}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":92}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":26}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":11}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":8}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":38}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":33}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":13}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":33}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":63}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":12}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":11}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":8}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":33}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":65}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":8}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":36}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":31}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":44}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":34}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":25}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":55}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":10}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":8}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":42}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":48}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":72}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":25}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":51}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":44}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":69}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":17}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":12}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":15}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":45}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":68}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":14}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":38}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":13}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":9}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":8}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":44}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":38}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":13}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":43}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":65}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":12}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":11}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":8}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":30}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":43}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":70}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":74}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":65}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":24}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":24}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":21}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":22}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":22}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":22}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":10}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":42}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":37}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":9}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":16}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":42}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":23}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":46}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":49}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":92}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":16}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":10}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":8}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":30}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":23}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":49}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":12}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":8}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":33}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":56}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":13}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":60}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":64}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":70}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":11}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":8}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":46}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":51}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":22}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":60}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":64}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":17}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":47}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":10}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":45}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":8}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":52}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":13}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":42}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":45}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":32}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":22}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":57}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":19}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":36}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":22}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":16}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":33}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":34}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":24}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":61}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":19}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":22}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":16}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":12}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":15}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":33}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":37}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":13}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":23}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":68}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":9}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":8}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":7}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":5}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":24}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":5}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":3}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":2}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":25}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":23}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":37}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":22}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":41}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":77}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":25}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":46}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":32}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":36}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":22}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":29}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":7}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":3}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":36}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":19}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":19}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":38}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":33}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":36}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":22}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":29}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":7}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":22}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":19}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":22}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":31}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":35}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":32}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":22}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":29}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":7}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":3}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":29}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":86}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":4}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":1}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":29}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":23}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":29}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":25}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":47}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":25}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":35}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":59}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":19}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":24}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":71}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":31}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":27}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":33}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":29}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":39}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":23}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":59}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":25}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":9}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":5}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":3}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":21}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":1}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":54}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":31}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":35}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":23}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":35}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":16}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":38}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":2}}},"s":{"0":0,"51":0,"52":0,"56":0,"57":0,"58":0,"60":0,"61":0,"62":0,"64":0,"66":0,"67":0,"68":0,"69":0,"71":0,"72":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"122":0,"123":0,"124":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"159":0,"160":0,"163":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"174":0,"175":0,"176":0,"178":0,"179":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"203":0,"204":0,"205":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"220":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"260":0,"261":0,"262":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"274":0,"275":0,"276":0,"277":0,"278":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"300":0,"301":0,"302":0,"303":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"340":0,"341":0,"342":0,"343":0,"344":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"377":0,"378":0,"379":0,"380":0,"382":0,"383":0,"384":0,"385":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"396":0,"397":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"414":0,"415":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":12112},"end":{"line":425,"column":2}},"locations":[{"start":{"line":1,"column":12112},"end":{"line":425,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":12112},"end":{"line":425,"column":2}},"loc":{"start":{"line":1,"column":12112},"end":{"line":425,"column":2}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\agentStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\agentStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":41}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":63}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":36}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":2}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":54}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":64}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":14}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":27}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":31}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":18}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":79}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":13}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":5}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":9}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":44}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":47}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":60}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":40}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":46}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":58}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":81}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":29}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":49}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":9}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":7}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":28}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":76}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":53}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":5}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":4}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":52}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":31}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":18}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":58}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":23}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":5}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":9}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":44}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":52}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":51}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":27}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":76}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":53}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":23}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":5}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":4}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":63}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":31}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":18}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":58}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":23}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":5}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":9}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":44}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":59}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":51}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":27}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":28}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":76}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":53}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":23}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":5}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":4}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":38}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":31}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":18}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":58}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":13}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":9}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":44}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":35}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":51}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":28}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":76}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":53}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":5}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":4}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":31}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":31}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":18}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":83}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":13}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":5}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":9}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":49}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":33}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":13}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":5}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":4}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":33}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":31}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":18}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":85}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":13}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":5}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":9}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":52}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":51}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":5}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":4}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":39}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":19}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":4}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":21}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":25}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":4}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":4}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":88}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":48}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":73}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":68}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":79}}},"s":{"0":0,"99":0,"105":0,"106":0,"107":0,"113":0,"117":0,"119":0,"120":0,"121":0,"122":0,"123":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"140":0,"141":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"219":0,"220":0,"222":0,"223":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"247":0,"254":0,"255":0,"260":0,"261":0,"266":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":7292},"end":{"line":267,"column":79}},"locations":[{"start":{"line":1,"column":7292},"end":{"line":267,"column":79}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":7292},"end":{"line":267,"column":79}},"loc":{"start":{"line":1,"column":7292},"end":{"line":267,"column":79}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\browserHandStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\browserHandStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":47}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":19}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":22}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":23}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":14}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":18}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":17}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":14}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":2}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":40}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":15}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":24}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":35}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":11}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":15}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":31}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":21}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":29}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":19}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":14}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":2}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":97}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":18}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":54}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":24}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":27}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":23}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":9}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":63}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":42}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":44}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":44}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":54}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":42}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":44}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":42}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":44}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":65}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":42}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":22}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":53}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":53}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":42}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":70}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":71}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":77}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":8}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":23}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":50}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":35}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":25}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":10}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":70}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":78}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":71}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":49}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":18}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":4}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":46}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":24}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":27}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":9}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":36}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":23}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":65}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":92}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":25}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":10}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":70}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":21}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":78}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":71}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":49}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":18}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":5}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":4}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":29}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":9}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":44}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":67}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":17}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":48}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":34}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":23}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":42}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":32}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":38}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":10}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":40}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":21}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":69}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":5}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":4}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":51}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":40}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":4}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":83}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":24}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":68}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":20}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":59}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":5}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":71}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":28}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":77}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":62}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":5}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":74}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":47}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":9}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":33}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":24}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":18}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":26}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":8}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":7}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":9}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":75}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":46}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":23}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":16}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":59}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":74}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":61}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":10}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":89}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":52}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":10}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":8}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":67}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":23}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":20}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":29}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":27}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":24}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":28}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":10}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":66}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":27}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":32}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":36}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":29}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":26}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":17}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":15}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":9}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":75}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":20}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":21}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":78}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":23}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":20}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":29}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":27}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":26}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":26}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":10}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":10}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":66}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":27}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":32}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":36}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":29}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":25}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":17}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":24}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":71}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":18}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":15}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":28}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":5}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":4}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":62}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":24}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":33}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":51}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":5}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":32}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":22}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":43}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":24}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":7}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":9}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":36}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":28}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":54}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":34}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":25}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":26}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":9}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":20}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":21}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":78}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":34}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":25}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":24}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":24}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":9}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":18}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":5}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":4}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":61}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":20}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":49}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":8}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":4}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":58}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":32}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":13}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":19}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":42}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":6}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":20}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":43}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":40}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":52}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":7}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":22}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":7}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":4}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":20}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":22}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":4}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":31}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":24}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":33}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":51}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":5}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":9}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":36}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":28}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":48}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":23}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":20}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":29}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":40}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":10}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":10}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":70}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":27}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":21}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":78}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":82}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":18}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":5}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":4}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":28}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":39}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":4}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":29}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":40}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":4}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":37}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":32}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":4}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":39}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":19}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":4}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":21}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":25}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":4}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":67}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":33}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":14}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":19}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":43}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":6}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":20}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":58}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":54}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":75}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":7}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":29}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":7}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":4}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":27}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":29}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":4}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":4}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":37}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":34}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":44}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":76}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":5}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":38}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":50}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":33}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":60}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":33}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":50}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":59}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":32}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":56}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":4}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":35}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":52}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":28}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":45}}},"s":{"0":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"118":0,"120":0,"123":0,"124":0,"125":0,"126":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"142":0,"143":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"172":0,"173":0,"174":0,"176":0,"177":0,"179":0,"180":0,"181":0,"182":0,"183":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"194":0,"195":0,"196":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"219":0,"220":0,"223":0,"224":0,"225":0,"226":0,"229":0,"230":0,"231":0,"232":0,"233":0,"236":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"250":0,"252":0,"253":0,"256":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"271":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"294":0,"296":0,"297":0,"298":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"322":0,"323":0,"324":0,"325":0,"326":0,"328":0,"329":0,"331":0,"332":0,"333":0,"335":0,"336":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"345":0,"347":0,"348":0,"349":0,"350":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"365":0,"366":0,"367":0,"368":0,"369":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"378":0,"379":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"388":0,"389":0,"390":0,"393":0,"394":0,"396":0,"397":0,"398":0,"400":0,"401":0,"402":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"413":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"424":0,"425":0,"426":0,"428":0,"429":0,"430":0,"432":0,"433":0,"434":0,"436":0,"437":0,"438":0,"440":0,"441":0,"442":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"452":0,"453":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"462":0,"463":0,"464":0,"465":0,"471":0,"472":0,"473":0,"474":0,"475":0,"477":0,"478":0,"480":0,"481":0,"483":0,"484":0,"486":0,"487":0,"488":0,"489":0,"491":0,"492":0,"494":0,"495":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":13320},"end":{"line":496,"column":45}},"locations":[{"start":{"line":1,"column":13320},"end":{"line":496,"column":45}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":13320},"end":{"line":496,"column":45}},"loc":{"start":{"line":1,"column":13320},"end":{"line":496,"column":45}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\chatStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\chatStore.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":35}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":72}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":1}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":51}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":58}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":18}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":42}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":63}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":3}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":15}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":1}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":30}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":10}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":16}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":56}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":26}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":11}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":2}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":63}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":10}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":23}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":48}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":58}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":39}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":13}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":4}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":1}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":73}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":48}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":16}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":3}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":18}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":1}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":73}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":81}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":21}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":3}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":18}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":1}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":86}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":17}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":25}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":3}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":71}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":1}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":34}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":32}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":94}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":19}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":36}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":25}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":3}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":68}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":95}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":42}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":18}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":39}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":34}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":33}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":60}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":84}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":26}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":4}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":25}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":50}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":25}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":3}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":46}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":1}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":48}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":10}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":20}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":15}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":20}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":30}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":26}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":30}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":21}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":19}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":30}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":26}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":65}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":33}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":21}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":41}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":46}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":8}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":8}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":57}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":29}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":20}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":48}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":39}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":7}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":86}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":80}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":30}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":24}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":30}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":52}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":51}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":29}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":54}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":10}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":7}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":22}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":28}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":21}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":25}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":27}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":36}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":8}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":7}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":27}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":20}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":87}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":54}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":38}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":121}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":18}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":11}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":84}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":22}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":38}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":7}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":59}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":26}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":24}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":84}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":9}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":20}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":19}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":23}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":25}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":34}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":7}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":4}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":39}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":24}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":84}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":56}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":17}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":11}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":22}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":39}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":38}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":80}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":41}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":27}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":9}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":5}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":4}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":39}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":24}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":71}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":45}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":110}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":12}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":29}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":5}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":4}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":43}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":59}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":70}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":65}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":53}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":58}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":83}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":65}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":34}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":35}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":23}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":50}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":30}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":8}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":28}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":32}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":33}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":21}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":16}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":30}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":8}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":26}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":13}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":5}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":9}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":87}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":80}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":33}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":110}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":66}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":36}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":25}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":31}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":21}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":92}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":14}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":18}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":50}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":10}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":83}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":53}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":42}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":29}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":70}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":12}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":41}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":7}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":19}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":67}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":5}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":34}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":9}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":71}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":16}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":23}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":17}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":25}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":9}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":55}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":94}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":13}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":97}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":25}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":81}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":7}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":19}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":81}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":5}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":30}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":31}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":19}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":14}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":28}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":6}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":24}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":50}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":35}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":22}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":24}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":18}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":28}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":22}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":6}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":29}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":31}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":9}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":33}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":76}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":44}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":69}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":7}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":38}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":45}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":24}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":9}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":39}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":25}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":45}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":36}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":56}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":21}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":16}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":16}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":12}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":68}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":81}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":27}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":39}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":36}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":20}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":29}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":31}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":33}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":14}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":73}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":71}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":38}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":81}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":27}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":29}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":89}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":46}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":36}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":20}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":29}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":33}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":33}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":14}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":73}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":12}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":29}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":32}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":92}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":86}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":17}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":33}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":28}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":51}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":49}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":76}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":16}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":15}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":39}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":71}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":64}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":128}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":68}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":15}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":77}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":73}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":15}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":81}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":34}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":81}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":65}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":19}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":15}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":15}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":12}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":39}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":29}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":33}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":49}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":36}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":77}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":21}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":16}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":16}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":12}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":10}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":9}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":42}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":36}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":9}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":8}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":26}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":29}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":7}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":24}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":49}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":7}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":23}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":43}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":52}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":10}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":10}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":28}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":79}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":23}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":27}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":43}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":30}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":15}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":21}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":46}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":33}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":36}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":15}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":15}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":10}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":10}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":5}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":4}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":99}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":9}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":36}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":50}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":48}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":9}},"552":{"start":{"line":553,"column":0},"end":{"line":553,"column":86}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":35}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":72}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":118}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":43}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":9}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":47}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":33}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":34}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":26}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":44}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":30}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":8}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":33}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":28}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":19}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":57}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":18}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":5}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":4}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":36}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":42}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":49}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":12}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":97}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":44}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":6}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":4}},"586":{"start":{"line":587,"column":0},"end":{"line":587,"column":29}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":31}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":39}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":22}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":5}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":75}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":26}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":46}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":18}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":22}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":32}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":24}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":52}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":48}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":10}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":30}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":20}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":62}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":32}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":75}},"615":{"start":{"line":616,"column":0},"end":{"line":616,"column":21}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":41}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":36}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":83}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":17}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":12}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":12}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":43}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":34}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":77}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":23}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":42}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":32}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":29}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":31}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":37}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":39}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":10}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":61}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":48}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":63}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":23}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":31}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":43}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":38}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":19}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":25}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":37}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":77}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":19}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":19}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":14}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":14}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":9}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":43}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":34}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":77}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":23}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":35}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":115}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":90}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":32}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":29}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":35}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":39}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":39}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":10}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":61}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":47}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":38}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":81}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":27}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":39}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":127}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":132}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":32}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":29}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":39}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":43}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":47}},"677":{"start":{"line":678,"column":0},"end":{"line":678,"column":47}},"678":{"start":{"line":679,"column":0},"end":{"line":679,"column":10}},"679":{"start":{"line":680,"column":0},"end":{"line":680,"column":65}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":7}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":7}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":23}},"684":{"start":{"line":685,"column":0},"end":{"line":685,"column":4}},"685":{"start":{"line":686,"column":0},"end":{"line":686,"column":3}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":5}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":33}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":31}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":43}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":41}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":47}},"692":{"start":{"line":693,"column":0},"end":{"line":693,"column":59}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":9}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":44}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":35}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":51}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":54}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":54}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":46}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":54}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":69}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":13}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":11}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":9}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":66}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":98}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":28}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":55}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":54}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":11}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":9}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":8}},"716":{"start":{"line":717,"column":0},"end":{"line":717,"column":6}},"717":{"start":{"line":718,"column":0},"end":{"line":718,"column":4}},"718":{"start":{"line":719,"column":0},"end":{"line":719,"column":2}},"721":{"start":{"line":722,"column":0},"end":{"line":722,"column":59}},"722":{"start":{"line":723,"column":0},"end":{"line":723,"column":76}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":55}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":1}}},"s":{"0":1,"101":7,"102":7,"103":7,"105":7,"106":7,"107":7,"108":7,"109":7,"110":7,"111":0,"112":0,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"123":1,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"130":4,"131":4,"132":4,"134":7,"135":7,"136":7,"137":7,"138":0,"139":0,"141":2,"142":2,"143":2,"144":2,"145":0,"146":0,"148":1,"149":1,"150":1,"151":1,"152":0,"153":1,"155":8,"156":8,"157":8,"158":8,"159":8,"160":1,"161":1,"163":7,"164":8,"165":8,"166":8,"167":8,"168":8,"169":8,"170":8,"171":8,"172":8,"173":8,"175":8,"176":0,"177":0,"178":0,"180":7,"181":7,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":26,"199":1,"200":5,"201":5,"202":5,"203":5,"204":5,"206":1,"208":1,"209":2,"210":2,"211":0,"212":0,"215":2,"218":2,"220":2,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"233":2,"234":2,"235":2,"236":2,"237":2,"238":2,"239":2,"240":2,"241":2,"243":1,"244":2,"245":2,"246":2,"247":0,"248":0,"249":0,"250":0,"251":2,"252":2,"253":0,"254":2,"255":2,"257":1,"259":1,"260":5,"261":5,"263":5,"264":5,"265":5,"266":5,"267":5,"268":5,"269":5,"270":5,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"289":1,"290":2,"291":2,"292":2,"293":1,"294":1,"295":1,"296":1,"297":2,"299":1,"300":2,"301":2,"302":2,"303":2,"306":2,"307":0,"308":0,"309":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"332":2,"333":2,"334":2,"335":2,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":2,"357":0,"358":0,"361":2,"362":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":0,"371":2,"372":2,"373":2,"374":0,"375":0,"376":2,"377":0,"378":0,"381":2,"382":2,"383":2,"384":2,"385":2,"386":2,"387":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"398":2,"399":2,"401":2,"403":2,"406":2,"408":2,"410":2,"411":2,"414":0,"417":0,"418":0,"419":0,"420":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"462":0,"463":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"511":2,"512":0,"513":0,"515":0,"516":0,"517":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":2,"527":2,"528":2,"529":2,"530":2,"531":4,"532":2,"533":2,"534":2,"535":2,"536":2,"537":2,"538":2,"539":2,"540":2,"541":2,"542":2,"544":1,"545":2,"546":2,"547":2,"548":2,"549":2,"552":2,"553":0,"554":0,"555":0,"556":0,"557":2,"559":2,"562":2,"563":2,"564":2,"565":2,"566":2,"567":2,"568":2,"570":2,"571":2,"572":0,"573":0,"574":0,"575":2,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"586":1,"587":2,"590":2,"592":0,"593":0,"595":2,"596":0,"598":0,"599":0,"600":0,"601":0,"602":0,"604":0,"605":0,"607":0,"608":0,"609":0,"610":0,"612":0,"614":0,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":0,"623":0,"624":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":2,"683":2,"684":2,"685":1,"686":1,"687":1,"688":1,"689":90,"690":90,"691":90,"692":90,"693":90,"694":1,"696":1,"697":1,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":1,"708":1,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":1,"716":1,"717":1,"718":1,"721":1,"722":1,"723":1,"724":1},"branchMap":{"0":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":0},"end":{"line":104,"column":1}},"locations":[{"start":{"line":102,"column":0},"end":{"line":104,"column":1}}]},"1":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":0},"end":{"line":113,"column":1}},"locations":[{"start":{"line":106,"column":0},"end":{"line":113,"column":1}}]},"2":{"type":"branch","line":110,"loc":{"start":{"line":110,"column":25},"end":{"line":110,"column":58}},"locations":[{"start":{"line":110,"column":25},"end":{"line":110,"column":58}}]},"3":{"type":"branch","line":110,"loc":{"start":{"line":110,"column":50},"end":{"line":110,"column":63}},"locations":[{"start":{"line":110,"column":50},"end":{"line":110,"column":63}}]},"4":{"type":"branch","line":111,"loc":{"start":{"line":111,"column":2},"end":{"line":113,"column":1}},"locations":[{"start":{"line":111,"column":2},"end":{"line":113,"column":1}}]},"5":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":34},"end":{"line":107,"column":56}},"locations":[{"start":{"line":107,"column":34},"end":{"line":107,"column":56}}]},"6":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":7},"end":{"line":133,"column":1}},"locations":[{"start":{"line":124,"column":7},"end":{"line":133,"column":1}}]},"7":{"type":"branch","line":128,"loc":{"start":{"line":128,"column":18},"end":{"line":128,"column":34}},"locations":[{"start":{"line":128,"column":18},"end":{"line":128,"column":34}}]},"8":{"type":"branch","line":128,"loc":{"start":{"line":128,"column":38},"end":{"line":128,"column":48}},"locations":[{"start":{"line":128,"column":38},"end":{"line":128,"column":48}}]},"9":{"type":"branch","line":130,"loc":{"start":{"line":130,"column":25},"end":{"line":130,"column":39}},"locations":[{"start":{"line":130,"column":25},"end":{"line":130,"column":39}}]},"10":{"type":"branch","line":135,"loc":{"start":{"line":135,"column":0},"end":{"line":140,"column":1}},"locations":[{"start":{"line":135,"column":0},"end":{"line":140,"column":1}}]},"11":{"type":"branch","line":138,"loc":{"start":{"line":138,"column":2},"end":{"line":140,"column":1}},"locations":[{"start":{"line":138,"column":2},"end":{"line":140,"column":1}}]},"12":{"type":"branch","line":142,"loc":{"start":{"line":142,"column":0},"end":{"line":147,"column":1}},"locations":[{"start":{"line":142,"column":0},"end":{"line":147,"column":1}}]},"13":{"type":"branch","line":143,"loc":{"start":{"line":143,"column":43},"end":{"line":143,"column":80}},"locations":[{"start":{"line":143,"column":43},"end":{"line":143,"column":80}}]},"14":{"type":"branch","line":145,"loc":{"start":{"line":145,"column":2},"end":{"line":147,"column":1}},"locations":[{"start":{"line":145,"column":2},"end":{"line":147,"column":1}}]},"15":{"type":"branch","line":149,"loc":{"start":{"line":149,"column":0},"end":{"line":154,"column":1}},"locations":[{"start":{"line":149,"column":0},"end":{"line":154,"column":1}}]},"16":{"type":"branch","line":152,"loc":{"start":{"line":152,"column":2},"end":{"line":153,"column":71}},"locations":[{"start":{"line":152,"column":2},"end":{"line":153,"column":71}}]},"17":{"type":"branch","line":156,"loc":{"start":{"line":156,"column":0},"end":{"line":182,"column":1}},"locations":[{"start":{"line":156,"column":0},"end":{"line":182,"column":1}}]},"18":{"type":"branch","line":160,"loc":{"start":{"line":160,"column":35},"end":{"line":162,"column":3}},"locations":[{"start":{"line":160,"column":35},"end":{"line":162,"column":3}}]},"19":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":2},"end":{"line":164,"column":68}},"locations":[{"start":{"line":162,"column":2},"end":{"line":164,"column":68}}]},"20":{"type":"branch","line":172,"loc":{"start":{"line":172,"column":30},"end":{"line":172,"column":73}},"locations":[{"start":{"line":172,"column":30},"end":{"line":172,"column":73}}]},"21":{"type":"branch","line":172,"loc":{"start":{"line":172,"column":61},"end":{"line":172,"column":84}},"locations":[{"start":{"line":172,"column":61},"end":{"line":172,"column":84}}]},"22":{"type":"branch","line":176,"loc":{"start":{"line":176,"column":24},"end":{"line":179,"column":3}},"locations":[{"start":{"line":176,"column":24},"end":{"line":179,"column":3}}]},"23":{"type":"branch","line":179,"loc":{"start":{"line":179,"column":2},"end":{"line":182,"column":1}},"locations":[{"start":{"line":179,"column":2},"end":{"line":182,"column":1}}]},"24":{"type":"branch","line":165,"loc":{"start":{"line":165,"column":46},"end":{"line":165,"column":93}},"locations":[{"start":{"line":165,"column":46},"end":{"line":165,"column":93}}]},"25":{"type":"branch","line":186,"loc":{"start":{"line":186,"column":4},"end":{"line":686,"column":3}},"locations":[{"start":{"line":186,"column":4},"end":{"line":686,"column":3}}]},"26":{"type":"branch","line":197,"loc":{"start":{"line":197,"column":14},"end":{"line":198,"column":65}},"locations":[{"start":{"line":197,"column":14},"end":{"line":198,"column":65}}]},"27":{"type":"branch","line":198,"loc":{"start":{"line":198,"column":8},"end":{"line":198,"column":63}},"locations":[{"start":{"line":198,"column":8},"end":{"line":198,"column":63}}]},"28":{"type":"branch","line":200,"loc":{"start":{"line":200,"column":17},"end":{"line":205,"column":8}},"locations":[{"start":{"line":200,"column":17},"end":{"line":205,"column":8}}]},"29":{"type":"branch","line":201,"loc":{"start":{"line":201,"column":8},"end":{"line":205,"column":6}},"locations":[{"start":{"line":201,"column":8},"end":{"line":205,"column":6}}]},"30":{"type":"branch","line":202,"loc":{"start":{"line":202,"column":35},"end":{"line":203,"column":46}},"locations":[{"start":{"line":202,"column":35},"end":{"line":203,"column":46}}]},"31":{"type":"branch","line":203,"loc":{"start":{"line":203,"column":17},"end":{"line":203,"column":45}},"locations":[{"start":{"line":203,"column":17},"end":{"line":203,"column":45}}]},"32":{"type":"branch","line":203,"loc":{"start":{"line":203,"column":41},"end":{"line":203,"column":46}},"locations":[{"start":{"line":203,"column":41},"end":{"line":203,"column":46}}]},"33":{"type":"branch","line":209,"loc":{"start":{"line":209,"column":19},"end":{"line":242,"column":7}},"locations":[{"start":{"line":209,"column":19},"end":{"line":242,"column":7}}]},"34":{"type":"branch","line":210,"loc":{"start":{"line":210,"column":8},"end":{"line":242,"column":5}},"locations":[{"start":{"line":210,"column":8},"end":{"line":242,"column":5}}]},"35":{"type":"branch","line":211,"loc":{"start":{"line":211,"column":47},"end":{"line":213,"column":7}},"locations":[{"start":{"line":211,"column":47},"end":{"line":213,"column":7}}]},"36":{"type":"branch","line":221,"loc":{"start":{"line":221,"column":29},"end":{"line":231,"column":7}},"locations":[{"start":{"line":221,"column":29},"end":{"line":231,"column":7}}]},"37":{"type":"branch","line":219,"loc":{"start":{"line":219,"column":51},"end":{"line":219,"column":78}},"locations":[{"start":{"line":219,"column":51},"end":{"line":219,"column":78}}]},"38":{"type":"branch","line":244,"loc":{"start":{"line":244,"column":14},"end":{"line":256,"column":7}},"locations":[{"start":{"line":244,"column":14},"end":{"line":256,"column":7}}]},"39":{"type":"branch","line":245,"loc":{"start":{"line":245,"column":8},"end":{"line":256,"column":5}},"locations":[{"start":{"line":245,"column":8},"end":{"line":256,"column":5}}]},"40":{"type":"branch","line":246,"loc":{"start":{"line":246,"column":39},"end":{"line":246,"column":71}},"locations":[{"start":{"line":246,"column":39},"end":{"line":246,"column":71}}]},"41":{"type":"branch","line":246,"loc":{"start":{"line":246,"column":67},"end":{"line":246,"column":87}},"locations":[{"start":{"line":246,"column":67},"end":{"line":246,"column":87}}]},"42":{"type":"branch","line":247,"loc":{"start":{"line":247,"column":33},"end":{"line":251,"column":11}},"locations":[{"start":{"line":247,"column":33},"end":{"line":251,"column":11}}]},"43":{"type":"branch","line":253,"loc":{"start":{"line":253,"column":70},"end":{"line":253,"column":84}},"locations":[{"start":{"line":253,"column":70},"end":{"line":253,"column":84}}]},"44":{"type":"branch","line":253,"loc":{"start":{"line":253,"column":83},"end":{"line":254,"column":22}},"locations":[{"start":{"line":253,"column":83},"end":{"line":254,"column":22}}]},"45":{"type":"branch","line":253,"loc":{"start":{"line":253,"column":24},"end":{"line":253,"column":70}},"locations":[{"start":{"line":253,"column":24},"end":{"line":253,"column":70}}]},"46":{"type":"branch","line":258,"loc":{"start":{"line":258,"column":19},"end":{"line":258,"column":59}},"locations":[{"start":{"line":258,"column":19},"end":{"line":258,"column":59}}]},"47":{"type":"branch","line":260,"loc":{"start":{"line":260,"column":19},"end":{"line":271,"column":4}},"locations":[{"start":{"line":260,"column":19},"end":{"line":271,"column":4}}]},"48":{"type":"branch","line":273,"loc":{"start":{"line":273,"column":22},"end":{"line":288,"column":4}},"locations":[{"start":{"line":273,"column":22},"end":{"line":288,"column":4}}]},"49":{"type":"branch","line":277,"loc":{"start":{"line":277,"column":38},"end":{"line":277,"column":54}},"locations":[{"start":{"line":277,"column":38},"end":{"line":277,"column":54}}]},"50":{"type":"branch","line":290,"loc":{"start":{"line":290,"column":22},"end":{"line":298,"column":4}},"locations":[{"start":{"line":290,"column":22},"end":{"line":298,"column":4}}]},"51":{"type":"branch","line":293,"loc":{"start":{"line":293,"column":44},"end":{"line":297,"column":5}},"locations":[{"start":{"line":293,"column":44},"end":{"line":297,"column":5}}]},"52":{"type":"branch","line":292,"loc":{"start":{"line":292,"column":53},"end":{"line":292,"column":69}},"locations":[{"start":{"line":292,"column":53},"end":{"line":292,"column":69}}]},"53":{"type":"branch","line":300,"loc":{"start":{"line":300,"column":15},"end":{"line":543,"column":4}},"locations":[{"start":{"line":300,"column":15},"end":{"line":543,"column":4}}]},"54":{"type":"branch","line":304,"loc":{"start":{"line":304,"column":34},"end":{"line":304,"column":53}},"locations":[{"start":{"line":304,"column":34},"end":{"line":304,"column":53}}]},"55":{"type":"branch","line":307,"loc":{"start":{"line":307,"column":21},"end":{"line":330,"column":5}},"locations":[{"start":{"line":307,"column":21},"end":{"line":330,"column":5}}]},"56":{"type":"branch","line":336,"loc":{"start":{"line":336,"column":32},"end":{"line":356,"column":7}},"locations":[{"start":{"line":336,"column":32},"end":{"line":356,"column":7}}]},"57":{"type":"branch","line":357,"loc":{"start":{"line":357,"column":4},"end":{"line":359,"column":5}},"locations":[{"start":{"line":357,"column":4},"end":{"line":359,"column":5}}]},"58":{"type":"branch","line":370,"loc":{"start":{"line":370,"column":54},"end":{"line":371,"column":94}},"locations":[{"start":{"line":370,"column":54},"end":{"line":371,"column":94}}]},"59":{"type":"branch","line":374,"loc":{"start":{"line":374,"column":24},"end":{"line":376,"column":7}},"locations":[{"start":{"line":374,"column":24},"end":{"line":376,"column":7}}]},"60":{"type":"branch","line":377,"loc":{"start":{"line":377,"column":4},"end":{"line":379,"column":5}},"locations":[{"start":{"line":377,"column":4},"end":{"line":379,"column":5}}]},"61":{"type":"branch","line":412,"loc":{"start":{"line":412,"column":6},"end":{"line":512,"column":25}},"locations":[{"start":{"line":412,"column":6},"end":{"line":512,"column":25}}]},"62":{"type":"branch","line":512,"loc":{"start":{"line":512,"column":25},"end":{"line":526,"column":13}},"locations":[{"start":{"line":512,"column":25},"end":{"line":526,"column":13}}]},"63":{"type":"branch","line":528,"loc":{"start":{"line":528,"column":54},"end":{"line":528,"column":79}},"locations":[{"start":{"line":528,"column":54},"end":{"line":528,"column":79}}]},"64":{"type":"branch","line":529,"loc":{"start":{"line":529,"column":10},"end":{"line":541,"column":8}},"locations":[{"start":{"line":529,"column":10},"end":{"line":541,"column":8}}]},"65":{"type":"branch","line":531,"loc":{"start":{"line":531,"column":37},"end":{"line":539,"column":15}},"locations":[{"start":{"line":531,"column":37},"end":{"line":539,"column":15}}]},"66":{"type":"branch","line":532,"loc":{"start":{"line":532,"column":19},"end":{"line":538,"column":15}},"locations":[{"start":{"line":532,"column":19},"end":{"line":538,"column":15}}]},"67":{"type":"branch","line":538,"loc":{"start":{"line":538,"column":14},"end":{"line":539,"column":15}},"locations":[{"start":{"line":538,"column":14},"end":{"line":539,"column":15}}]},"68":{"type":"branch","line":545,"loc":{"start":{"line":545,"column":21},"end":{"line":576,"column":4}},"locations":[{"start":{"line":545,"column":21},"end":{"line":576,"column":4}}]},"69":{"type":"branch","line":566,"loc":{"start":{"line":566,"column":24},"end":{"line":566,"column":44}},"locations":[{"start":{"line":566,"column":24},"end":{"line":566,"column":44}}]},"70":{"type":"branch","line":572,"loc":{"start":{"line":572,"column":4},"end":{"line":575,"column":5}},"locations":[{"start":{"line":572,"column":4},"end":{"line":575,"column":5}}]},"71":{"type":"branch","line":578,"loc":{"start":{"line":578,"column":16},"end":{"line":585,"column":4}},"locations":[{"start":{"line":578,"column":16},"end":{"line":585,"column":4}}]},"72":{"type":"branch","line":587,"loc":{"start":{"line":587,"column":22},"end":{"line":685,"column":4}},"locations":[{"start":{"line":587,"column":22},"end":{"line":685,"column":4}}]},"73":{"type":"branch","line":591,"loc":{"start":{"line":591,"column":38},"end":{"line":594,"column":5}},"locations":[{"start":{"line":591,"column":38},"end":{"line":594,"column":5}}]},"74":{"type":"branch","line":689,"loc":{"start":{"line":689,"column":18},"end":{"line":694,"column":9}},"locations":[{"start":{"line":689,"column":18},"end":{"line":694,"column":9}}]},"75":{"type":"branch","line":695,"loc":{"start":{"line":695,"column":26},"end":{"line":716,"column":8}},"locations":[{"start":{"line":695,"column":26},"end":{"line":716,"column":8}}]},"76":{"type":"branch","line":695,"loc":{"start":{"line":695,"column":32},"end":{"line":716,"column":8}},"locations":[{"start":{"line":695,"column":32},"end":{"line":716,"column":8}}]},"77":{"type":"branch","line":698,"loc":{"start":{"line":698,"column":50},"end":{"line":705,"column":11}},"locations":[{"start":{"line":698,"column":50},"end":{"line":705,"column":11}}]},"78":{"type":"branch","line":709,"loc":{"start":{"line":709,"column":19},"end":{"line":709,"column":65}},"locations":[{"start":{"line":709,"column":19},"end":{"line":709,"column":65}}]},"79":{"type":"branch","line":709,"loc":{"start":{"line":709,"column":65},"end":{"line":715,"column":9}},"locations":[{"start":{"line":709,"column":65},"end":{"line":715,"column":9}}]}},"b":{"0":[7],"1":[7],"2":[1],"3":[6],"4":[0],"5":[7],"6":[4],"7":[3],"8":[1],"9":[3],"10":[7],"11":[0],"12":[2],"13":[0],"14":[0],"15":[1],"16":[0],"17":[8],"18":[1],"19":[7],"20":[0],"21":[7],"22":[0],"23":[7],"24":[1],"25":[1],"26":[26],"27":[26],"28":[5],"29":[5],"30":[5],"31":[4],"32":[1],"33":[2],"34":[2],"35":[0],"36":[0],"37":[1],"38":[2],"39":[2],"40":[1],"41":[1],"42":[0],"43":[1],"44":[0],"45":[3],"46":[1],"47":[5],"48":[1],"49":[2],"50":[2],"51":[1],"52":[2],"53":[2],"54":[0],"55":[0],"56":[0],"57":[0],"58":[0],"59":[0],"60":[0],"61":[0],"62":[0],"63":[0],"64":[2],"65":[4],"66":[2],"67":[2],"68":[2],"69":[0],"70":[0],"71":[1],"72":[2],"73":[0],"74":[90],"75":[1],"76":[1],"77":[0],"78":[0],"79":[0]},"fnMap":{"0":{"name":"generateConvId","decl":{"start":{"line":102,"column":0},"end":{"line":104,"column":1}},"loc":{"start":{"line":102,"column":0},"end":{"line":104,"column":1}},"line":102},"1":{"name":"deriveTitle","decl":{"start":{"line":106,"column":0},"end":{"line":113,"column":1}},"loc":{"start":{"line":106,"column":0},"end":{"line":113,"column":1}},"line":106},"2":{"name":"toChatAgent","decl":{"start":{"line":124,"column":7},"end":{"line":133,"column":1}},"loc":{"start":{"line":124,"column":7},"end":{"line":133,"column":1}},"line":124},"3":{"name":"resolveConversationAgentId","decl":{"start":{"line":135,"column":0},"end":{"line":140,"column":1}},"loc":{"start":{"line":135,"column":0},"end":{"line":140,"column":1}},"line":135},"4":{"name":"resolveGatewayAgentId","decl":{"start":{"line":142,"column":0},"end":{"line":147,"column":1}},"loc":{"start":{"line":142,"column":0},"end":{"line":147,"column":1}},"line":142},"5":{"name":"resolveAgentForConversation","decl":{"start":{"line":149,"column":0},"end":{"line":154,"column":1}},"loc":{"start":{"line":149,"column":0},"end":{"line":154,"column":1}},"line":149},"6":{"name":"upsertActiveConversation","decl":{"start":{"line":156,"column":0},"end":{"line":182,"column":1}},"loc":{"start":{"line":156,"column":0},"end":{"line":182,"column":1}},"line":156},"7":{"name":"__vite_ssr_import_0__.create.__vite_ssr_import_1__.persist.name","decl":{"start":{"line":186,"column":4},"end":{"line":686,"column":3}},"loc":{"start":{"line":186,"column":4},"end":{"line":686,"column":3}},"line":186},"8":{"name":"addMessage","decl":{"start":{"line":197,"column":14},"end":{"line":198,"column":65}},"loc":{"start":{"line":197,"column":14},"end":{"line":198,"column":65}},"line":197},"9":{"name":"updateMessage","decl":{"start":{"line":200,"column":17},"end":{"line":205,"column":8}},"loc":{"start":{"line":200,"column":17},"end":{"line":205,"column":8}},"line":200},"10":{"name":"setIsLoading","decl":{"start":{"line":207,"column":16},"end":{"line":207,"column":57}},"loc":{"start":{"line":207,"column":16},"end":{"line":207,"column":57}},"line":207},"11":{"name":"setCurrentAgent","decl":{"start":{"line":209,"column":19},"end":{"line":242,"column":7}},"loc":{"start":{"line":209,"column":19},"end":{"line":242,"column":7}},"line":209},"12":{"name":"syncAgents","decl":{"start":{"line":244,"column":14},"end":{"line":256,"column":7}},"loc":{"start":{"line":244,"column":14},"end":{"line":256,"column":7}},"line":244},"13":{"name":"setCurrentModel","decl":{"start":{"line":258,"column":19},"end":{"line":258,"column":59}},"loc":{"start":{"line":258,"column":19},"end":{"line":258,"column":59}},"line":258},"14":{"name":"newConversation","decl":{"start":{"line":260,"column":19},"end":{"line":271,"column":4}},"loc":{"start":{"line":260,"column":19},"end":{"line":271,"column":4}},"line":260},"15":{"name":"switchConversation","decl":{"start":{"line":273,"column":22},"end":{"line":288,"column":4}},"loc":{"start":{"line":273,"column":22},"end":{"line":288,"column":4}},"line":273},"16":{"name":"deleteConversation","decl":{"start":{"line":290,"column":22},"end":{"line":298,"column":4}},"loc":{"start":{"line":290,"column":22},"end":{"line":298,"column":4}},"line":290},"17":{"name":"sendMessage","decl":{"start":{"line":300,"column":15},"end":{"line":543,"column":4}},"loc":{"start":{"line":300,"column":15},"end":{"line":543,"column":4}},"line":300},"18":{"name":"onDelta","decl":{"start":{"line":421,"column":19},"end":{"line":430,"column":12}},"loc":{"start":{"line":421,"column":19},"end":{"line":430,"column":12}},"line":421},"19":{"name":"onTool","decl":{"start":{"line":431,"column":18},"end":{"line":443,"column":12}},"loc":{"start":{"line":431,"column":18},"end":{"line":443,"column":12}},"line":431},"20":{"name":"onHand","decl":{"start":{"line":444,"column":18},"end":{"line":458,"column":12}},"loc":{"start":{"line":444,"column":18},"end":{"line":458,"column":12}},"line":444},"21":{"name":"onComplete","decl":{"start":{"line":459,"column":22},"end":{"line":493,"column":12}},"loc":{"start":{"line":459,"column":22},"end":{"line":493,"column":12}},"line":459},"22":{"name":"onError","decl":{"start":{"line":494,"column":19},"end":{"line":503,"column":12}},"loc":{"start":{"line":494,"column":19},"end":{"line":503,"column":12}},"line":494},"23":{"name":"dispatchSwarmTask","decl":{"start":{"line":545,"column":21},"end":{"line":576,"column":4}},"loc":{"start":{"line":545,"column":21},"end":{"line":576,"column":4}},"line":545},"24":{"name":"searchSkills","decl":{"start":{"line":578,"column":16},"end":{"line":585,"column":4}},"loc":{"start":{"line":578,"column":16},"end":{"line":585,"column":4}},"line":578},"25":{"name":"initStreamListener","decl":{"start":{"line":587,"column":22},"end":{"line":685,"column":4}},"loc":{"start":{"line":587,"column":22},"end":{"line":685,"column":4}},"line":587},"26":{"name":"partialize","decl":{"start":{"line":689,"column":18},"end":{"line":694,"column":9}},"loc":{"start":{"line":689,"column":18},"end":{"line":694,"column":9}},"line":689},"27":{"name":"onRehydrateStorage","decl":{"start":{"line":695,"column":26},"end":{"line":716,"column":8}},"loc":{"start":{"line":695,"column":26},"end":{"line":716,"column":8}},"line":695}},"f":{"0":7,"1":7,"2":4,"3":7,"4":2,"5":1,"6":8,"7":1,"8":26,"9":5,"10":0,"11":2,"12":2,"13":1,"14":5,"15":1,"16":2,"17":2,"18":0,"19":0,"20":0,"21":0,"22":0,"23":2,"24":1,"25":2,"26":90,"27":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\configStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\configStore.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":92}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":18}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":22}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":15}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":21}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":20}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":13}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":23}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":20}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":14}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":15}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":56}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":20}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":4}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":32}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":32}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":24}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":9}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":51}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":54}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":13}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":5}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":4}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":61}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":32}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":24}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":9}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":62}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":34}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":51}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":7}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":74}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":61}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":7}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":62}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":62}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":28}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":71}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":5}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":4}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":34}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":32}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":9}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":51}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":35}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":13}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":4}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":32}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":24}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":9}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":49}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":29}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":43}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":15}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":7}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":13}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":9}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":52}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":21}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":21}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":23}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":23}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":29}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":59}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":40}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":9}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":13}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":112}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":5}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":22}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":4}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":37}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":32}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":34}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":9}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":49}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":28}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":47}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":74}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":33}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":55}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":58}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":45}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":9}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":45}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":7}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":23}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":28}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":71}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":23}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":5}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":4}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":37}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":32}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":34}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":9}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":57}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":28}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":47}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":79}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":45}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":7}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":23}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":28}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":71}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":4}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":41}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":32}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":34}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":9}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":61}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":28}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":47}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":56}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":59}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":10}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":43}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":45}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":7}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":23}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":28}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":71}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":23}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":5}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":4}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":32}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":32}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":24}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":9}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":37}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":45}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":66}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":28}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":71}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":5}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":4}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":35}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":32}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":24}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":9}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":55}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":51}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":13}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":5}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":4}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":40}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":32}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":34}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":9}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":60}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":38}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":22}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":26}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":34}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":77}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":32}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":32}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":40}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":8}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":23}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":59}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":10}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":21}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":28}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":98}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":35}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":23}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":5}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":4}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":34}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":32}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":24}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":9}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":47}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":51}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":30}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":25}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":24}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":33}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":46}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":12}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":12}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":7}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":13}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":4}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":35}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":32}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":34}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":9}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":47}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":52}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":13}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":23}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":5}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":4}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":33}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":32}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":34}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":9}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":53}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":62}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":21}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":25}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":60}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":12}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":7}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":22}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":13}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":23}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":5}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":4}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":39}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":32}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":34}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":9}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":59}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":66}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":25}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":25}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":55}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":42}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":12}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":12}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":7}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":26}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":13}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":23}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":5}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":4}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":30}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":32}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":24}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":9}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":35}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":23}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":70}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":10}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":13}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":5}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":4}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":27}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":32}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":24}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":9}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":54}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":47}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":64}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":44}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":28}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":83}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":58}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":5}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":4}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":21}},"534":{"start":{"line":535,"column":0},"end":{"line":535,"column":25}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":4}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":4}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":82}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":10}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":54}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":50}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":64}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":42}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":42}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":54}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":66}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":48}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":46}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":46}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":62}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":70}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":52}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":58}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":42}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":60}},"572":{"start":{"line":573,"column":0},"end":{"line":573,"column":14}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":22}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":26}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":34}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":77}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":8}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":6}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":42}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":52}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":4}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":1}},"587":{"start":{"line":588,"column":0},"end":{"line":588,"column":80}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":10}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":35}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":11}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":45}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":16}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":19}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":27}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":48}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":23}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":23}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":10}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":15}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":20}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":7}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":6}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":54}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":38}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":29}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":11}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":49}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":29}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":18}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":47}},"611":{"start":{"line":612,"column":0},"end":{"line":612,"column":23}},"612":{"start":{"line":613,"column":0},"end":{"line":613,"column":27}},"613":{"start":{"line":614,"column":0},"end":{"line":614,"column":47}},"614":{"start":{"line":615,"column":0},"end":{"line":615,"column":33}},"616":{"start":{"line":617,"column":0},"end":{"line":617,"column":49}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":33}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":27}},"620":{"start":{"line":621,"column":0},"end":{"line":621,"column":64}},"621":{"start":{"line":622,"column":0},"end":{"line":622,"column":32}},"622":{"start":{"line":623,"column":0},"end":{"line":623,"column":27}},"623":{"start":{"line":624,"column":0},"end":{"line":624,"column":18}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":69}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":26}},"627":{"start":{"line":628,"column":0},"end":{"line":628,"column":34}},"628":{"start":{"line":629,"column":0},"end":{"line":629,"column":18}},"629":{"start":{"line":630,"column":0},"end":{"line":630,"column":41}},"630":{"start":{"line":631,"column":0},"end":{"line":631,"column":35}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":16}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":12}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":9}},"634":{"start":{"line":635,"column":0},"end":{"line":635,"column":30}},"635":{"start":{"line":636,"column":0},"end":{"line":636,"column":15}},"636":{"start":{"line":637,"column":0},"end":{"line":637,"column":30}},"637":{"start":{"line":638,"column":0},"end":{"line":638,"column":7}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":6}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":37}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":58}},"641":{"start":{"line":642,"column":0},"end":{"line":642,"column":6}},"642":{"start":{"line":643,"column":0},"end":{"line":643,"column":30}},"643":{"start":{"line":644,"column":0},"end":{"line":644,"column":70}},"644":{"start":{"line":645,"column":0},"end":{"line":645,"column":6}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":30}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":68}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":6}},"648":{"start":{"line":649,"column":0},"end":{"line":649,"column":30}},"649":{"start":{"line":650,"column":0},"end":{"line":650,"column":70}},"650":{"start":{"line":651,"column":0},"end":{"line":651,"column":6}},"651":{"start":{"line":652,"column":0},"end":{"line":652,"column":49}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":33}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":36}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":36}},"655":{"start":{"line":656,"column":0},"end":{"line":656,"column":34}},"656":{"start":{"line":657,"column":0},"end":{"line":657,"column":52}},"657":{"start":{"line":658,"column":0},"end":{"line":658,"column":38}},"658":{"start":{"line":659,"column":0},"end":{"line":659,"column":71}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":6}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":29}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":11}},"662":{"start":{"line":663,"column":0},"end":{"line":663,"column":45}},"663":{"start":{"line":664,"column":0},"end":{"line":664,"column":16}},"664":{"start":{"line":665,"column":0},"end":{"line":665,"column":42}},"665":{"start":{"line":666,"column":0},"end":{"line":666,"column":46}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":48}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":70}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":18}},"669":{"start":{"line":670,"column":0},"end":{"line":670,"column":10}},"670":{"start":{"line":671,"column":0},"end":{"line":671,"column":15}},"671":{"start":{"line":672,"column":0},"end":{"line":672,"column":30}},"672":{"start":{"line":673,"column":0},"end":{"line":673,"column":7}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":6}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":38}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":4}},"676":{"start":{"line":677,"column":0},"end":{"line":677,"column":1}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":61}},"683":{"start":{"line":684,"column":0},"end":{"line":684,"column":38}},"686":{"start":{"line":687,"column":0},"end":{"line":687,"column":70}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":72}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":52}},"690":{"start":{"line":691,"column":0},"end":{"line":691,"column":74}},"691":{"start":{"line":692,"column":0},"end":{"line":692,"column":10}},"693":{"start":{"line":694,"column":0},"end":{"line":694,"column":20}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":41}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":39}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":40}},"697":{"start":{"line":698,"column":0},"end":{"line":698,"column":47}},"698":{"start":{"line":699,"column":0},"end":{"line":699,"column":33}},"699":{"start":{"line":700,"column":0},"end":{"line":700,"column":36}},"700":{"start":{"line":701,"column":0},"end":{"line":701,"column":36}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":34}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":51}},"703":{"start":{"line":704,"column":0},"end":{"line":704,"column":35}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":38}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":38}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":36}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":54}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":79}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":47}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":40}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":6}},"712":{"start":{"line":713,"column":0},"end":{"line":713,"column":3}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":63}},"715":{"start":{"line":716,"column":0},"end":{"line":716,"column":1}}},"s":{"0":1,"206":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"221":1,"222":0,"223":0,"227":1,"228":0,"229":0,"231":0,"232":0,"233":0,"234":0,"236":0,"237":0,"239":1,"240":0,"241":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"261":1,"262":0,"263":0,"265":0,"266":0,"267":0,"268":0,"270":0,"271":0,"275":1,"276":0,"277":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"306":0,"307":0,"309":1,"310":0,"311":0,"313":0,"314":0,"315":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"333":1,"334":0,"335":0,"337":0,"338":0,"339":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"352":1,"353":0,"354":0,"356":0,"357":0,"358":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"374":1,"375":0,"376":0,"378":0,"379":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"390":1,"391":0,"392":0,"394":0,"395":0,"396":0,"397":0,"399":0,"400":0,"402":1,"403":0,"404":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"430":1,"431":0,"432":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"447":0,"448":0,"450":1,"451":0,"452":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"462":1,"463":0,"464":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"480":1,"481":0,"482":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"500":1,"501":0,"502":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"511":0,"512":0,"516":1,"517":0,"518":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"533":1,"534":0,"535":0,"536":1,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"572":0,"573":0,"574":0,"575":0,"576":0,"577":0,"578":0,"579":0,"580":0,"581":0,"582":0,"587":0,"588":0,"589":0,"590":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":0,"616":0,"617":0,"618":0,"620":0,"621":0,"622":0,"623":0,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":0,"635":0,"636":0,"637":0,"638":0,"639":0,"640":0,"641":0,"642":0,"643":0,"644":0,"645":0,"646":0,"647":0,"648":0,"649":0,"650":0,"651":0,"652":0,"653":0,"654":0,"655":0,"656":0,"657":0,"658":0,"659":0,"660":0,"661":0,"662":0,"663":0,"664":0,"665":0,"666":0,"667":0,"668":0,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"682":1,"683":0,"686":0,"687":0,"688":0,"690":0,"691":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"714":0,"715":0},"branchMap":{"0":{"type":"branch","line":207,"loc":{"start":{"line":207,"column":76},"end":{"line":537,"column":2}},"locations":[{"start":{"line":207,"column":76},"end":{"line":537,"column":2}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"setConfigStoreClient","decl":{"start":{"line":222,"column":24},"end":{"line":224,"column":4}},"loc":{"start":{"line":222,"column":24},"end":{"line":224,"column":4}},"line":222},"1":{"name":"loadQuickConfig","decl":{"start":{"line":228,"column":19},"end":{"line":238,"column":4}},"loc":{"start":{"line":228,"column":19},"end":{"line":238,"column":4}},"line":228},"2":{"name":"saveQuickConfig","decl":{"start":{"line":240,"column":19},"end":{"line":258,"column":4}},"loc":{"start":{"line":240,"column":19},"end":{"line":258,"column":4}},"line":240},"3":{"name":"loadWorkspaceInfo","decl":{"start":{"line":262,"column":21},"end":{"line":272,"column":4}},"loc":{"start":{"line":262,"column":21},"end":{"line":272,"column":4}},"line":262},"4":{"name":"loadChannels","decl":{"start":{"line":276,"column":16},"end":{"line":308,"column":4}},"loc":{"start":{"line":276,"column":16},"end":{"line":308,"column":4}},"line":276},"5":{"name":"getChannel","decl":{"start":{"line":310,"column":14},"end":{"line":332,"column":4}},"loc":{"start":{"line":310,"column":14},"end":{"line":332,"column":4}},"line":310},"6":{"name":"createChannel","decl":{"start":{"line":334,"column":17},"end":{"line":351,"column":4}},"loc":{"start":{"line":334,"column":17},"end":{"line":351,"column":4}},"line":334},"7":{"name":"updateChannel","decl":{"start":{"line":353,"column":17},"end":{"line":373,"column":4}},"loc":{"start":{"line":353,"column":17},"end":{"line":373,"column":4}},"line":353},"8":{"name":"deleteChannel","decl":{"start":{"line":375,"column":17},"end":{"line":387,"column":4}},"loc":{"start":{"line":375,"column":17},"end":{"line":387,"column":4}},"line":375},"9":{"name":"loadScheduledTasks","decl":{"start":{"line":391,"column":22},"end":{"line":401,"column":4}},"loc":{"start":{"line":391,"column":22},"end":{"line":401,"column":4}},"line":391},"10":{"name":"createScheduledTask","decl":{"start":{"line":403,"column":23},"end":{"line":427,"column":4}},"loc":{"start":{"line":403,"column":23},"end":{"line":427,"column":4}},"line":403},"11":{"name":"loadSkillsCatalog","decl":{"start":{"line":431,"column":21},"end":{"line":449,"column":4}},"loc":{"start":{"line":431,"column":21},"end":{"line":449,"column":4}},"line":431},"12":{"name":"getSkill","decl":{"start":{"line":451,"column":12},"end":{"line":461,"column":4}},"loc":{"start":{"line":451,"column":12},"end":{"line":461,"column":4}},"line":451},"13":{"name":"createSkill","decl":{"start":{"line":463,"column":15},"end":{"line":479,"column":4}},"loc":{"start":{"line":463,"column":15},"end":{"line":479,"column":4}},"line":463},"14":{"name":"updateSkill","decl":{"start":{"line":481,"column":15},"end":{"line":499,"column":4}},"loc":{"start":{"line":481,"column":15},"end":{"line":499,"column":4}},"line":481},"15":{"name":"deleteSkill","decl":{"start":{"line":501,"column":15},"end":{"line":513,"column":4}},"loc":{"start":{"line":501,"column":15},"end":{"line":513,"column":4}},"line":501},"16":{"name":"loadModels","decl":{"start":{"line":517,"column":14},"end":{"line":530,"column":4}},"loc":{"start":{"line":517,"column":14},"end":{"line":530,"column":4}},"line":517},"17":{"name":"clearError","decl":{"start":{"line":534,"column":14},"end":{"line":536,"column":4}},"loc":{"start":{"line":534,"column":14},"end":{"line":536,"column":4}},"line":534},"18":{"name":"createConfigClientFromGateway","decl":{"start":{"line":555,"column":0},"end":{"line":583,"column":1}},"loc":{"start":{"line":555,"column":0},"end":{"line":583,"column":1}},"line":555},"19":{"name":"createConfigClientFromKernel","decl":{"start":{"line":588,"column":0},"end":{"line":677,"column":1}},"loc":{"start":{"line":588,"column":0},"end":{"line":677,"column":1}},"line":588},"20":{"name":"setConfigStoreClient","decl":{"start":{"line":683,"column":7},"end":{"line":716,"column":1}},"loc":{"start":{"line":683,"column":7},"end":{"line":716,"column":1}},"line":683}},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\connectionStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\connectionStore.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":56}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":44}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":7}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":67}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":17}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":32}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":5}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":17}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":68}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":12}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":1}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":139}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":60}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":22}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":9}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":71}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":49}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":59}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":29}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":67}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":9}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":7}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":71}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":5}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":22}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":29}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":21}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":12}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":38}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":29}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":40}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":42}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":56}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":6}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":3}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":14}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":1}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":63}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":79}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":10}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":45}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":56}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":72}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":45}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":39}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":40}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":38}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":41}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":1}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":60}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":40}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":1}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":73}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":66}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":54}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":36}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":4}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":38}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":17}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":78}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":8}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":4}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":10}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":36}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":25}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":16}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":13}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":53}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":28}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":21}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":28}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":28}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":11}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":54}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":11}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":29}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":51}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":78}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":32}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":100}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":49}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":54}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":29}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":57}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":11}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":36}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":85}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":11}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":58}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":43}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":37}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":44}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":41}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":49}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":13}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":34}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":43}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":37}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":39}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":41}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":49}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":13}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":68}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":44}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":12}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":52}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":25}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":86}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":16}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":12}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":40}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":63}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":29}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":39}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":52}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":78}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":17}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":9}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":31}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":66}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":42}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":28}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":63}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":11}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":42}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":98}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":38}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":51}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":11}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":26}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":34}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":32}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":36}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":12}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":28}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":20}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":24}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":32}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":50}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":13}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":12}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":10}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":119}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":107}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":56}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":38}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":47}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":51}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":15}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":29}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":32}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":36}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":15}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":30}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":40}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":18}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":25}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":28}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":52}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":24}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":13}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":11}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":9}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":28}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":115}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":9}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":42}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":13}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":42}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":51}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":55}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":69}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":30}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":78}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":37}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":18}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":7}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":6}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":23}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":32}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":11}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":40}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":29}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":20}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":9}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":6}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":39}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":38}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":30}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":63}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":68}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":27}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":7}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":38}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":11}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":55}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":63}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":22}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":30}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":99}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":28}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":32}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":26}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":25}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":10}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":83}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":26}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":7}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":6}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":36}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":30}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":63}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":68}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":27}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":7}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":51}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":11}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":56}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":63}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":22}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":30}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":93}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":28}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":32}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":26}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":25}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":10}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":83}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":25}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":7}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":6}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":35}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":30}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":63}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":68}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":27}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":7}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":51}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":11}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":55}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":63}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":22}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":30}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":92}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":28}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":32}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":26}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":25}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":10}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":83}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":25}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":7}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":6}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":38}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":30}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":63}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":68}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":27}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":7}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":51}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":11}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":58}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":63}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":22}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":30}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":95}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":28}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":32}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":26}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":25}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":10}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":83}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":25}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":7}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":6}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":4}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":3}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":86}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":68}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":76}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":86}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":84}}},"s":{"0":1,"36":1,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"72":1,"73":0,"76":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"109":0,"110":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"142":0,"143":0,"144":0,"176":1,"179":1,"182":1,"183":0,"184":0,"187":1,"188":0,"189":0,"190":0,"191":0,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"208":1,"209":0,"210":0,"214":0,"215":0,"217":0,"218":0,"219":0,"222":0,"224":0,"225":0,"226":0,"228":0,"229":0,"230":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"249":0,"250":0,"251":0,"254":0,"255":0,"256":0,"257":0,"258":0,"261":0,"264":0,"265":0,"268":0,"271":0,"273":0,"274":0,"275":0,"278":0,"281":0,"282":0,"283":0,"284":0,"285":0,"287":0,"290":0,"291":0,"292":0,"293":0,"296":0,"297":0,"298":0,"299":0,"300":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"313":0,"314":0,"316":0,"317":0,"318":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"334":0,"335":0,"336":0,"337":0,"338":0,"340":0,"341":0,"342":0,"345":0,"348":0,"349":0,"350":0,"351":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"361":1,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"370":1,"372":1,"373":0,"374":0,"375":0,"376":0,"377":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"396":1,"397":0,"398":0,"399":0,"400":0,"401":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"420":1,"421":0,"422":0,"423":0,"424":0,"425":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"444":1,"445":0,"446":0,"447":0,"448":0,"449":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":1,"468":1,"475":1,"480":1,"485":1,"490":1,"495":1},"branchMap":{"0":{"type":"branch","line":177,"loc":{"start":{"line":177,"column":58},"end":{"line":469,"column":3}},"locations":[{"start":{"line":177,"column":58},"end":{"line":469,"column":3}}]},"1":{"type":"branch","line":481,"loc":{"start":{"line":481,"column":25},"end":{"line":481,"column":68}},"locations":[{"start":{"line":481,"column":25},"end":{"line":481,"column":68}}]}},"b":{"0":[1],"1":[4]},"fnMap":{"0":{"name":"loadCustomModels","decl":{"start":{"line":53,"column":0},"end":{"line":63,"column":1}},"loc":{"start":{"line":53,"column":0},"end":{"line":63,"column":1}},"line":53},"1":{"name":"getDefaultModelConfig","decl":{"start":{"line":73,"column":7},"end":{"line":111,"column":1}},"loc":{"start":{"line":73,"column":7},"end":{"line":111,"column":1}},"line":73},"2":{"name":"shouldRetryGatewayCandidate","decl":{"start":{"line":126,"column":0},"end":{"line":138,"column":1}},"loc":{"start":{"line":126,"column":0},"end":{"line":138,"column":1}},"line":126},"3":{"name":"normalizeGatewayUrlCandidate","decl":{"start":{"line":143,"column":0},"end":{"line":145,"column":1}},"loc":{"start":{"line":143,"column":0},"end":{"line":145,"column":1}},"line":143},"4":{"name":"client.onStateChange","decl":{"start":{"line":183,"column":25},"end":{"line":185,"column":4}},"loc":{"start":{"line":183,"column":25},"end":{"line":185,"column":4}},"line":183},"5":{"name":"client.onLog","decl":{"start":{"line":188,"column":17},"end":{"line":192,"column":4}},"loc":{"start":{"line":188,"column":17},"end":{"line":192,"column":4}},"line":188},"6":{"name":"connect","decl":{"start":{"line":209,"column":13},"end":{"line":360,"column":6}},"loc":{"start":{"line":209,"column":13},"end":{"line":360,"column":6}},"line":209},"7":{"name":"disconnect","decl":{"start":{"line":362,"column":16},"end":{"line":369,"column":6}},"loc":{"start":{"line":362,"column":16},"end":{"line":369,"column":6}},"line":362},"8":{"name":"clearLogs","decl":{"start":{"line":371,"column":15},"end":{"line":371,"column":39}},"loc":{"start":{"line":371,"column":15},"end":{"line":371,"column":39}},"line":371},"9":{"name":"refreshLocalGateway","decl":{"start":{"line":373,"column":25},"end":{"line":395,"column":6}},"loc":{"start":{"line":373,"column":25},"end":{"line":395,"column":6}},"line":373},"10":{"name":"startLocalGateway","decl":{"start":{"line":397,"column":23},"end":{"line":419,"column":6}},"loc":{"start":{"line":397,"column":23},"end":{"line":419,"column":6}},"line":397},"11":{"name":"stopLocalGateway","decl":{"start":{"line":421,"column":22},"end":{"line":443,"column":6}},"loc":{"start":{"line":421,"column":22},"end":{"line":443,"column":6}},"line":421},"12":{"name":"restartLocalGateway","decl":{"start":{"line":445,"column":25},"end":{"line":467,"column":6}},"loc":{"start":{"line":445,"column":25},"end":{"line":467,"column":6}},"line":445},"13":{"name":"getConnectionState","decl":{"start":{"line":476,"column":34},"end":{"line":476,"column":86}},"loc":{"start":{"line":476,"column":34},"end":{"line":476,"column":86}},"line":476},"14":{"name":"getClient","decl":{"start":{"line":481,"column":25},"end":{"line":481,"column":68}},"loc":{"start":{"line":481,"column":25},"end":{"line":481,"column":68}},"line":481},"15":{"name":"getConnectionError","decl":{"start":{"line":486,"column":34},"end":{"line":486,"column":76}},"loc":{"start":{"line":486,"column":34},"end":{"line":486,"column":76}},"line":486},"16":{"name":"getLocalGatewayStatus","decl":{"start":{"line":491,"column":37},"end":{"line":491,"column":86}},"loc":{"start":{"line":491,"column":37},"end":{"line":491,"column":86}},"line":491},"17":{"name":"getGatewayVersion","decl":{"start":{"line":496,"column":33},"end":{"line":496,"column":84}},"loc":{"start":{"line":496,"column":33},"end":{"line":496,"column":84}},"line":496}},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":4,"15":0,"16":0,"17":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\gatewayStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\gatewayStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":4}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":95}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":32}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":30}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":38}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":34}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":38}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":36}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":33}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":42}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":40}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":134}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":20}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":36}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":44}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":89}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":24}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":25}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":33}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":37}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":22}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":28}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":28}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":30}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":34}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":73}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":36}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":40}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":30}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":42}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":40}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":26}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":40}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":44}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":58}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":54}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":34}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":31}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":45}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":54}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":37}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":32}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":33}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":35}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":39}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":78}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":11}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":31}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":33}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":36}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":35}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":25}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":33}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":28}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":38}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":28}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":9}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":34}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":6}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":32}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":30}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":50}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":46}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":44}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":50}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":33}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":67}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":67}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":35}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":41}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":45}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":30}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":40}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":34}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":36}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":34}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":32}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":36}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":32}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":72}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":38}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":38}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":38}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":46}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":42}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":79}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":79}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":44}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":82}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":44}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":85}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":44}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":44}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":48}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":38}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":34}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":40}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":40}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":40}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":50}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":52}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":48}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":30}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":36}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":36}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":36}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":34}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":52}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":42}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":39}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":35}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":41}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":41}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":53}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":66}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":55}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":6}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":4}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":17}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":28}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":3}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":16}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":1}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":59}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":76}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":61}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":67}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":57}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":55}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":63}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":59}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":63}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":61}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":52}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":57}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":18}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":5}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":1}}},"s":{"0":0,"66":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"88":0,"89":0,"90":0,"93":0,"94":0,"95":0,"96":0,"99":0,"100":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"113":0,"114":0,"115":0,"116":0,"119":0,"120":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"203":0,"204":0,"207":0,"208":0,"209":0,"210":0,"211":0,"214":0,"215":0,"216":0,"217":0,"219":0,"220":0,"221":0,"222":0,"223":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"351":0,"352":0,"353":0,"355":0,"356":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":16338},"end":{"line":357,"column":1}},"locations":[{"start":{"line":1,"column":16338},"end":{"line":357,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":16338},"end":{"line":357,"column":1}},"loc":{"start":{"line":1,"column":16338},"end":{"line":357,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\handStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\handStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":62}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":12}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":15}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":15}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":16}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":19}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":14}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":15}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":47}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":20}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":4}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":26}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":32}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":67}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":18}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":74}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":13}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":5}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":29}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":9}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":63}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":46}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":59}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":115}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":87}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":73}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":38}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":59}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":16}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":37}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":37}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":51}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":17}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":56}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":53}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":45}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":82}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":88}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":10}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":9}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":70}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":39}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":19}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":57}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":32}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":5}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":4}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":43}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":32}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":34}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":9}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":48}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":36}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":72}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":70}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":57}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":8}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":73}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":70}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":52}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":8}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":115}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":76}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":41}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":62}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":26}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":53}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":42}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":54}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":15}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":59}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":56}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":48}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":81}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":72}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":89}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":60}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":44}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":39}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":12}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":73}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":79}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":95}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":101}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":8}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":21}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":77}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":10}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":18}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":13}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":23}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":5}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":4}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":85}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":32}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":27}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":9}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":59}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":76}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":49}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":38}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":91}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":70}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":37}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":36}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":10}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":21}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":54}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":10}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":18}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":13}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":16}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":5}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":4}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":74}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":32}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":34}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":9}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":60}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":36}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":28}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":34}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":43}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":44}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":8}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":21}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":19}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":28}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":57}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":10}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":10}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":30}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":17}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":28}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":71}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":23}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":4}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":91}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":32}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":24}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":9}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":62}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":30}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":28}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":71}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":16}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":5}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":4}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":54}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":32}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":24}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":9}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":43}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":30}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":28}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":71}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":16}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":5}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":4}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":29}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":32}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":24}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":9}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":49}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":48}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":13}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":5}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":4}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":37}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":32}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":34}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":9}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":49}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":36}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":14}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":22}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":26}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":32}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":19}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":28}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":71}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":23}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":5}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":4}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":59}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":32}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":34}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":9}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":57}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":40}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":33}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":58}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":28}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":71}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":23}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":5}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":4}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":49}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":32}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":34}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":9}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":46}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":21}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":41}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":48}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":10}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":10}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":51}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":28}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":71}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":23}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":5}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":4}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":40}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":32}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":24}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":9}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":37}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":21}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":58}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":10}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":28}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":71}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":16}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":5}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":4}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":53}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":32}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":24}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":9}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":56}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":88}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":56}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":50}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":35}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":58}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":81}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":51}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":42}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":38}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":25}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":53}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":53}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":62}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":10}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":25}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":13}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":5}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":4}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":88}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":32}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":24}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":9}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":67}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":34}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":28}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":71}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":16}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":5}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":4}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":41}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":4}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":80}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":10}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":40}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":44}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":66}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":68}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":102}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":64}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":46}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":46}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":62}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":70}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":52}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":60}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":112}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":4}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":1}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":59}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":74}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":57}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":1}}},"s":{"0":0,"189":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"200":0,"201":0,"202":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"244":0,"245":0,"246":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"287":0,"288":0,"289":0,"291":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"320":0,"321":0,"322":0,"324":0,"325":0,"326":0,"328":0,"329":0,"330":0,"331":0,"332":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"343":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"352":0,"353":0,"354":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"365":0,"366":0,"367":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"380":0,"381":0,"382":0,"384":0,"385":0,"386":0,"387":0,"389":0,"390":0,"392":0,"393":0,"394":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"410":0,"411":0,"412":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"425":0,"426":0,"427":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"443":0,"444":0,"445":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"460":0,"461":0,"462":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"483":0,"484":0,"486":0,"487":0,"488":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"499":0,"500":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"530":0,"531":0,"532":0,"533":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":17144},"end":{"line":534,"column":1}},"locations":[{"start":{"line":1,"column":17144},"end":{"line":534,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":17144},"end":{"line":534,"column":1}},"loc":{"start":{"line":1,"column":17144},"end":{"line":534,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":42}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":30}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":29}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":33}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":31}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":33}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":32}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":36}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":34}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}}},"s":{"0":0,"70":0,"71":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"86":0,"88":0,"89":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3592},"end":{"line":90,"column":1}},"locations":[{"start":{"line":1,"column":3592},"end":{"line":90,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3592},"end":{"line":90,"column":1}},"loc":{"start":{"line":1,"column":3592},"end":{"line":90,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\memoryGraphStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\memoryGraphStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":37}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":61}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":16}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":18}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":2}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":37}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":13}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":10}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":13}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":2}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":85}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":46}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":21}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":10}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":18}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":22}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":83}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":38}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":38}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":10}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":10}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":34}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":36}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":32}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":25}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":22}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":1}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":68}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":32}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":45}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":29}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":29}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":66}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":34}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":20}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":39}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":24}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":24}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":26}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":44}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":11}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":7}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":32}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":40}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":55}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":10}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":28}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":22}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":46}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":26}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":26}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":26}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":13}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":7}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":5}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":3}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":15}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":1}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":62}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":10}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":20}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":16}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":16}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":23}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":18}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":29}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":29}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":27}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":26}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":23}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":31}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":45}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":46}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":13}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":67}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":20}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":23}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":13}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":84}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":54}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":15}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":18}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":29}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":13}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":23}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":15}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":29}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":65}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":13}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":8}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":30}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":23}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":49}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":12}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":8}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":26}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":40}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":8}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":30}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":23}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":49}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":12}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":8}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":31}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":23}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":33}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":40}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":17}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":40}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":14}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":12}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":8}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":30}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":23}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":32}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":40}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":17}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":70}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":14}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":12}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":8}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":27}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":58}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":8}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":30}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":41}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":8}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":29}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":42}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":8}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":41}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":23}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":42}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":63}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":73}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":13}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":12}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":8}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":35}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":47}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":23}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":58}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":40}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":17}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":86}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":14}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":12}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":8}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":29}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":23}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":72}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":12}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":8}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":34}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":20}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":8}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":31}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":40}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":34}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":59}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":64}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":91}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":87}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":35}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":84}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":11}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":22}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":11}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":8}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":31}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":32}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":55}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":62}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":81}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":8}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":7}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":5}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":33}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":31}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":29}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":29}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":37}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":9}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":5}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":3}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":2}}},"s":{"0":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"109":0,"111":0,"112":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"130":0,"131":0,"134":0,"135":0,"136":0,"137":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"169":0,"170":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"189":0,"190":0,"191":0,"192":0,"193":0,"195":0,"196":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"211":0,"212":0,"213":0,"214":0,"215":0,"217":0,"218":0,"219":0,"221":0,"222":0,"223":0,"224":0,"225":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"247":0,"248":0,"249":0,"251":0,"252":0,"253":0,"255":0,"256":0,"257":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"279":0,"280":0,"281":0,"282":0,"283":0,"285":0,"287":0,"288":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"304":0,"305":0,"306":0,"307":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":7953},"end":{"line":322,"column":2}},"locations":[{"start":{"line":1,"column":7953},"end":{"line":322,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":7953},"end":{"line":322,"column":2}},"loc":{"start":{"line":1,"column":7953},"end":{"line":322,"column":2}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\meshStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\meshStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":62}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":22}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":15}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":11}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":18}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":24}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":30}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":19}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":14}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":21}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":24}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":42}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":9}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":74}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":83}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":11}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":48}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":57}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":25}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":9}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":32}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":19}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":11}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":64}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":25}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":9}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":61}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":9}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":74}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":80}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":23}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":88}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":10}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":19}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":71}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":5}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":62}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":9}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":74}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":81}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":23}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":88}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":10}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":71}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":78}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":9}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":74}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":89}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":19}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":55}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":5}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":4}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":28}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":9}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":74}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":89}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":24}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":19}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":52}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":4}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":56}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":9}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":74}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":55}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":73}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":33}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":71}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":5}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":4}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":30}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":74}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":55}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":32}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":54}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":5}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":4}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":41}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}}},"s":{"0":0,"41":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"56":0,"57":0,"58":0,"59":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"79":0,"80":0,"81":0,"82":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"93":0,"94":0,"95":0,"96":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0,"142":0,"143":0,"144":0,"145":0,"146":0,"148":0,"149":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":4624},"end":{"line":161,"column":2}},"locations":[{"start":{"line":1,"column":4624},"end":{"line":161,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":4624},"end":{"line":161,"column":2}},"loc":{"start":{"line":1,"column":4624},"end":{"line":161,"column":2}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\offlineStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\offlineStore.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":49}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":48}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":37}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":59}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":18}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":44}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":23}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":1}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":38}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":74}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":1}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":70}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":54}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":10}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":20}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":23}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":28}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":50}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":27}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":25}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":37}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":35}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":41}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":43}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":13}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":29}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":70}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":11}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":37}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":36}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":44}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":34}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":84}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":35}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":9}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":8}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":69}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":13}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":39}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":62}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":11}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":8}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":81}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":28}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":64}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":64}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":43}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":12}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":44}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":39}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":40}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":18}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":18}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":32}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":24}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":28}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":21}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":57}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":12}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":60}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":18}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":8}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":93}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":21}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":53}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":23}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":17}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":23}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":25}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":35}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":84}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":17}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":12}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":12}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":8}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":38}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":70}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":12}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":8}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":25}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":36}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":8}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":37}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":28}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":52}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":64}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":10}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":41}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":51}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":77}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":17}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":9}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":81}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":36}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":54}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":81}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":84}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":21}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":11}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":55}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":15}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":68}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":39}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":44}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":41}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":35}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":15}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":54}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":64}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":78}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":25}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":84}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":70}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":83}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":11}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":9}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":8}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":32}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":28}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":37}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":32}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":51}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":47}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":92}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":13}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":31}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":36}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":56}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":11}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":43}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":35}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":18}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":8}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":30}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":29}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":39}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":32}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":9}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":39}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":8}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":37}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":65}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":13}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":56}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":53}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":66}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":36}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":24}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":11}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":23}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":67}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":9}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":37}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":34}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":21}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":8}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":33}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":43}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":64}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":10}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":8}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":33}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":41}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":64}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":10}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":8}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":7}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":36}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":31}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":52}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":64}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":10}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":45}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":9}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":5}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":3}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":2}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":51}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":33}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":49}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":54}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":61}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":55}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":4}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":20}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":74}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":62}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":62}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":55}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":5}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":5}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":60}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":16}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":18}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":30}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":41}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":33}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":5}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":4}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":1}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":68}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":81}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":88}}},"s":{"0":1,"61":1,"62":1,"63":1,"64":1,"65":1,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"76":0,"77":0,"78":0,"82":1,"83":1,"85":1,"86":1,"87":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"100":1,"101":0,"102":0,"103":0,"104":0,"105":0,"108":0,"109":0,"110":0,"112":0,"113":0,"114":0,"115":0,"116":0,"118":1,"119":0,"120":0,"121":0,"122":0,"123":0,"127":1,"128":0,"131":0,"133":0,"134":0,"135":0,"136":0,"137":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"158":1,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"173":1,"174":0,"175":0,"176":0,"177":0,"179":1,"180":0,"181":0,"183":1,"184":0,"185":0,"186":0,"187":0,"189":0,"192":0,"193":0,"194":0,"195":0,"197":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"206":0,"208":0,"210":0,"211":0,"213":0,"214":0,"215":0,"216":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"232":1,"233":0,"236":0,"239":0,"241":0,"242":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"252":0,"253":0,"254":0,"255":0,"257":1,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"265":1,"266":0,"268":0,"270":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"283":0,"284":0,"285":0,"286":0,"290":1,"291":0,"292":0,"293":0,"294":0,"296":1,"297":0,"298":0,"299":0,"300":0,"301":1,"302":1,"303":1,"304":1,"305":0,"306":0,"307":0,"308":0,"309":0,"310":1,"311":1,"312":1,"320":1,"321":0,"322":0,"323":0,"325":0,"326":0,"327":0,"328":0,"331":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"342":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"355":1,"356":1,"357":1},"branchMap":{"0":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":4},"end":{"line":302,"column":7}},"locations":[{"start":{"line":88,"column":4},"end":{"line":302,"column":7}}]},"1":{"type":"branch","line":356,"loc":{"start":{"line":356,"column":25},"end":{"line":356,"column":68}},"locations":[{"start":{"line":356,"column":25},"end":{"line":356,"column":68}}]}},"b":{"0":[1],"1":[2]},"fnMap":{"0":{"name":"calculateNextDelay","decl":{"start":{"line":70,"column":0},"end":{"line":75,"column":1}},"loc":{"start":{"line":70,"column":0},"end":{"line":75,"column":1}},"line":70},"1":{"name":"generateMessageId","decl":{"start":{"line":77,"column":0},"end":{"line":79,"column":1}},"loc":{"start":{"line":77,"column":0},"end":{"line":79,"column":1}},"line":77},"2":{"name":"__vite_ssr_import_0__.create.__vite_ssr_import_1__.persist.name","decl":{"start":{"line":88,"column":4},"end":{"line":302,"column":7}},"loc":{"start":{"line":88,"column":4},"end":{"line":302,"column":7}},"line":88},"3":{"name":"setOffline","decl":{"start":{"line":101,"column":18},"end":{"line":117,"column":8}},"loc":{"start":{"line":101,"column":18},"end":{"line":117,"column":8}},"line":101},"4":{"name":"setReconnecting","decl":{"start":{"line":119,"column":23},"end":{"line":124,"column":8}},"loc":{"start":{"line":119,"column":23},"end":{"line":124,"column":8}},"line":119},"5":{"name":"queueMessage","decl":{"start":{"line":128,"column":20},"end":{"line":157,"column":8}},"loc":{"start":{"line":128,"column":20},"end":{"line":157,"column":8}},"line":128},"6":{"name":"updateMessageStatus","decl":{"start":{"line":159,"column":27},"end":{"line":172,"column":8}},"loc":{"start":{"line":159,"column":27},"end":{"line":172,"column":8}},"line":159},"7":{"name":"removeMessage","decl":{"start":{"line":174,"column":21},"end":{"line":178,"column":8}},"loc":{"start":{"line":174,"column":21},"end":{"line":178,"column":8}},"line":174},"8":{"name":"clearQueue","decl":{"start":{"line":180,"column":18},"end":{"line":182,"column":8}},"loc":{"start":{"line":180,"column":18},"end":{"line":182,"column":8}},"line":180},"9":{"name":"retryAllMessages","decl":{"start":{"line":184,"column":24},"end":{"line":229,"column":8}},"loc":{"start":{"line":184,"column":24},"end":{"line":229,"column":8}},"line":184},"10":{"name":"scheduleReconnect","decl":{"start":{"line":233,"column":25},"end":{"line":256,"column":8}},"loc":{"start":{"line":233,"column":25},"end":{"line":256,"column":8}},"line":233},"11":{"name":"cancelReconnect","decl":{"start":{"line":258,"column":23},"end":{"line":264,"column":8}},"loc":{"start":{"line":258,"column":23},"end":{"line":264,"column":8}},"line":258},"12":{"name":"attemptReconnect","decl":{"start":{"line":266,"column":24},"end":{"line":287,"column":8}},"loc":{"start":{"line":266,"column":24},"end":{"line":287,"column":8}},"line":266},"13":{"name":"getPendingMessages","decl":{"start":{"line":291,"column":26},"end":{"line":295,"column":8}},"loc":{"start":{"line":291,"column":26},"end":{"line":295,"column":8}},"line":291},"14":{"name":"hasPendingMessages","decl":{"start":{"line":297,"column":26},"end":{"line":301,"column":8}},"loc":{"start":{"line":297,"column":26},"end":{"line":301,"column":8}},"line":297},"15":{"name":"partialize","decl":{"start":{"line":305,"column":18},"end":{"line":310,"column":9}},"loc":{"start":{"line":305,"column":18},"end":{"line":310,"column":9}},"line":305},"16":{"name":"startOfflineMonitor","decl":{"start":{"line":321,"column":7},"end":{"line":352,"column":1}},"loc":{"start":{"line":321,"column":7},"end":{"line":352,"column":1}},"line":321},"17":{"name":"isOffline","decl":{"start":{"line":356,"column":25},"end":{"line":356,"column":68}},"loc":{"start":{"line":356,"column":25},"end":{"line":356,"column":68}},"line":356},"18":{"name":"getQueuedMessages","decl":{"start":{"line":357,"column":33},"end":{"line":357,"column":81}},"loc":{"start":{"line":357,"column":33},"end":{"line":357,"column":81}},"line":357},"19":{"name":"hasPendingMessages","decl":{"start":{"line":358,"column":34},"end":{"line":358,"column":88}},"loc":{"start":{"line":358,"column":34},"end":{"line":358,"column":88}},"line":358}},"f":{"0":0,"1":0,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":2,"18":0,"19":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\personaStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\personaStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":86}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":21}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":16}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":14}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":19}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":14}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":15}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":14}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":28}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":75}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":78}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":63}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":37}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":26}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":42}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":18}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":5}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":42}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":9}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":70}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":32}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":17}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":9}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":23}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":57}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":61}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":25}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":56}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":20}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":19}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":72}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":49}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":5}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":47}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":42}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":9}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":84}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":14}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":41}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":19}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":72}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":49}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":5}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":4}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":33}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":9}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":79}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":21}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":73}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":5}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":4}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":34}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":9}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":82}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":22}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":19}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":74}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":69}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":29}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":24}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":54}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":9}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":79}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":37}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":19}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":72}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":31}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":5}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":4}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":30}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":32}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":20}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":44}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":51}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":4}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":57}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":42}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":9}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":59}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":23}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":71}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":25}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":10}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":18}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":19}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":72}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":49}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":19}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":5}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":4}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":44}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":21}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":68}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":8}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":4}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":47}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":4}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":40}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":67}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":40}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":53}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":37}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":52}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":36}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":51}}},"s":{"0":0,"45":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"57":0,"58":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"68":0,"70":0,"71":0,"72":0,"73":0,"74":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"93":0,"94":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"128":0,"129":0,"130":0,"132":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"152":0,"153":0,"155":0,"156":0,"159":0,"160":0,"161":0,"162":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"173":0,"174":0,"175":0,"176":0,"177":0,"180":0,"181":0,"184":0,"185":0,"187":0,"188":0,"190":0,"191":0,"193":0,"194":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5566},"end":{"line":195,"column":51}},"locations":[{"start":{"line":1,"column":5566},"end":{"line":195,"column":51}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5566},"end":{"line":195,"column":51}},"loc":{"start":{"line":1,"column":5566},"end":{"line":195,"column":51}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\securityStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\securityStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":115}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":37}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":42}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":56}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":56}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":54}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":54}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":1}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":70}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":23}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":31}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":28}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":16}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":26}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":15}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":35}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":32}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":24}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":68}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":9}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":54}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":56}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":66}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":41}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":79}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":13}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":78}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":39}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":36}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":11}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":14}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":13}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":39}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":54}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":11}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":7}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":28}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":11}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":37}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":112}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":9}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":5}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":72}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":32}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":24}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":36}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":9}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":53}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":91}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":13}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":39}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":5}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":4}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":4}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":81}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":10}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":104}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":100}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":4}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":1}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":63}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":82}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":56}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":1}}},"s":{"0":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"73":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"82":0,"83":0,"84":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"113":0,"114":0,"115":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"124":0,"125":0,"126":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"137":0,"138":0,"139":0,"140":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":4324},"end":{"line":141,"column":1}},"locations":[{"start":{"line":1,"column":4324},"end":{"line":141,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":4324},"end":{"line":141,"column":1}},"loc":{"start":{"line":1,"column":4324},"end":{"line":141,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\sessionStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\sessionStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":68}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":15}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":22}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":19}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":14}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":71}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":32}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":24}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":9}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":53}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":58}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":56}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":34}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":41}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":49}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":77}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":49}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":58}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":48}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":31}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":12}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":24}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":13}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":5}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":4}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":44}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":32}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":34}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":9}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":56}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":36}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":32}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":32}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":43}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":47}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":59}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":65}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":51}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":73}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":8}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":21}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":62}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":69}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":41}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":10}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":21}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":13}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":23}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":5}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":4}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":81}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":32}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":34}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":9}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":81}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":36}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":32}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":43}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":47}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":25}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":17}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":8}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":65}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":21}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":28}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":71}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":23}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":4}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":47}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":32}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":24}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":9}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":44}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":21}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":65}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":44}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":82}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":10}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":10}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":28}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":71}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":16}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":4}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":97}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":32}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":9}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":70}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":98}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":39}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":68}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":75}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":25}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":10}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":21}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":77}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":22}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":13}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":16}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":5}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":4}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":4}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":79}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":10}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":54}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":60}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":60}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":83}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":88}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":1}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":62}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":80}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":54}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":1}}},"s":{"0":0,"91":0,"93":0,"94":0,"95":0,"96":0,"97":0,"99":0,"100":0,"101":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"119":0,"120":0,"122":0,"123":0,"124":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"149":0,"150":0,"151":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"171":0,"172":0,"173":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"189":0,"190":0,"191":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"224":0,"225":0,"226":0,"227":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":7268},"end":{"line":228,"column":1}},"locations":[{"start":{"line":1,"column":7268},"end":{"line":228,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":7268},"end":{"line":228,"column":1}},"loc":{"start":{"line":1,"column":7268},"end":{"line":228,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\skillMarketStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\skillMarketStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":35}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":2}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":27}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":3}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":33}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":45}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":82}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":14}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":41}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":47}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":0}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":40}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":22}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":20}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":22}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":18}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":24}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":19}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":14}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":2}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":0}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":19}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":9}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":34}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":9}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":40}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":9}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":47}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":45}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":9}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":54}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":9}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":56}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":11}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":62}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":59}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":107}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":11}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":37}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":9}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":25}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":9}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":20}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":1}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":0}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":19}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":83}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":11}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":21}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":26}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":29}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":45}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":43}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":7}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":5}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":15}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":29}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":44}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":11}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":29}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":51}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":32}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":59}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":75}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":20}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":52}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":19}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":56}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":13}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":13}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":32}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":27}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":11}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":21}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":13}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":27}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":63}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":11}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":6}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":19}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":38}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":31}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":34}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":26}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":35}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":7}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":45}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":46}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":16}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":58}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":65}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":75}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":79}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":69}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":10}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":9}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":38}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":19}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":45}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":40}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":6}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":19}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":43}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":36}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":6}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":19}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":46}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":48}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":55}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":31}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":11}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":17}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":65}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":48}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":15}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":59}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":83}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":12}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":80}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":13}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":32}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":46}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":11}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":20}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":21}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":13}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":63}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":11}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":21}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":7}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":6}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":48}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":48}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":11}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":17}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":80}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":48}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":15}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":60}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":68}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":12}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":18}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":80}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":13}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":32}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":46}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":11}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":20}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":21}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":13}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":63}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":11}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":21}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":7}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":6}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":21}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":49}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":31}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":56}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":6}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":19}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":45}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":35}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":58}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":54}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":70}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":21}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":6}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":19}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":102}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":55}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":38}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":18}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":35}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":16}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":44}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":8}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":53}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":20}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":31}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":45}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":31}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":83}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":64}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":18}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":17}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":52}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":47}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":12}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":9}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":9}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":14}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":53}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":71}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":37}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":6}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":21}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":32}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":18}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":43}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":31}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":6}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":19}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":23}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":27}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":6}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":19}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":18}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":43}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":45}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":24}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":6}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":2}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":0}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":15}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":0}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":3}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":21}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":12}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":3}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":56}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":7}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":26}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":60}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":0}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":25}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":28}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":15}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":17}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":24}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":20}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":27}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":19}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":15}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":19}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":5}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":0}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":69}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":0}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":21}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":62}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":15}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":19}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":33}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":40}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":35}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":38}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":40}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":27}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":19}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":8}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":0}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":18}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":96}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":28}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":14}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":3}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":1}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":31}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":6}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":5}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":30}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":20}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":46}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":61}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":53}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":42}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":27}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":23}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":31}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":6}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":5}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":24}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":21}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":58}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":67}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":59}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":58}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":30}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":23}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":32}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":6}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":5}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":29}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":19}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":46}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":68}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":54}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":58}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":30}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":23}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":31}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":6}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":5}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":31}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":19}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":58}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":64}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":54}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":43}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":30}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":32}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":6}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":5}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":30}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":19}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":40}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":58}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":55}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":43}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":30}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":23}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":32}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":6}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":5}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":29}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":25}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":44}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":66}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":56}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":43}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":22}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":23}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":42}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":6}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":5}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":22}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":19}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":36}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":56}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":53}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":34}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":29}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":23}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":31}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":6}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":4}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":16}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":1}}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":0},"end":{"line":360,"column":1}},"locations":[{"start":{"line":1,"column":0},"end":{"line":360,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":0},"end":{"line":360,"column":1}},"loc":{"start":{"line":1,"column":0},"end":{"line":360,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\teamStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\teamStore.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":84}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":55}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":74}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":69}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":53}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":41}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":43}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":93}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":9}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":19}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":35}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":8}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":94}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":43}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":59}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":8}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":95}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":51}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":47}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":8}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":89}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":35}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":82}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":8}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":10}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":42}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":22}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":13}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":18}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":16}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":15}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":4}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":2}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":53}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":10}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":19}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":16}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":19}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":14}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":23}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":25}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":19}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":26}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":42}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":57}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":29}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":19}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":42}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":72}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":37}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":43}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":25}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":9}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":7}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":39}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":21}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":64}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":43}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":5}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":4}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":53}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":42}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":9}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":43}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":70}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":25}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":27}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":47}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":21}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":19}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":20}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":23}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":62}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":25}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":10}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":26}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":25}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":27}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":41}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":16}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":18}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":33}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":24}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":25}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":23}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":23}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":8}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":20}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":45}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":67}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":61}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":9}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":18}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":21}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":65}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":18}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":5}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":4}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":41}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":42}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":9}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":20}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":63}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":67}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":16}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":16}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":80}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":26}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":10}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":9}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":18}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":21}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":65}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":19}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":5}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":41}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":16}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":23}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":52}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":8}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":4}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":79}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":24}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":56}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":27}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":32}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":23}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":14}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":43}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":11}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":17}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":18}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":21}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":58}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":23}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":6}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":14}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":41}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":42}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":6}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":18}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":76}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":65}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":14}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":14}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":85}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":8}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":7}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":18}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":4}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":61}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":24}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":56}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":28}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":25}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":14}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":59}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":42}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":6}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":18}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":76}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":65}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":14}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":14}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":85}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":8}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":7}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":16}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":4}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":87}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":24}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":56}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":28}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":25}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":14}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":36}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":99}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":8}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":42}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":6}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":18}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":76}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":65}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":14}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":14}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":85}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":8}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":7}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":16}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":4}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":51}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":24}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":64}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":27}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":41}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":28}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":23}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":27}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":39}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":58}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":33}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":37}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":47}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":25}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":33}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":21}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":21}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":6}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":25}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":14}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":35}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":21}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":6}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":18}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":84}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":65}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":14}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":14}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":93}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":105}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":8}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":7}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":16}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":4}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":87}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":24}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":56}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":28}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":41}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":25}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":14}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":34}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":38}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":70}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":55}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":34}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":9}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":37}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":36}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":9}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":36}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":9}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":21}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":6}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":18}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":76}},"377":{"start":{"line":378,"column":0},"end":{"line":378,"column":65}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":14}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":14}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":85}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":97}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":8}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":7}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":16}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":4}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":75}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":24}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":56}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":28}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":41}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":25}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":14}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":32}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":23}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":96}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":13}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":8}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":36}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":25}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":92}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":13}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":8}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":21}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":6}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":18}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":76}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":65}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":14}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":14}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":85}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":8}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":7}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":16}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":4}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":94}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":24}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":56}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":28}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":41}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":25}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":14}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":32}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":23}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":85}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":13}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":8}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":21}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":6}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":18}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":76}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":65}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":14}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":14}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":85}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":8}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":7}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":16}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":4}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":102}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":24}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":56}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":27}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":41}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":29}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":23}},"458":{"start":{"line":459,"column":0},"end":{"line":459,"column":18}},"459":{"start":{"line":460,"column":0},"end":{"line":460,"column":17}},"460":{"start":{"line":461,"column":0},"end":{"line":461,"column":13}},"461":{"start":{"line":462,"column":0},"end":{"line":462,"column":26}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":24}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":23}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":26}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":21}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":25}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":6}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":25}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":14}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":47}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":21}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":6}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":18}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":76}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":65}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":14}},"479":{"start":{"line":480,"column":0},"end":{"line":480,"column":14}},"480":{"start":{"line":481,"column":0},"end":{"line":481,"column":85}},"481":{"start":{"line":482,"column":0},"end":{"line":482,"column":8}},"482":{"start":{"line":483,"column":0},"end":{"line":483,"column":7}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":16}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":4}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":120}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":24}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":56}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":28}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":61}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":28}},"495":{"start":{"line":496,"column":0},"end":{"line":496,"column":41}},"496":{"start":{"line":497,"column":0},"end":{"line":497,"column":42}},"497":{"start":{"line":498,"column":0},"end":{"line":498,"column":18}},"498":{"start":{"line":499,"column":0},"end":{"line":499,"column":22}},"499":{"start":{"line":500,"column":0},"end":{"line":500,"column":34}},"500":{"start":{"line":501,"column":0},"end":{"line":501,"column":6}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":33}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":48}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":42}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":28}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":61}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":29}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":12}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":28}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":26}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":5}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":25}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":14}},"516":{"start":{"line":517,"column":0},"end":{"line":517,"column":32}},"517":{"start":{"line":518,"column":0},"end":{"line":518,"column":28}},"518":{"start":{"line":519,"column":0},"end":{"line":519,"column":66}},"519":{"start":{"line":520,"column":0},"end":{"line":520,"column":13}},"520":{"start":{"line":521,"column":0},"end":{"line":521,"column":8}},"521":{"start":{"line":522,"column":0},"end":{"line":522,"column":44}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":23}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":13}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":19}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":30}},"526":{"start":{"line":527,"column":0},"end":{"line":527,"column":48}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":68}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":33}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":13}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":13}},"531":{"start":{"line":532,"column":0},"end":{"line":532,"column":8}},"532":{"start":{"line":533,"column":0},"end":{"line":533,"column":21}},"533":{"start":{"line":534,"column":0},"end":{"line":534,"column":6}},"535":{"start":{"line":536,"column":0},"end":{"line":536,"column":18}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":76}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":65}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":14}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":14}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":85}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":97}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":8}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":7}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":16}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":4}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":85}},"549":{"start":{"line":550,"column":0},"end":{"line":550,"column":28}},"550":{"start":{"line":551,"column":0},"end":{"line":551,"column":60}},"551":{"start":{"line":552,"column":0},"end":{"line":552,"column":28}},"553":{"start":{"line":554,"column":0},"end":{"line":554,"column":41}},"554":{"start":{"line":555,"column":0},"end":{"line":555,"column":25}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":14}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":44}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":23}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":47}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":13}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":8}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":21}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":6}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":18}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":76}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":65}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":14}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":14}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":85}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":8}},"571":{"start":{"line":572,"column":0},"end":{"line":572,"column":7}},"573":{"start":{"line":574,"column":0},"end":{"line":574,"column":16}},"574":{"start":{"line":575,"column":0},"end":{"line":575,"column":4}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":44}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":19}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":65}},"580":{"start":{"line":581,"column":0},"end":{"line":581,"column":8}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":4}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":22}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":30}},"585":{"start":{"line":586,"column":0},"end":{"line":586,"column":4}},"588":{"start":{"line":589,"column":0},"end":{"line":589,"column":47}},"589":{"start":{"line":590,"column":0},"end":{"line":590,"column":36}},"590":{"start":{"line":591,"column":0},"end":{"line":591,"column":4}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":51}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":40}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":4}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":21}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":25}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":4}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":3}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":3}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":24}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":29}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":25}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":35}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":7}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":4}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":3}}},"s":{"0":1,"77":1,"79":1,"80":7,"81":7,"82":7,"84":7,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":7,"93":7,"94":7,"95":0,"96":7,"98":7,"99":7,"100":1,"101":6,"103":7,"105":7,"106":6,"107":1,"109":7,"110":7,"111":7,"112":7,"113":7,"114":7,"115":7,"116":7,"117":7,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"135":1,"136":0,"137":0,"140":0,"141":0,"143":0,"144":0,"146":0,"147":0,"148":0,"150":0,"151":0,"152":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"161":1,"162":8,"163":8,"164":8,"165":8,"166":7,"167":7,"168":7,"169":7,"170":7,"171":7,"172":7,"173":7,"174":7,"175":8,"177":8,"178":8,"179":8,"180":8,"181":8,"182":8,"183":8,"184":8,"185":8,"186":8,"187":8,"188":8,"190":8,"191":8,"192":8,"193":8,"194":8,"196":8,"197":8,"198":0,"199":0,"200":0,"201":8,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":0,"218":0,"219":0,"220":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"230":1,"231":1,"232":1,"233":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"262":1,"263":1,"265":1,"266":1,"267":1,"268":1,"270":1,"271":1,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"285":1,"286":1,"288":1,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"310":0,"311":0,"314":1,"315":4,"316":4,"317":4,"319":4,"320":4,"321":4,"322":4,"323":4,"324":4,"325":4,"326":4,"327":4,"328":4,"329":4,"330":4,"331":4,"332":4,"334":4,"335":4,"336":4,"337":4,"338":4,"340":4,"341":4,"342":4,"343":4,"344":4,"345":4,"346":4,"347":4,"348":4,"350":4,"351":4,"353":1,"354":1,"355":1,"356":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":0,"369":0,"370":1,"371":1,"372":1,"373":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"385":1,"386":1,"388":1,"389":0,"390":0,"391":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"418":0,"419":0,"421":1,"422":0,"423":0,"424":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"446":0,"447":0,"450":1,"451":2,"452":2,"453":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"469":2,"470":2,"471":2,"472":2,"473":2,"475":2,"476":2,"477":2,"478":2,"479":2,"480":2,"481":2,"482":2,"484":2,"485":2,"487":1,"488":1,"489":1,"490":1,"492":1,"493":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"502":1,"503":1,"505":1,"506":1,"507":1,"508":0,"509":0,"510":0,"511":0,"512":0,"514":1,"515":1,"516":1,"517":1,"518":1,"519":0,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":0,"531":1,"532":1,"533":1,"535":1,"536":1,"537":1,"538":1,"539":1,"540":1,"541":1,"542":1,"543":1,"545":1,"546":1,"548":1,"549":0,"550":0,"551":0,"553":0,"554":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"571":0,"573":0,"574":0,"577":1,"578":2,"579":2,"580":2,"581":2,"583":1,"584":1,"585":1,"588":1,"589":1,"590":1,"592":1,"593":1,"594":1,"596":1,"597":1,"598":1,"599":1,"600":1,"601":1,"602":1,"603":36,"604":36,"605":36,"606":1,"607":1},"branchMap":{"0":{"type":"branch","line":78,"loc":{"start":{"line":78,"column":19},"end":{"line":78,"column":84}},"locations":[{"start":{"line":78,"column":19},"end":{"line":78,"column":84}}]},"1":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":25},"end":{"line":118,"column":2}},"locations":[{"start":{"line":80,"column":25},"end":{"line":118,"column":2}}]},"2":{"type":"branch","line":85,"loc":{"start":{"line":85,"column":52},"end":{"line":91,"column":35}},"locations":[{"start":{"line":85,"column":52},"end":{"line":91,"column":35}}]},"3":{"type":"branch","line":95,"loc":{"start":{"line":95,"column":42},"end":{"line":96,"column":59}},"locations":[{"start":{"line":95,"column":42},"end":{"line":96,"column":59}}]},"4":{"type":"branch","line":100,"loc":{"start":{"line":100,"column":50},"end":{"line":101,"column":47}},"locations":[{"start":{"line":100,"column":50},"end":{"line":101,"column":47}}]},"5":{"type":"branch","line":101,"loc":{"start":{"line":101,"column":41},"end":{"line":102,"column":8}},"locations":[{"start":{"line":101,"column":41},"end":{"line":102,"column":8}}]},"6":{"type":"branch","line":106,"loc":{"start":{"line":106,"column":34},"end":{"line":107,"column":82}},"locations":[{"start":{"line":106,"column":34},"end":{"line":107,"column":82}}]},"7":{"type":"branch","line":107,"loc":{"start":{"line":107,"column":81},"end":{"line":108,"column":8}},"locations":[{"start":{"line":107,"column":81},"end":{"line":108,"column":8}}]},"8":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":43},"end":{"line":81,"column":72}},"locations":[{"start":{"line":81,"column":43},"end":{"line":81,"column":72}}]},"9":{"type":"branch","line":99,"loc":{"start":{"line":99,"column":50},"end":{"line":99,"column":92}},"locations":[{"start":{"line":99,"column":50},"end":{"line":99,"column":92}}]},"10":{"type":"branch","line":104,"loc":{"start":{"line":104,"column":46},"end":{"line":104,"column":80}},"locations":[{"start":{"line":104,"column":46},"end":{"line":104,"column":80}}]},"11":{"type":"branch","line":124,"loc":{"start":{"line":124,"column":4},"end":{"line":600,"column":3}},"locations":[{"start":{"line":124,"column":4},"end":{"line":600,"column":3}}]},"12":{"type":"branch","line":162,"loc":{"start":{"line":162,"column":14},"end":{"line":202,"column":4}},"locations":[{"start":{"line":162,"column":14},"end":{"line":202,"column":4}}]},"13":{"type":"branch","line":198,"loc":{"start":{"line":198,"column":4},"end":{"line":201,"column":5}},"locations":[{"start":{"line":198,"column":4},"end":{"line":201,"column":5}}]},"14":{"type":"branch","line":166,"loc":{"start":{"line":166,"column":61},"end":{"line":176,"column":8}},"locations":[{"start":{"line":166,"column":61},"end":{"line":176,"column":8}}]},"15":{"type":"branch","line":174,"loc":{"start":{"line":174,"column":39},"end":{"line":174,"column":60}},"locations":[{"start":{"line":174,"column":39},"end":{"line":174,"column":60}}]},"16":{"type":"branch","line":191,"loc":{"start":{"line":191,"column":10},"end":{"line":195,"column":7}},"locations":[{"start":{"line":191,"column":10},"end":{"line":195,"column":7}}]},"17":{"type":"branch","line":204,"loc":{"start":{"line":204,"column":14},"end":{"line":221,"column":4}},"locations":[{"start":{"line":204,"column":14},"end":{"line":221,"column":4}}]},"18":{"type":"branch","line":217,"loc":{"start":{"line":217,"column":4},"end":{"line":220,"column":5}},"locations":[{"start":{"line":217,"column":4},"end":{"line":220,"column":5}}]},"19":{"type":"branch","line":207,"loc":{"start":{"line":207,"column":10},"end":{"line":215,"column":7}},"locations":[{"start":{"line":207,"column":10},"end":{"line":215,"column":7}}]},"20":{"type":"branch","line":212,"loc":{"start":{"line":212,"column":47},"end":{"line":212,"column":63}},"locations":[{"start":{"line":212,"column":47},"end":{"line":212,"column":63}}]},"21":{"type":"branch","line":208,"loc":{"start":{"line":208,"column":41},"end":{"line":208,"column":61}},"locations":[{"start":{"line":208,"column":41},"end":{"line":208,"column":61}}]},"22":{"type":"branch","line":223,"loc":{"start":{"line":223,"column":17},"end":{"line":228,"column":4}},"locations":[{"start":{"line":223,"column":17},"end":{"line":228,"column":4}}]},"23":{"type":"branch","line":224,"loc":{"start":{"line":224,"column":8},"end":{"line":227,"column":6}},"locations":[{"start":{"line":224,"column":8},"end":{"line":227,"column":6}}]},"24":{"type":"branch","line":226,"loc":{"start":{"line":226,"column":43},"end":{"line":226,"column":52}},"locations":[{"start":{"line":226,"column":43},"end":{"line":226,"column":52}}]},"25":{"type":"branch","line":231,"loc":{"start":{"line":231,"column":13},"end":{"line":264,"column":4}},"locations":[{"start":{"line":231,"column":13},"end":{"line":264,"column":4}}]},"26":{"type":"branch","line":234,"loc":{"start":{"line":234,"column":15},"end":{"line":234,"column":27}},"locations":[{"start":{"line":234,"column":15},"end":{"line":234,"column":27}}]},"27":{"type":"branch","line":244,"loc":{"start":{"line":244,"column":35},"end":{"line":244,"column":56}},"locations":[{"start":{"line":244,"column":35},"end":{"line":244,"column":56}}]},"28":{"type":"branch","line":233,"loc":{"start":{"line":233,"column":34},"end":{"line":233,"column":54}},"locations":[{"start":{"line":233,"column":34},"end":{"line":233,"column":54}}]},"29":{"type":"branch","line":254,"loc":{"start":{"line":254,"column":8},"end":{"line":261,"column":5}},"locations":[{"start":{"line":254,"column":8},"end":{"line":261,"column":5}}]},"30":{"type":"branch","line":259,"loc":{"start":{"line":259,"column":54},"end":{"line":259,"column":85}},"locations":[{"start":{"line":259,"column":54},"end":{"line":259,"column":85}}]},"31":{"type":"branch","line":255,"loc":{"start":{"line":255,"column":36},"end":{"line":255,"column":74}},"locations":[{"start":{"line":255,"column":36},"end":{"line":255,"column":74}}]},"32":{"type":"branch","line":255,"loc":{"start":{"line":255,"column":50},"end":{"line":255,"column":73}},"locations":[{"start":{"line":255,"column":50},"end":{"line":255,"column":73}}]},"33":{"type":"branch","line":255,"loc":{"start":{"line":255,"column":59},"end":{"line":255,"column":74}},"locations":[{"start":{"line":255,"column":59},"end":{"line":255,"column":74}}]},"34":{"type":"branch","line":266,"loc":{"start":{"line":266,"column":16},"end":{"line":287,"column":4}},"locations":[{"start":{"line":266,"column":16},"end":{"line":287,"column":4}}]},"35":{"type":"branch","line":269,"loc":{"start":{"line":269,"column":15},"end":{"line":269,"column":28}},"locations":[{"start":{"line":269,"column":15},"end":{"line":269,"column":28}}]},"36":{"type":"branch","line":268,"loc":{"start":{"line":268,"column":34},"end":{"line":268,"column":54}},"locations":[{"start":{"line":268,"column":34},"end":{"line":268,"column":54}}]},"37":{"type":"branch","line":273,"loc":{"start":{"line":273,"column":35},"end":{"line":273,"column":57}},"locations":[{"start":{"line":273,"column":35},"end":{"line":273,"column":57}}]},"38":{"type":"branch","line":277,"loc":{"start":{"line":277,"column":8},"end":{"line":284,"column":5}},"locations":[{"start":{"line":277,"column":8},"end":{"line":284,"column":5}}]},"39":{"type":"branch","line":282,"loc":{"start":{"line":282,"column":54},"end":{"line":282,"column":85}},"locations":[{"start":{"line":282,"column":54},"end":{"line":282,"column":85}}]},"40":{"type":"branch","line":278,"loc":{"start":{"line":278,"column":36},"end":{"line":278,"column":74}},"locations":[{"start":{"line":278,"column":36},"end":{"line":278,"column":74}}]},"41":{"type":"branch","line":278,"loc":{"start":{"line":278,"column":50},"end":{"line":278,"column":73}},"locations":[{"start":{"line":278,"column":50},"end":{"line":278,"column":73}}]},"42":{"type":"branch","line":278,"loc":{"start":{"line":278,"column":59},"end":{"line":278,"column":74}},"locations":[{"start":{"line":278,"column":59},"end":{"line":278,"column":74}}]},"43":{"type":"branch","line":315,"loc":{"start":{"line":315,"column":11},"end":{"line":352,"column":4}},"locations":[{"start":{"line":315,"column":11},"end":{"line":352,"column":4}}]},"44":{"type":"branch","line":318,"loc":{"start":{"line":318,"column":15},"end":{"line":318,"column":27}},"locations":[{"start":{"line":318,"column":15},"end":{"line":318,"column":27}}]},"45":{"type":"branch","line":325,"loc":{"start":{"line":325,"column":22},"end":{"line":325,"column":48}},"locations":[{"start":{"line":325,"column":22},"end":{"line":325,"column":48}}]},"46":{"type":"branch","line":325,"loc":{"start":{"line":325,"column":35},"end":{"line":325,"column":58}},"locations":[{"start":{"line":325,"column":35},"end":{"line":325,"column":58}}]},"47":{"type":"branch","line":317,"loc":{"start":{"line":317,"column":34},"end":{"line":317,"column":62}},"locations":[{"start":{"line":317,"column":34},"end":{"line":317,"column":62}}]},"48":{"type":"branch","line":341,"loc":{"start":{"line":341,"column":8},"end":{"line":349,"column":5}},"locations":[{"start":{"line":341,"column":8},"end":{"line":349,"column":5}}]},"49":{"type":"branch","line":346,"loc":{"start":{"line":346,"column":62},"end":{"line":346,"column":93}},"locations":[{"start":{"line":346,"column":62},"end":{"line":346,"column":93}}]},"50":{"type":"branch","line":347,"loc":{"start":{"line":347,"column":87},"end":{"line":347,"column":105}},"locations":[{"start":{"line":347,"column":87},"end":{"line":347,"column":105}}]},"51":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":36},"end":{"line":342,"column":82}},"locations":[{"start":{"line":342,"column":36},"end":{"line":342,"column":82}}]},"52":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":58},"end":{"line":342,"column":81}},"locations":[{"start":{"line":342,"column":58},"end":{"line":342,"column":81}}]},"53":{"type":"branch","line":342,"loc":{"start":{"line":342,"column":67},"end":{"line":342,"column":82}},"locations":[{"start":{"line":342,"column":67},"end":{"line":342,"column":82}}]},"54":{"type":"branch","line":354,"loc":{"start":{"line":354,"column":20},"end":{"line":387,"column":4}},"locations":[{"start":{"line":354,"column":20},"end":{"line":387,"column":4}}]},"55":{"type":"branch","line":357,"loc":{"start":{"line":357,"column":15},"end":{"line":357,"column":28}},"locations":[{"start":{"line":357,"column":15},"end":{"line":357,"column":28}}]},"56":{"type":"branch","line":356,"loc":{"start":{"line":356,"column":34},"end":{"line":356,"column":54}},"locations":[{"start":{"line":356,"column":34},"end":{"line":356,"column":54}}]},"57":{"type":"branch","line":362,"loc":{"start":{"line":362,"column":28},"end":{"line":372,"column":7}},"locations":[{"start":{"line":362,"column":28},"end":{"line":372,"column":7}}]},"58":{"type":"branch","line":363,"loc":{"start":{"line":363,"column":29},"end":{"line":363,"column":38}},"locations":[{"start":{"line":363,"column":29},"end":{"line":363,"column":38}}]},"59":{"type":"branch","line":368,"loc":{"start":{"line":368,"column":36},"end":{"line":370,"column":9}},"locations":[{"start":{"line":368,"column":36},"end":{"line":370,"column":9}}]},"60":{"type":"branch","line":376,"loc":{"start":{"line":376,"column":8},"end":{"line":384,"column":5}},"locations":[{"start":{"line":376,"column":8},"end":{"line":384,"column":5}}]},"61":{"type":"branch","line":381,"loc":{"start":{"line":381,"column":54},"end":{"line":381,"column":85}},"locations":[{"start":{"line":381,"column":54},"end":{"line":381,"column":85}}]},"62":{"type":"branch","line":382,"loc":{"start":{"line":382,"column":79},"end":{"line":382,"column":97}},"locations":[{"start":{"line":382,"column":79},"end":{"line":382,"column":97}}]},"63":{"type":"branch","line":377,"loc":{"start":{"line":377,"column":36},"end":{"line":377,"column":74}},"locations":[{"start":{"line":377,"column":36},"end":{"line":377,"column":74}}]},"64":{"type":"branch","line":377,"loc":{"start":{"line":377,"column":50},"end":{"line":377,"column":73}},"locations":[{"start":{"line":377,"column":50},"end":{"line":377,"column":73}}]},"65":{"type":"branch","line":377,"loc":{"start":{"line":377,"column":59},"end":{"line":377,"column":74}},"locations":[{"start":{"line":377,"column":59},"end":{"line":377,"column":74}}]},"66":{"type":"branch","line":451,"loc":{"start":{"line":451,"column":18},"end":{"line":486,"column":4}},"locations":[{"start":{"line":451,"column":18},"end":{"line":486,"column":4}}]},"67":{"type":"branch","line":454,"loc":{"start":{"line":454,"column":15},"end":{"line":454,"column":27}},"locations":[{"start":{"line":454,"column":15},"end":{"line":454,"column":27}}]},"68":{"type":"branch","line":453,"loc":{"start":{"line":453,"column":34},"end":{"line":453,"column":54}},"locations":[{"start":{"line":453,"column":34},"end":{"line":453,"column":54}}]},"69":{"type":"branch","line":476,"loc":{"start":{"line":476,"column":8},"end":{"line":483,"column":5}},"locations":[{"start":{"line":476,"column":8},"end":{"line":483,"column":5}}]},"70":{"type":"branch","line":481,"loc":{"start":{"line":481,"column":54},"end":{"line":481,"column":85}},"locations":[{"start":{"line":481,"column":54},"end":{"line":481,"column":85}}]},"71":{"type":"branch","line":477,"loc":{"start":{"line":477,"column":36},"end":{"line":477,"column":74}},"locations":[{"start":{"line":477,"column":36},"end":{"line":477,"column":74}}]},"72":{"type":"branch","line":477,"loc":{"start":{"line":477,"column":50},"end":{"line":477,"column":73}},"locations":[{"start":{"line":477,"column":50},"end":{"line":477,"column":73}}]},"73":{"type":"branch","line":477,"loc":{"start":{"line":477,"column":59},"end":{"line":477,"column":74}},"locations":[{"start":{"line":477,"column":59},"end":{"line":477,"column":74}}]},"74":{"type":"branch","line":488,"loc":{"start":{"line":488,"column":16},"end":{"line":547,"column":4}},"locations":[{"start":{"line":488,"column":16},"end":{"line":547,"column":4}}]},"75":{"type":"branch","line":491,"loc":{"start":{"line":491,"column":15},"end":{"line":491,"column":28}},"locations":[{"start":{"line":491,"column":15},"end":{"line":491,"column":28}}]},"76":{"type":"branch","line":494,"loc":{"start":{"line":494,"column":15},"end":{"line":494,"column":28}},"locations":[{"start":{"line":494,"column":15},"end":{"line":494,"column":28}}]},"77":{"type":"branch","line":508,"loc":{"start":{"line":508,"column":4},"end":{"line":513,"column":5}},"locations":[{"start":{"line":508,"column":4},"end":{"line":513,"column":5}}]},"78":{"type":"branch","line":490,"loc":{"start":{"line":490,"column":34},"end":{"line":490,"column":54}},"locations":[{"start":{"line":490,"column":34},"end":{"line":490,"column":54}}]},"79":{"type":"branch","line":493,"loc":{"start":{"line":493,"column":39},"end":{"line":493,"column":59}},"locations":[{"start":{"line":493,"column":39},"end":{"line":493,"column":59}}]},"80":{"type":"branch","line":517,"loc":{"start":{"line":517,"column":28},"end":{"line":520,"column":13}},"locations":[{"start":{"line":517,"column":28},"end":{"line":520,"column":13}}]},"81":{"type":"branch","line":519,"loc":{"start":{"line":519,"column":65},"end":{"line":520,"column":13}},"locations":[{"start":{"line":519,"column":65},"end":{"line":520,"column":13}}]},"82":{"type":"branch","line":522,"loc":{"start":{"line":522,"column":40},"end":{"line":531,"column":13}},"locations":[{"start":{"line":522,"column":40},"end":{"line":531,"column":13}}]},"83":{"type":"branch","line":530,"loc":{"start":{"line":530,"column":12},"end":{"line":531,"column":13}},"locations":[{"start":{"line":530,"column":12},"end":{"line":531,"column":13}}]},"84":{"type":"branch","line":536,"loc":{"start":{"line":536,"column":8},"end":{"line":544,"column":5}},"locations":[{"start":{"line":536,"column":8},"end":{"line":544,"column":5}}]},"85":{"type":"branch","line":541,"loc":{"start":{"line":541,"column":54},"end":{"line":541,"column":85}},"locations":[{"start":{"line":541,"column":54},"end":{"line":541,"column":85}}]},"86":{"type":"branch","line":542,"loc":{"start":{"line":542,"column":79},"end":{"line":542,"column":97}},"locations":[{"start":{"line":542,"column":79},"end":{"line":542,"column":97}}]},"87":{"type":"branch","line":537,"loc":{"start":{"line":537,"column":36},"end":{"line":537,"column":74}},"locations":[{"start":{"line":537,"column":36},"end":{"line":537,"column":74}}]},"88":{"type":"branch","line":537,"loc":{"start":{"line":537,"column":50},"end":{"line":537,"column":73}},"locations":[{"start":{"line":537,"column":50},"end":{"line":537,"column":73}}]},"89":{"type":"branch","line":537,"loc":{"start":{"line":537,"column":59},"end":{"line":537,"column":74}},"locations":[{"start":{"line":537,"column":59},"end":{"line":537,"column":74}}]},"90":{"type":"branch","line":578,"loc":{"start":{"line":578,"column":12},"end":{"line":582,"column":4}},"locations":[{"start":{"line":578,"column":12},"end":{"line":582,"column":4}}]},"91":{"type":"branch","line":579,"loc":{"start":{"line":579,"column":8},"end":{"line":581,"column":6}},"locations":[{"start":{"line":579,"column":8},"end":{"line":581,"column":6}}]},"92":{"type":"branch","line":584,"loc":{"start":{"line":584,"column":15},"end":{"line":586,"column":4}},"locations":[{"start":{"line":584,"column":15},"end":{"line":586,"column":4}}]},"93":{"type":"branch","line":589,"loc":{"start":{"line":589,"column":19},"end":{"line":591,"column":4}},"locations":[{"start":{"line":589,"column":19},"end":{"line":591,"column":4}}]},"94":{"type":"branch","line":593,"loc":{"start":{"line":593,"column":21},"end":{"line":595,"column":4}},"locations":[{"start":{"line":593,"column":21},"end":{"line":595,"column":4}}]},"95":{"type":"branch","line":597,"loc":{"start":{"line":597,"column":14},"end":{"line":599,"column":4}},"locations":[{"start":{"line":597,"column":14},"end":{"line":599,"column":4}}]},"96":{"type":"branch","line":603,"loc":{"start":{"line":603,"column":16},"end":{"line":606,"column":7}},"locations":[{"start":{"line":603,"column":16},"end":{"line":606,"column":7}}]}},"b":{"0":[22],"1":[7],"2":[0],"3":[0],"4":[1],"5":[6],"6":[6],"7":[1],"8":[6],"9":[1],"10":[1],"11":[1],"12":[8],"13":[0],"14":[7],"15":[0],"16":[8],"17":[1],"18":[0],"19":[1],"20":[0],"21":[2],"22":[1],"23":[1],"24":[0],"25":[1],"26":[0],"27":[0],"28":[3],"29":[1],"30":[0],"31":[3],"32":[1],"33":[2],"34":[1],"35":[0],"36":[4],"37":[1],"38":[1],"39":[0],"40":[4],"41":[1],"42":[3],"43":[4],"44":[0],"45":[2],"46":[2],"47":[26],"48":[4],"49":[0],"50":[0],"51":[26],"52":[4],"53":[22],"54":[1],"55":[0],"56":[6],"57":[1],"58":[0],"59":[0],"60":[1],"61":[0],"62":[0],"63":[6],"64":[1],"65":[5],"66":[2],"67":[0],"68":[15],"69":[2],"70":[0],"71":[15],"72":[2],"73":[13],"74":[1],"75":[0],"76":[0],"77":[0],"78":[8],"79":[1],"80":[1],"81":[0],"82":[1],"83":[0],"84":[1],"85":[0],"86":[0],"87":[8],"88":[1],"89":[7],"90":[2],"91":[2],"92":[1],"93":[1],"94":[1],"95":[1],"96":[36]},"fnMap":{"0":{"name":"generateId","decl":{"start":{"line":78,"column":19},"end":{"line":78,"column":84}},"loc":{"start":{"line":78,"column":19},"end":{"line":78,"column":84}},"line":78},"1":{"name":"calculateMetrics","decl":{"start":{"line":80,"column":25},"end":{"line":118,"column":2}},"loc":{"start":{"line":80,"column":25},"end":{"line":118,"column":2}},"line":80},"2":{"name":"__vite_ssr_import_0__.create.__vite_ssr_import_1__.persist.name","decl":{"start":{"line":124,"column":4},"end":{"line":600,"column":3}},"loc":{"start":{"line":124,"column":4},"end":{"line":600,"column":3}},"line":124},"3":{"name":"loadTeams","decl":{"start":{"line":136,"column":13},"end":{"line":160,"column":4}},"loc":{"start":{"line":136,"column":13},"end":{"line":160,"column":4}},"line":136},"4":{"name":"createTeam","decl":{"start":{"line":162,"column":14},"end":{"line":202,"column":4}},"loc":{"start":{"line":162,"column":14},"end":{"line":202,"column":4}},"line":162},"5":{"name":"deleteTeam","decl":{"start":{"line":204,"column":14},"end":{"line":221,"column":4}},"loc":{"start":{"line":204,"column":14},"end":{"line":221,"column":4}},"line":204},"6":{"name":"setActiveTeam","decl":{"start":{"line":223,"column":17},"end":{"line":228,"column":4}},"loc":{"start":{"line":223,"column":17},"end":{"line":228,"column":4}},"line":223},"7":{"name":"addMember","decl":{"start":{"line":231,"column":13},"end":{"line":264,"column":4}},"loc":{"start":{"line":231,"column":13},"end":{"line":264,"column":4}},"line":231},"8":{"name":"removeMember","decl":{"start":{"line":266,"column":16},"end":{"line":287,"column":4}},"loc":{"start":{"line":266,"column":16},"end":{"line":287,"column":4}},"line":266},"9":{"name":"updateMemberRole","decl":{"start":{"line":289,"column":20},"end":{"line":312,"column":4}},"loc":{"start":{"line":289,"column":20},"end":{"line":312,"column":4}},"line":289},"10":{"name":"addTask","decl":{"start":{"line":315,"column":11},"end":{"line":352,"column":4}},"loc":{"start":{"line":315,"column":11},"end":{"line":352,"column":4}},"line":315},"11":{"name":"updateTaskStatus","decl":{"start":{"line":354,"column":20},"end":{"line":387,"column":4}},"loc":{"start":{"line":354,"column":20},"end":{"line":387,"column":4}},"line":354},"12":{"name":"assignTask","decl":{"start":{"line":389,"column":14},"end":{"line":420,"column":4}},"loc":{"start":{"line":389,"column":14},"end":{"line":420,"column":4}},"line":389},"13":{"name":"submitDeliverable","decl":{"start":{"line":422,"column":21},"end":{"line":448,"column":4}},"loc":{"start":{"line":422,"column":21},"end":{"line":448,"column":4}},"line":422},"14":{"name":"startDevQALoop","decl":{"start":{"line":451,"column":18},"end":{"line":486,"column":4}},"loc":{"start":{"line":451,"column":18},"end":{"line":486,"column":4}},"line":451},"15":{"name":"submitReview","decl":{"start":{"line":488,"column":16},"end":{"line":547,"column":4}},"loc":{"start":{"line":488,"column":16},"end":{"line":547,"column":4}},"line":488},"16":{"name":"updateLoopState","decl":{"start":{"line":549,"column":19},"end":{"line":575,"column":4}},"loc":{"start":{"line":549,"column":19},"end":{"line":575,"column":4}},"line":549},"17":{"name":"addEvent","decl":{"start":{"line":578,"column":12},"end":{"line":582,"column":4}},"loc":{"start":{"line":578,"column":12},"end":{"line":582,"column":4}},"line":578},"18":{"name":"clearEvents","decl":{"start":{"line":584,"column":15},"end":{"line":586,"column":4}},"loc":{"start":{"line":584,"column":15},"end":{"line":586,"column":4}},"line":584},"19":{"name":"setSelectedTask","decl":{"start":{"line":589,"column":19},"end":{"line":591,"column":4}},"loc":{"start":{"line":589,"column":19},"end":{"line":591,"column":4}},"line":589},"20":{"name":"setSelectedMember","decl":{"start":{"line":593,"column":21},"end":{"line":595,"column":4}},"loc":{"start":{"line":593,"column":21},"end":{"line":595,"column":4}},"line":593},"21":{"name":"clearError","decl":{"start":{"line":597,"column":14},"end":{"line":599,"column":4}},"loc":{"start":{"line":597,"column":14},"end":{"line":599,"column":4}},"line":597},"22":{"name":"partialize","decl":{"start":{"line":603,"column":16},"end":{"line":606,"column":7}},"loc":{"start":{"line":603,"column":16},"end":{"line":606,"column":7}},"line":603}},"f":{"0":22,"1":7,"2":1,"3":0,"4":8,"5":1,"6":1,"7":1,"8":1,"9":0,"10":4,"11":1,"12":0,"13":0,"14":2,"15":1,"16":0,"17":2,"18":1,"19":1,"20":1,"21":1,"22":36}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\workflowBuilderStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\workflowBuilderStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":84}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":71}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":17}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":17}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":82}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":15}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":92}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":17}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":72}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":16}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":75}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":25}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":67}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":21}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":122}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":20}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":83}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":16}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":100}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":18}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":60}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":16}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":76}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":18}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":76}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":17}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":50}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":52}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":3}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":70}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":10}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":20}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":20}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":27}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":24}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":21}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":27}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":23}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":20}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":26}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":25}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":49}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":40}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":39}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":15}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":22}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":29}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":20}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":44}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":21}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":48}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":48}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":21}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":29}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":12}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":10}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":102}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":8}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":29}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":64}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":23}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":96}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":9}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":8}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":27}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":44}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":28}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":47}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":20}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":21}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":31}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":48}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":12}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":10}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":75}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":47}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":33}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":44}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":58}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":16}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":59}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":9}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":84}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":8}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":31}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":23}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":62}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":64}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":12}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":8}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":36}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":33}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":28}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":43}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":36}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":13}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":15}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":19}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":45}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":10}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":13}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":64}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":24}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":29}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":11}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":8}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":37}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":33}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":28}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":53}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":28}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":78}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":18}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":10}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":75}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":8}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":31}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":33}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":28}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":71}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":98}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":13}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":74}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":24}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":31}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":11}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":8}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":34}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":33}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":28}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":61}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":26}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":51}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":39}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":18}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":20}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":21}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":36}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":36}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":12}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":89}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":10}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":13}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":67}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":24}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":32}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":11}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":8}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":36}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":33}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":28}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":90}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":27}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":36}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":41}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":17}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":17}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":26}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":86}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":8}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":31}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":33}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":28}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":13}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":82}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":24}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":11}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":8}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":84}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":84}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":55}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":65}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":23}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":33}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":22}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":139}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":9}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":46}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":36}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":22}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":8}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":71}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":67}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":42}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":33}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":28}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":66}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":8}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":7}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":5}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":39}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":31}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":35}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":35}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":9}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":5}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":3}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":2}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":52}},"342":{"start":{"line":343,"column":0},"end":{"line":343,"column":3}},"343":{"start":{"line":344,"column":0},"end":{"line":344,"column":18}},"344":{"start":{"line":345,"column":0},"end":{"line":345,"column":19}},"345":{"start":{"line":346,"column":0},"end":{"line":346,"column":51}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":15}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":22}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":43}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":4}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":3}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":16}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":26}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":43}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":15}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":19}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":51}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":4}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":3}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":18}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":19}},"363":{"start":{"line":364,"column":0},"end":{"line":364,"column":35}},"364":{"start":{"line":365,"column":0},"end":{"line":365,"column":14}},"365":{"start":{"line":366,"column":0},"end":{"line":366,"column":19}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":52}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":4}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":3}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":26}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":33}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":52}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":15}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":19}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":39}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":4}},"378":{"start":{"line":379,"column":0},"end":{"line":379,"column":3}},"379":{"start":{"line":380,"column":0},"end":{"line":380,"column":17}},"380":{"start":{"line":381,"column":0},"end":{"line":381,"column":18}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":41}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":14}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":23}},"384":{"start":{"line":385,"column":0},"end":{"line":385,"column":56}},"385":{"start":{"line":386,"column":0},"end":{"line":386,"column":4}},"386":{"start":{"line":387,"column":0},"end":{"line":387,"column":3}},"387":{"start":{"line":388,"column":0},"end":{"line":388,"column":17}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":26}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":40}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":15}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":23}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":57}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":4}},"394":{"start":{"line":395,"column":0},"end":{"line":395,"column":3}},"395":{"start":{"line":396,"column":0},"end":{"line":396,"column":19}},"396":{"start":{"line":397,"column":0},"end":{"line":397,"column":26}},"397":{"start":{"line":398,"column":0},"end":{"line":398,"column":40}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":15}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":23}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":49}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":4}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":3}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":18}},"404":{"start":{"line":405,"column":0},"end":{"line":405,"column":19}},"405":{"start":{"line":406,"column":0},"end":{"line":406,"column":35}},"406":{"start":{"line":407,"column":0},"end":{"line":407,"column":15}},"407":{"start":{"line":408,"column":0},"end":{"line":408,"column":23}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":30}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":4}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":3}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":22}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":23}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":45}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":15}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":24}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":78}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":4}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":3}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":21}},"422":{"start":{"line":423,"column":0},"end":{"line":423,"column":22}},"423":{"start":{"line":424,"column":0},"end":{"line":424,"column":39}},"424":{"start":{"line":425,"column":0},"end":{"line":425,"column":14}},"425":{"start":{"line":426,"column":0},"end":{"line":426,"column":24}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":60}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":4}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":3}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":17}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":18}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":15}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":24}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":81}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":4}},"438":{"start":{"line":439,"column":0},"end":{"line":439,"column":3}},"439":{"start":{"line":440,"column":0},"end":{"line":440,"column":19}},"440":{"start":{"line":441,"column":0},"end":{"line":441,"column":20}},"441":{"start":{"line":442,"column":0},"end":{"line":442,"column":42}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":15}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":23}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":39}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":4}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":2}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":75}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":62}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":56}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":64}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":66}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":64}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":2}}},"s":{"0":0,"84":0,"85":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"121":0,"122":0,"123":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"164":0,"165":0,"166":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"176":0,"177":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"186":0,"187":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"216":0,"217":0,"218":0,"220":0,"221":0,"222":0,"223":0,"224":0,"226":0,"227":0,"229":0,"230":0,"231":0,"233":0,"234":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"243":0,"244":0,"245":0,"247":0,"248":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"269":0,"270":0,"271":0,"274":0,"275":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"284":0,"285":0,"287":0,"288":0,"289":0,"291":0,"292":0,"293":0,"294":0,"295":0,"298":0,"299":0,"302":0,"303":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"316":0,"317":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"340":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":13411},"end":{"line":456,"column":2}},"locations":[{"start":{"line":1,"column":13411},"end":{"line":456,"column":2}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":13411},"end":{"line":456,"column":2}},"loc":{"start":{"line":1,"column":13411},"end":{"line":456,"column":2}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\store\\workflowStore.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\store\\workflowStore.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":22}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":16}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":19}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":19}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":14}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":44}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":2}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":98}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":18}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":55}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":20}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":4}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":30}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":42}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":9}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":56}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":73}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":17}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":21}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":23}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":35}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":31}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":10}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":43}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":28}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":86}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":48}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":5}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":4}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":32}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":50}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":4}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":44}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":9}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":56}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":36}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":14}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":22}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":26}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":40}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":63}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":36}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":8}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":28}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":93}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":30}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":23}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":5}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":4}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":62}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":25}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":9}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":65}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":19}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":39}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":24}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":28}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":39}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":44}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":10}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":73}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":27}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":7}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":23}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":28}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":87}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":30}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":23}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":5}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":4}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":71}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":25}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":9}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":68}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":19}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":45}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":23}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":17}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":23}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":47}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":68}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":58}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":17}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":17}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":12}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":12}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":54}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":7}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":23}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":28}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":87}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":30}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":23}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":5}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":4}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":41}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":25}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":9}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":44}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":21}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":60}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":30}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":58}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":22}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":13}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":10}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":28}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":87}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":30}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":16}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":5}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":4}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":75}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":25}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":9}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":67}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":81}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":28}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":88}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":30}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":23}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":4}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":56}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":25}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":9}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":51}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":34}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":28}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":87}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":30}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":16}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":5}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":4}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":95}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":9}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":75}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":92}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":49}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":38}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":47}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":53}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":80}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":25}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":23}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":10}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":21}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":68}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":10}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":18}},"288":{"start":{"line":289,"column":0},"end":{"line":289,"column":13}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":16}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":5}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":4}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":21}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":25}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":4}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":16}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":22}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":4}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":4}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":81}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":10}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":40}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":50}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":31}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":14}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":18}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":46}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":8}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":6}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":48}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":66}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":72}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":54}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":70}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":84}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":86}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":4}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":1}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":63}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":82}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":69}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":1}}},"s":{"0":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"132":0,"133":0,"135":0,"136":0,"137":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"157":0,"158":0,"159":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"246":0,"247":0,"248":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"258":0,"259":0,"260":0,"261":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"293":0,"294":0,"295":0,"297":0,"298":0,"299":0,"300":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":0,"325":0,"326":0,"327":0,"333":0,"334":0,"335":0,"336":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":10273},"end":{"line":337,"column":1}},"locations":[{"start":{"line":1,"column":10273},"end":{"line":337,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":10273},"end":{"line":337,"column":1}},"loc":{"start":{"line":1,"column":10273},"end":{"line":337,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\active-learning.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\active-learning.ts","all":true,"statementMap":{"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":56}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":16}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":21}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":18}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":33}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":2}}},"s":{"81":0,"82":0,"83":0,"84":0,"85":0,"86":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1641},"end":{"line":87,"column":2}},"locations":[{"start":{"line":1,"column":1641},"end":{"line":87,"column":2}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1641},"end":{"line":87,"column":2}},"loc":{"start":{"line":1,"column":1641},"end":{"line":87,"column":2}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\agent.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\agent.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1644},"end":{"line":67,"column":1}},"locations":[{"start":{"line":1,"column":1644},"end":{"line":67,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1644},"end":{"line":67,"column":1}},"loc":{"start":{"line":1,"column":1644},"end":{"line":67,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\api-responses.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\api-responses.ts","all":true,"statementMap":{"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":41}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":10}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":25}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":19}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":39}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":1}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":39}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":18}},"284":{"start":{"line":285,"column":0},"end":{"line":285,"column":25}},"285":{"start":{"line":286,"column":0},"end":{"line":286,"column":19}},"286":{"start":{"line":287,"column":0},"end":{"line":287,"column":41}},"287":{"start":{"line":288,"column":0},"end":{"line":288,"column":1}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":43}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":13}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":16}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":15}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":18}},"309":{"start":{"line":310,"column":0},"end":{"line":310,"column":25}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":10}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":10}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":10}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":9}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":13}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":37}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":4}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":1}}},"s":{"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":7919},"end":{"line":318,"column":1}},"locations":[{"start":{"line":1,"column":7919},"end":{"line":318,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":7919},"end":{"line":318,"column":1}},"loc":{"start":{"line":1,"column":7919},"end":{"line":318,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\automation.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\automation.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":71}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":8}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":14}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":16}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":19}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":27}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":4}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":13}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":19}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":16}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":19}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":31}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":9}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":15}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":16}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":21}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":29}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":4}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":15}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":21}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":17}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":16}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":27}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":4}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":18}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":24}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":16}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":29}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":12}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":18}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":16}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":18}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":27}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":4}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":17}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":23}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":17}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":23}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":4}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":2}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":84}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":59}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":17}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":23}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":37}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":19}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":31}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":33}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":4}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":44}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":1}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":95}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":66}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":20}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":23}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":27}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":20}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":22}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":21}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":4}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":37}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":1}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":66}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":110}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":70}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":74}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":43}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":91}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":4}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":45}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":66}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":35}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":63}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":39}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":3}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":10}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":16}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":9}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":16}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":17}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":13}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":54}},"237":{"start":{"line":238,"column":0},"end":{"line":238,"column":22}},"238":{"start":{"line":239,"column":0},"end":{"line":239,"column":15}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":70}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":29}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":26}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":26}},"243":{"start":{"line":244,"column":0},"end":{"line":244,"column":30}},"244":{"start":{"line":245,"column":0},"end":{"line":245,"column":18}},"245":{"start":{"line":246,"column":0},"end":{"line":246,"column":20}},"246":{"start":{"line":247,"column":0},"end":{"line":247,"column":19}},"247":{"start":{"line":248,"column":0},"end":{"line":248,"column":4}},"248":{"start":{"line":249,"column":0},"end":{"line":249,"column":1}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":166}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":73}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":44}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":61}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":66}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":88}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":28}},"264":{"start":{"line":265,"column":0},"end":{"line":265,"column":96}},"265":{"start":{"line":266,"column":0},"end":{"line":266,"column":24}},"266":{"start":{"line":267,"column":0},"end":{"line":267,"column":89}},"267":{"start":{"line":268,"column":0},"end":{"line":268,"column":33}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":61}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":27}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":5}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":3}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":10}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":20}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":24}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":44}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":21}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":13}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":19}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":28}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":106}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":4}},"283":{"start":{"line":284,"column":0},"end":{"line":284,"column":1}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":39}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":21}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":46}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":21}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":52}},"306":{"start":{"line":307,"column":0},"end":{"line":307,"column":64}},"307":{"start":{"line":308,"column":0},"end":{"line":308,"column":42}},"308":{"start":{"line":309,"column":0},"end":{"line":309,"column":1}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":80}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":32}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":22}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":16}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":12}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":18}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":21}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":15}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":20}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":4}},"324":{"start":{"line":325,"column":0},"end":{"line":325,"column":29}},"325":{"start":{"line":326,"column":0},"end":{"line":326,"column":34}},"326":{"start":{"line":327,"column":0},"end":{"line":327,"column":29}},"327":{"start":{"line":328,"column":0},"end":{"line":328,"column":5}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":3}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":15}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":1}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":101}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":27}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":17}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":3}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":58}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":1}},"346":{"start":{"line":347,"column":0},"end":{"line":347,"column":103}},"347":{"start":{"line":348,"column":0},"end":{"line":348,"column":23}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":17}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":3}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":50}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":1}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":105}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":30}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":17}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":3}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":62}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":1}},"366":{"start":{"line":367,"column":0},"end":{"line":367,"column":97}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":22}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":17}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":3}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":41}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":22}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":11}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":53}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":57}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":4}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":1}}},"s":{"0":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"208":0,"209":0,"212":0,"213":0,"216":0,"217":0,"218":0,"221":0,"222":0,"225":0,"226":0,"227":0,"228":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"254":0,"256":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"283":0,"301":0,"302":0,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"324":0,"325":0,"326":0,"327":0,"328":0,"330":0,"331":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":9935},"end":{"line":377,"column":1}},"locations":[{"start":{"line":1,"column":9935},"end":{"line":377,"column":1}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":9935},"end":{"line":377,"column":1}},"loc":{"start":{"line":1,"column":9935},"end":{"line":377,"column":1}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\config.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\config.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":13399},"end":{"line":573,"column":1}},"locations":[{"start":{"line":1,"column":13399},"end":{"line":573,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":13399},"end":{"line":573,"column":1}},"loc":{"start":{"line":1,"column":13399},"end":{"line":573,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\errors.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\errors.ts","all":true,"statementMap":{"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":23}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":34}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":44}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":44}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":30}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":44}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":56}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":52}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":26}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":52}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":40}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":34}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":32}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":32}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":26}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":36}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":44}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":32}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":36}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":46}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":46}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":40}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":34}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":62}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":48}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":52}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":36}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":37}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":14}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":36}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":20}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":54}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":33}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":19}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":34}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":46}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":37}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":12}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":22}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":22}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":28}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":28}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":33}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":6}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":31}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":58}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":3}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":1}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":44}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":82}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":60}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":31}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":3}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":1}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":54}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":14}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":37}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":38}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":17}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":5}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":10}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":35}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":65}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":30}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":11}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":6}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":41}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":3}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":1}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":54}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":14}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":33}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":33}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":17}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":5}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":10}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":35}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":46}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":21}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":11}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":6}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":41}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":3}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":1}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":41}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":14}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":20}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":38}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":17}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":5}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":41}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":28}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":3}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":1}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":46}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":14}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":20}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":38}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":36}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":38}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":17}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":5}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":81}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":33}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":3}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":1}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":57}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":14}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":39}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":42}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":41}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":37}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":5}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":10}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":39}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":57}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":59}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":6}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":44}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":3}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":1}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":47}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":14}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":20}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":54}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":37}},"223":{"start":{"line":224,"column":0},"end":{"line":224,"column":5}},"224":{"start":{"line":225,"column":0},"end":{"line":225,"column":71}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":34}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":3}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":33}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":32}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":45}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":3}},"239":{"start":{"line":240,"column":0},"end":{"line":240,"column":47}},"240":{"start":{"line":241,"column":0},"end":{"line":241,"column":42}},"241":{"start":{"line":242,"column":0},"end":{"line":242,"column":3}},"242":{"start":{"line":243,"column":0},"end":{"line":243,"column":1}},"249":{"start":{"line":250,"column":0},"end":{"line":250,"column":49}},"250":{"start":{"line":251,"column":0},"end":{"line":251,"column":14}},"251":{"start":{"line":252,"column":0},"end":{"line":252,"column":34}},"252":{"start":{"line":253,"column":0},"end":{"line":253,"column":35}},"253":{"start":{"line":254,"column":0},"end":{"line":254,"column":19}},"254":{"start":{"line":255,"column":0},"end":{"line":255,"column":37}},"255":{"start":{"line":256,"column":0},"end":{"line":256,"column":5}},"256":{"start":{"line":257,"column":0},"end":{"line":257,"column":10}},"257":{"start":{"line":258,"column":0},"end":{"line":258,"column":30}},"258":{"start":{"line":259,"column":0},"end":{"line":259,"column":54}},"259":{"start":{"line":260,"column":0},"end":{"line":260,"column":57}},"260":{"start":{"line":261,"column":0},"end":{"line":261,"column":6}},"261":{"start":{"line":262,"column":0},"end":{"line":262,"column":36}},"262":{"start":{"line":263,"column":0},"end":{"line":263,"column":3}},"263":{"start":{"line":264,"column":0},"end":{"line":264,"column":1}},"268":{"start":{"line":269,"column":0},"end":{"line":269,"column":46}},"269":{"start":{"line":270,"column":0},"end":{"line":270,"column":14}},"270":{"start":{"line":271,"column":0},"end":{"line":271,"column":20}},"271":{"start":{"line":272,"column":0},"end":{"line":272,"column":33}},"272":{"start":{"line":273,"column":0},"end":{"line":273,"column":17}},"273":{"start":{"line":274,"column":0},"end":{"line":274,"column":5}},"274":{"start":{"line":275,"column":0},"end":{"line":275,"column":10}},"275":{"start":{"line":276,"column":0},"end":{"line":276,"column":29}},"276":{"start":{"line":277,"column":0},"end":{"line":277,"column":14}},"277":{"start":{"line":278,"column":0},"end":{"line":278,"column":38}},"278":{"start":{"line":279,"column":0},"end":{"line":279,"column":11}},"279":{"start":{"line":280,"column":0},"end":{"line":280,"column":6}},"280":{"start":{"line":281,"column":0},"end":{"line":281,"column":33}},"281":{"start":{"line":282,"column":0},"end":{"line":282,"column":3}},"282":{"start":{"line":283,"column":0},"end":{"line":283,"column":1}},"289":{"start":{"line":290,"column":0},"end":{"line":290,"column":46}},"290":{"start":{"line":291,"column":0},"end":{"line":291,"column":14}},"291":{"start":{"line":292,"column":0},"end":{"line":292,"column":20}},"292":{"start":{"line":293,"column":0},"end":{"line":293,"column":33}},"293":{"start":{"line":294,"column":0},"end":{"line":294,"column":34}},"294":{"start":{"line":295,"column":0},"end":{"line":295,"column":36}},"295":{"start":{"line":296,"column":0},"end":{"line":296,"column":17}},"296":{"start":{"line":297,"column":0},"end":{"line":297,"column":5}},"297":{"start":{"line":298,"column":0},"end":{"line":298,"column":10}},"298":{"start":{"line":299,"column":0},"end":{"line":299,"column":29}},"299":{"start":{"line":300,"column":0},"end":{"line":300,"column":14}},"300":{"start":{"line":301,"column":0},"end":{"line":301,"column":52}},"301":{"start":{"line":302,"column":0},"end":{"line":302,"column":11}},"302":{"start":{"line":303,"column":0},"end":{"line":303,"column":6}},"303":{"start":{"line":304,"column":0},"end":{"line":304,"column":33}},"304":{"start":{"line":305,"column":0},"end":{"line":305,"column":3}},"305":{"start":{"line":306,"column":0},"end":{"line":306,"column":1}},"310":{"start":{"line":311,"column":0},"end":{"line":311,"column":45}},"311":{"start":{"line":312,"column":0},"end":{"line":312,"column":14}},"312":{"start":{"line":313,"column":0},"end":{"line":313,"column":37}},"313":{"start":{"line":314,"column":0},"end":{"line":314,"column":40}},"314":{"start":{"line":315,"column":0},"end":{"line":315,"column":37}},"315":{"start":{"line":316,"column":0},"end":{"line":316,"column":5}},"316":{"start":{"line":317,"column":0},"end":{"line":317,"column":10}},"317":{"start":{"line":318,"column":0},"end":{"line":318,"column":26}},"318":{"start":{"line":319,"column":0},"end":{"line":319,"column":69}},"319":{"start":{"line":320,"column":0},"end":{"line":320,"column":42}},"320":{"start":{"line":321,"column":0},"end":{"line":321,"column":6}},"321":{"start":{"line":322,"column":0},"end":{"line":322,"column":32}},"322":{"start":{"line":323,"column":0},"end":{"line":323,"column":3}},"323":{"start":{"line":324,"column":0},"end":{"line":324,"column":1}},"328":{"start":{"line":329,"column":0},"end":{"line":329,"column":50}},"329":{"start":{"line":330,"column":0},"end":{"line":330,"column":14}},"330":{"start":{"line":331,"column":0},"end":{"line":331,"column":37}},"331":{"start":{"line":332,"column":0},"end":{"line":332,"column":40}},"332":{"start":{"line":333,"column":0},"end":{"line":333,"column":37}},"333":{"start":{"line":334,"column":0},"end":{"line":334,"column":5}},"334":{"start":{"line":335,"column":0},"end":{"line":335,"column":10}},"335":{"start":{"line":336,"column":0},"end":{"line":336,"column":31}},"336":{"start":{"line":337,"column":0},"end":{"line":337,"column":74}},"337":{"start":{"line":338,"column":0},"end":{"line":338,"column":42}},"338":{"start":{"line":339,"column":0},"end":{"line":339,"column":6}},"339":{"start":{"line":340,"column":0},"end":{"line":340,"column":37}},"340":{"start":{"line":341,"column":0},"end":{"line":341,"column":3}},"341":{"start":{"line":342,"column":0},"end":{"line":342,"column":1}},"348":{"start":{"line":349,"column":0},"end":{"line":349,"column":54}},"349":{"start":{"line":350,"column":0},"end":{"line":350,"column":14}},"350":{"start":{"line":351,"column":0},"end":{"line":351,"column":37}},"351":{"start":{"line":352,"column":0},"end":{"line":352,"column":35}},"352":{"start":{"line":353,"column":0},"end":{"line":353,"column":37}},"353":{"start":{"line":354,"column":0},"end":{"line":354,"column":37}},"354":{"start":{"line":355,"column":0},"end":{"line":355,"column":5}},"355":{"start":{"line":356,"column":0},"end":{"line":356,"column":10}},"356":{"start":{"line":357,"column":0},"end":{"line":357,"column":35}},"357":{"start":{"line":358,"column":0},"end":{"line":358,"column":80}},"358":{"start":{"line":359,"column":0},"end":{"line":359,"column":46}},"359":{"start":{"line":360,"column":0},"end":{"line":360,"column":6}},"360":{"start":{"line":361,"column":0},"end":{"line":361,"column":41}},"361":{"start":{"line":362,"column":0},"end":{"line":362,"column":3}},"362":{"start":{"line":363,"column":0},"end":{"line":363,"column":1}},"367":{"start":{"line":368,"column":0},"end":{"line":368,"column":46}},"368":{"start":{"line":369,"column":0},"end":{"line":369,"column":14}},"369":{"start":{"line":370,"column":0},"end":{"line":370,"column":20}},"370":{"start":{"line":371,"column":0},"end":{"line":371,"column":40}},"371":{"start":{"line":372,"column":0},"end":{"line":372,"column":35}},"372":{"start":{"line":373,"column":0},"end":{"line":373,"column":37}},"373":{"start":{"line":374,"column":0},"end":{"line":374,"column":5}},"374":{"start":{"line":375,"column":0},"end":{"line":375,"column":78}},"375":{"start":{"line":376,"column":0},"end":{"line":376,"column":33}},"376":{"start":{"line":377,"column":0},"end":{"line":377,"column":3}},"381":{"start":{"line":382,"column":0},"end":{"line":382,"column":23}},"382":{"start":{"line":383,"column":0},"end":{"line":383,"column":64}},"383":{"start":{"line":384,"column":0},"end":{"line":384,"column":3}},"388":{"start":{"line":389,"column":0},"end":{"line":389,"column":36}},"389":{"start":{"line":390,"column":0},"end":{"line":390,"column":38}},"390":{"start":{"line":391,"column":0},"end":{"line":391,"column":55}},"391":{"start":{"line":392,"column":0},"end":{"line":392,"column":78}},"392":{"start":{"line":393,"column":0},"end":{"line":393,"column":3}},"393":{"start":{"line":394,"column":0},"end":{"line":394,"column":1}},"398":{"start":{"line":399,"column":0},"end":{"line":399,"column":45}},"399":{"start":{"line":400,"column":0},"end":{"line":400,"column":82}},"400":{"start":{"line":401,"column":0},"end":{"line":401,"column":61}},"401":{"start":{"line":402,"column":0},"end":{"line":402,"column":32}},"402":{"start":{"line":403,"column":0},"end":{"line":403,"column":3}},"403":{"start":{"line":404,"column":0},"end":{"line":404,"column":1}},"408":{"start":{"line":409,"column":0},"end":{"line":409,"column":55}},"409":{"start":{"line":410,"column":0},"end":{"line":410,"column":14}},"410":{"start":{"line":411,"column":0},"end":{"line":411,"column":40}},"411":{"start":{"line":412,"column":0},"end":{"line":412,"column":36}},"412":{"start":{"line":413,"column":0},"end":{"line":413,"column":37}},"413":{"start":{"line":414,"column":0},"end":{"line":414,"column":5}},"414":{"start":{"line":415,"column":0},"end":{"line":415,"column":10}},"415":{"start":{"line":416,"column":0},"end":{"line":416,"column":36}},"416":{"start":{"line":417,"column":0},"end":{"line":417,"column":68}},"417":{"start":{"line":418,"column":0},"end":{"line":418,"column":41}},"418":{"start":{"line":419,"column":0},"end":{"line":419,"column":6}},"419":{"start":{"line":420,"column":0},"end":{"line":420,"column":42}},"420":{"start":{"line":421,"column":0},"end":{"line":421,"column":3}},"421":{"start":{"line":422,"column":0},"end":{"line":422,"column":1}},"426":{"start":{"line":427,"column":0},"end":{"line":427,"column":46}},"427":{"start":{"line":428,"column":0},"end":{"line":428,"column":14}},"428":{"start":{"line":429,"column":0},"end":{"line":429,"column":69}},"429":{"start":{"line":430,"column":0},"end":{"line":430,"column":20}},"430":{"start":{"line":431,"column":0},"end":{"line":431,"column":40}},"431":{"start":{"line":432,"column":0},"end":{"line":432,"column":38}},"432":{"start":{"line":433,"column":0},"end":{"line":433,"column":17}},"433":{"start":{"line":434,"column":0},"end":{"line":434,"column":5}},"434":{"start":{"line":435,"column":0},"end":{"line":435,"column":60}},"435":{"start":{"line":436,"column":0},"end":{"line":436,"column":33}},"436":{"start":{"line":437,"column":0},"end":{"line":437,"column":3}},"437":{"start":{"line":438,"column":0},"end":{"line":438,"column":1}},"442":{"start":{"line":443,"column":0},"end":{"line":443,"column":62}},"443":{"start":{"line":444,"column":0},"end":{"line":444,"column":14}},"444":{"start":{"line":445,"column":0},"end":{"line":445,"column":32}},"445":{"start":{"line":446,"column":0},"end":{"line":446,"column":40}},"446":{"start":{"line":447,"column":0},"end":{"line":447,"column":17}},"447":{"start":{"line":448,"column":0},"end":{"line":448,"column":5}},"448":{"start":{"line":449,"column":0},"end":{"line":449,"column":10}},"449":{"start":{"line":450,"column":0},"end":{"line":450,"column":36}},"450":{"start":{"line":451,"column":0},"end":{"line":451,"column":46}},"451":{"start":{"line":452,"column":0},"end":{"line":452,"column":17}},"452":{"start":{"line":453,"column":0},"end":{"line":453,"column":14}},"453":{"start":{"line":454,"column":0},"end":{"line":454,"column":11}},"454":{"start":{"line":455,"column":0},"end":{"line":455,"column":6}},"455":{"start":{"line":456,"column":0},"end":{"line":456,"column":43}},"456":{"start":{"line":457,"column":0},"end":{"line":457,"column":3}},"457":{"start":{"line":458,"column":0},"end":{"line":458,"column":1}},"462":{"start":{"line":463,"column":0},"end":{"line":463,"column":59}},"463":{"start":{"line":464,"column":0},"end":{"line":464,"column":14}},"464":{"start":{"line":465,"column":0},"end":{"line":465,"column":20}},"465":{"start":{"line":466,"column":0},"end":{"line":466,"column":41}},"466":{"start":{"line":467,"column":0},"end":{"line":467,"column":38}},"467":{"start":{"line":468,"column":0},"end":{"line":468,"column":17}},"468":{"start":{"line":469,"column":0},"end":{"line":469,"column":5}},"469":{"start":{"line":470,"column":0},"end":{"line":470,"column":10}},"470":{"start":{"line":471,"column":0},"end":{"line":471,"column":33}},"471":{"start":{"line":472,"column":0},"end":{"line":472,"column":14}},"472":{"start":{"line":473,"column":0},"end":{"line":473,"column":16}},"473":{"start":{"line":474,"column":0},"end":{"line":474,"column":67}},"474":{"start":{"line":475,"column":0},"end":{"line":475,"column":11}},"475":{"start":{"line":476,"column":0},"end":{"line":476,"column":6}},"476":{"start":{"line":477,"column":0},"end":{"line":477,"column":40}},"477":{"start":{"line":478,"column":0},"end":{"line":478,"column":3}},"478":{"start":{"line":479,"column":0},"end":{"line":479,"column":1}},"483":{"start":{"line":484,"column":0},"end":{"line":484,"column":44}},"484":{"start":{"line":485,"column":0},"end":{"line":485,"column":14}},"485":{"start":{"line":486,"column":0},"end":{"line":486,"column":74}},"486":{"start":{"line":487,"column":0},"end":{"line":487,"column":20}},"487":{"start":{"line":488,"column":0},"end":{"line":488,"column":33}},"488":{"start":{"line":489,"column":0},"end":{"line":489,"column":38}},"489":{"start":{"line":490,"column":0},"end":{"line":490,"column":17}},"490":{"start":{"line":491,"column":0},"end":{"line":491,"column":5}},"491":{"start":{"line":492,"column":0},"end":{"line":492,"column":53}},"492":{"start":{"line":493,"column":0},"end":{"line":493,"column":31}},"493":{"start":{"line":494,"column":0},"end":{"line":494,"column":3}},"494":{"start":{"line":495,"column":0},"end":{"line":495,"column":1}},"501":{"start":{"line":502,"column":0},"end":{"line":502,"column":59}},"502":{"start":{"line":503,"column":0},"end":{"line":503,"column":14}},"503":{"start":{"line":504,"column":0},"end":{"line":504,"column":37}},"504":{"start":{"line":505,"column":0},"end":{"line":505,"column":17}},"505":{"start":{"line":506,"column":0},"end":{"line":506,"column":5}},"506":{"start":{"line":507,"column":0},"end":{"line":507,"column":10}},"507":{"start":{"line":508,"column":0},"end":{"line":508,"column":44}},"508":{"start":{"line":509,"column":0},"end":{"line":509,"column":60}},"509":{"start":{"line":510,"column":0},"end":{"line":510,"column":16}},"510":{"start":{"line":511,"column":0},"end":{"line":511,"column":19}},"511":{"start":{"line":512,"column":0},"end":{"line":512,"column":11}},"512":{"start":{"line":513,"column":0},"end":{"line":513,"column":6}},"513":{"start":{"line":514,"column":0},"end":{"line":514,"column":42}},"514":{"start":{"line":515,"column":0},"end":{"line":515,"column":3}},"515":{"start":{"line":516,"column":0},"end":{"line":516,"column":1}},"522":{"start":{"line":523,"column":0},"end":{"line":523,"column":50}},"523":{"start":{"line":524,"column":0},"end":{"line":524,"column":33}},"524":{"start":{"line":525,"column":0},"end":{"line":525,"column":36}},"525":{"start":{"line":526,"column":0},"end":{"line":526,"column":70}},"527":{"start":{"line":528,"column":0},"end":{"line":528,"column":14}},"528":{"start":{"line":529,"column":0},"end":{"line":529,"column":19}},"529":{"start":{"line":530,"column":0},"end":{"line":530,"column":20}},"530":{"start":{"line":531,"column":0},"end":{"line":531,"column":15}},"536":{"start":{"line":537,"column":0},"end":{"line":537,"column":5}},"537":{"start":{"line":538,"column":0},"end":{"line":538,"column":10}},"538":{"start":{"line":539,"column":0},"end":{"line":539,"column":37}},"539":{"start":{"line":540,"column":0},"end":{"line":540,"column":106}},"540":{"start":{"line":541,"column":0},"end":{"line":541,"column":90}},"541":{"start":{"line":542,"column":0},"end":{"line":542,"column":20}},"542":{"start":{"line":543,"column":0},"end":{"line":543,"column":6}},"543":{"start":{"line":544,"column":0},"end":{"line":544,"column":37}},"544":{"start":{"line":545,"column":0},"end":{"line":545,"column":25}},"545":{"start":{"line":546,"column":0},"end":{"line":546,"column":38}},"546":{"start":{"line":547,"column":0},"end":{"line":547,"column":32}},"547":{"start":{"line":548,"column":0},"end":{"line":548,"column":3}},"548":{"start":{"line":549,"column":0},"end":{"line":549,"column":1}},"555":{"start":{"line":556,"column":0},"end":{"line":556,"column":57}},"556":{"start":{"line":557,"column":0},"end":{"line":557,"column":14}},"557":{"start":{"line":558,"column":0},"end":{"line":558,"column":35}},"558":{"start":{"line":559,"column":0},"end":{"line":559,"column":38}},"559":{"start":{"line":560,"column":0},"end":{"line":560,"column":44}},"560":{"start":{"line":561,"column":0},"end":{"line":561,"column":58}},"561":{"start":{"line":562,"column":0},"end":{"line":562,"column":37}},"562":{"start":{"line":563,"column":0},"end":{"line":563,"column":5}},"563":{"start":{"line":564,"column":0},"end":{"line":564,"column":10}},"564":{"start":{"line":565,"column":0},"end":{"line":565,"column":39}},"565":{"start":{"line":566,"column":0},"end":{"line":566,"column":89}},"566":{"start":{"line":567,"column":0},"end":{"line":567,"column":65}},"567":{"start":{"line":568,"column":0},"end":{"line":568,"column":6}},"568":{"start":{"line":569,"column":0},"end":{"line":569,"column":44}},"569":{"start":{"line":570,"column":0},"end":{"line":570,"column":3}},"570":{"start":{"line":571,"column":0},"end":{"line":571,"column":1}},"575":{"start":{"line":576,"column":0},"end":{"line":576,"column":45}},"576":{"start":{"line":577,"column":0},"end":{"line":577,"column":37}},"577":{"start":{"line":578,"column":0},"end":{"line":578,"column":40}},"578":{"start":{"line":579,"column":0},"end":{"line":579,"column":34}},"579":{"start":{"line":580,"column":0},"end":{"line":580,"column":37}},"581":{"start":{"line":582,"column":0},"end":{"line":582,"column":14}},"582":{"start":{"line":583,"column":0},"end":{"line":583,"column":23}},"583":{"start":{"line":584,"column":0},"end":{"line":584,"column":20}},"584":{"start":{"line":585,"column":0},"end":{"line":585,"column":15}},"591":{"start":{"line":592,"column":0},"end":{"line":592,"column":5}},"592":{"start":{"line":593,"column":0},"end":{"line":593,"column":10}},"593":{"start":{"line":594,"column":0},"end":{"line":594,"column":31}},"594":{"start":{"line":595,"column":0},"end":{"line":595,"column":111}},"595":{"start":{"line":596,"column":0},"end":{"line":596,"column":7}},"596":{"start":{"line":597,"column":0},"end":{"line":597,"column":19}},"597":{"start":{"line":598,"column":0},"end":{"line":598,"column":44}},"598":{"start":{"line":599,"column":0},"end":{"line":599,"column":32}},"599":{"start":{"line":600,"column":0},"end":{"line":600,"column":38}},"600":{"start":{"line":601,"column":0},"end":{"line":601,"column":28}},"601":{"start":{"line":602,"column":0},"end":{"line":602,"column":8}},"602":{"start":{"line":603,"column":0},"end":{"line":603,"column":20}},"603":{"start":{"line":604,"column":0},"end":{"line":604,"column":6}},"604":{"start":{"line":605,"column":0},"end":{"line":605,"column":32}},"605":{"start":{"line":606,"column":0},"end":{"line":606,"column":33}},"606":{"start":{"line":607,"column":0},"end":{"line":607,"column":46}},"607":{"start":{"line":608,"column":0},"end":{"line":608,"column":34}},"608":{"start":{"line":609,"column":0},"end":{"line":609,"column":40}},"609":{"start":{"line":610,"column":0},"end":{"line":610,"column":3}},"610":{"start":{"line":611,"column":0},"end":{"line":611,"column":1}},"617":{"start":{"line":618,"column":0},"end":{"line":618,"column":63}},"618":{"start":{"line":619,"column":0},"end":{"line":619,"column":35}},"619":{"start":{"line":620,"column":0},"end":{"line":620,"column":1}},"624":{"start":{"line":625,"column":0},"end":{"line":625,"column":71}},"625":{"start":{"line":626,"column":0},"end":{"line":626,"column":39}},"626":{"start":{"line":627,"column":0},"end":{"line":627,"column":1}},"631":{"start":{"line":632,"column":0},"end":{"line":632,"column":65}},"632":{"start":{"line":633,"column":0},"end":{"line":633,"column":36}},"633":{"start":{"line":634,"column":0},"end":{"line":634,"column":1}},"638":{"start":{"line":639,"column":0},"end":{"line":639,"column":75}},"639":{"start":{"line":640,"column":0},"end":{"line":640,"column":41}},"640":{"start":{"line":641,"column":0},"end":{"line":641,"column":1}},"645":{"start":{"line":646,"column":0},"end":{"line":646,"column":77}},"646":{"start":{"line":647,"column":0},"end":{"line":647,"column":42}},"647":{"start":{"line":648,"column":0},"end":{"line":648,"column":1}},"652":{"start":{"line":653,"column":0},"end":{"line":653,"column":73}},"653":{"start":{"line":654,"column":0},"end":{"line":654,"column":40}},"654":{"start":{"line":655,"column":0},"end":{"line":655,"column":1}},"659":{"start":{"line":660,"column":0},"end":{"line":660,"column":75}},"660":{"start":{"line":661,"column":0},"end":{"line":661,"column":41}},"661":{"start":{"line":662,"column":0},"end":{"line":662,"column":1}},"666":{"start":{"line":667,"column":0},"end":{"line":667,"column":75}},"667":{"start":{"line":668,"column":0},"end":{"line":668,"column":41}},"668":{"start":{"line":669,"column":0},"end":{"line":669,"column":1}},"673":{"start":{"line":674,"column":0},"end":{"line":674,"column":71}},"674":{"start":{"line":675,"column":0},"end":{"line":675,"column":39}},"675":{"start":{"line":676,"column":0},"end":{"line":676,"column":1}},"680":{"start":{"line":681,"column":0},"end":{"line":681,"column":83}},"681":{"start":{"line":682,"column":0},"end":{"line":682,"column":45}},"682":{"start":{"line":683,"column":0},"end":{"line":683,"column":1}},"687":{"start":{"line":688,"column":0},"end":{"line":688,"column":73}},"688":{"start":{"line":689,"column":0},"end":{"line":689,"column":40}},"689":{"start":{"line":690,"column":0},"end":{"line":690,"column":1}},"694":{"start":{"line":695,"column":0},"end":{"line":695,"column":82}},"695":{"start":{"line":696,"column":0},"end":{"line":696,"column":50}},"696":{"start":{"line":697,"column":0},"end":{"line":697,"column":1}},"701":{"start":{"line":702,"column":0},"end":{"line":702,"column":59}},"702":{"start":{"line":703,"column":0},"end":{"line":703,"column":39}},"704":{"start":{"line":705,"column":0},"end":{"line":705,"column":39}},"705":{"start":{"line":706,"column":0},"end":{"line":706,"column":28}},"706":{"start":{"line":707,"column":0},"end":{"line":707,"column":33}},"707":{"start":{"line":708,"column":0},"end":{"line":708,"column":33}},"708":{"start":{"line":709,"column":0},"end":{"line":709,"column":34}},"709":{"start":{"line":710,"column":0},"end":{"line":710,"column":27}},"710":{"start":{"line":711,"column":0},"end":{"line":711,"column":34}},"711":{"start":{"line":712,"column":0},"end":{"line":712,"column":4}},"713":{"start":{"line":714,"column":0},"end":{"line":714,"column":45}},"714":{"start":{"line":715,"column":0},"end":{"line":715,"column":1}},"723":{"start":{"line":724,"column":0},"end":{"line":724,"column":54}},"724":{"start":{"line":725,"column":0},"end":{"line":725,"column":38}},"726":{"start":{"line":727,"column":0},"end":{"line":727,"column":31}},"727":{"start":{"line":728,"column":0},"end":{"line":728,"column":83}},"728":{"start":{"line":729,"column":0},"end":{"line":729,"column":3}},"730":{"start":{"line":731,"column":0},"end":{"line":731,"column":34}},"731":{"start":{"line":732,"column":0},"end":{"line":732,"column":57}},"732":{"start":{"line":733,"column":0},"end":{"line":733,"column":3}},"734":{"start":{"line":735,"column":0},"end":{"line":735,"column":63}},"735":{"start":{"line":736,"column":0},"end":{"line":736,"column":1}},"740":{"start":{"line":741,"column":0},"end":{"line":741,"column":57}},"741":{"start":{"line":742,"column":0},"end":{"line":742,"column":46}},"742":{"start":{"line":743,"column":0},"end":{"line":743,"column":51}},"743":{"start":{"line":744,"column":0},"end":{"line":744,"column":46}},"744":{"start":{"line":745,"column":0},"end":{"line":745,"column":23}},"745":{"start":{"line":746,"column":0},"end":{"line":746,"column":1}},"750":{"start":{"line":751,"column":0},"end":{"line":751,"column":46}},"751":{"start":{"line":752,"column":0},"end":{"line":752,"column":21}},"752":{"start":{"line":753,"column":0},"end":{"line":753,"column":43}},"753":{"start":{"line":754,"column":0},"end":{"line":754,"column":22}},"754":{"start":{"line":755,"column":0},"end":{"line":755,"column":37}},"757":{"start":{"line":758,"column":0},"end":{"line":758,"column":56}},"758":{"start":{"line":759,"column":0},"end":{"line":759,"column":36}},"760":{"start":{"line":761,"column":0},"end":{"line":761,"column":7}},"761":{"start":{"line":762,"column":0},"end":{"line":762,"column":39}},"762":{"start":{"line":763,"column":0},"end":{"line":763,"column":15}},"763":{"start":{"line":764,"column":0},"end":{"line":764,"column":11}},"764":{"start":{"line":765,"column":0},"end":{"line":765,"column":40}},"765":{"start":{"line":766,"column":0},"end":{"line":766,"column":72}},"766":{"start":{"line":767,"column":0},"end":{"line":767,"column":62}},"767":{"start":{"line":768,"column":0},"end":{"line":768,"column":15}},"768":{"start":{"line":769,"column":0},"end":{"line":769,"column":64}},"769":{"start":{"line":770,"column":0},"end":{"line":770,"column":7}},"770":{"start":{"line":771,"column":0},"end":{"line":771,"column":5}},"771":{"start":{"line":772,"column":0},"end":{"line":772,"column":11}},"773":{"start":{"line":774,"column":0},"end":{"line":774,"column":3}},"776":{"start":{"line":777,"column":0},"end":{"line":777,"column":23}},"777":{"start":{"line":778,"column":0},"end":{"line":778,"column":13}},"778":{"start":{"line":779,"column":0},"end":{"line":779,"column":72}},"779":{"start":{"line":780,"column":0},"end":{"line":780,"column":13}},"780":{"start":{"line":781,"column":0},"end":{"line":781,"column":78}},"781":{"start":{"line":782,"column":0},"end":{"line":782,"column":13}},"782":{"start":{"line":783,"column":0},"end":{"line":783,"column":82}},"783":{"start":{"line":784,"column":0},"end":{"line":784,"column":13}},"784":{"start":{"line":785,"column":0},"end":{"line":785,"column":68}},"785":{"start":{"line":786,"column":0},"end":{"line":786,"column":13}},"786":{"start":{"line":787,"column":0},"end":{"line":787,"column":73}},"787":{"start":{"line":788,"column":0},"end":{"line":788,"column":15}},"788":{"start":{"line":789,"column":0},"end":{"line":789,"column":61}},"789":{"start":{"line":790,"column":0},"end":{"line":790,"column":32}},"790":{"start":{"line":791,"column":0},"end":{"line":791,"column":21}},"791":{"start":{"line":792,"column":0},"end":{"line":792,"column":65}},"792":{"start":{"line":793,"column":0},"end":{"line":793,"column":18}},"793":{"start":{"line":794,"column":0},"end":{"line":794,"column":20}},"794":{"start":{"line":795,"column":0},"end":{"line":795,"column":8}},"795":{"start":{"line":796,"column":0},"end":{"line":796,"column":5}},"796":{"start":{"line":797,"column":0},"end":{"line":797,"column":13}},"797":{"start":{"line":798,"column":0},"end":{"line":798,"column":59}},"798":{"start":{"line":799,"column":0},"end":{"line":799,"column":13}},"799":{"start":{"line":800,"column":0},"end":{"line":800,"column":80}},"800":{"start":{"line":801,"column":0},"end":{"line":801,"column":12}},"801":{"start":{"line":802,"column":0},"end":{"line":802,"column":67}},"802":{"start":{"line":803,"column":0},"end":{"line":803,"column":19}},"803":{"start":{"line":804,"column":0},"end":{"line":804,"column":24}},"804":{"start":{"line":805,"column":0},"end":{"line":805,"column":9}},"805":{"start":{"line":806,"column":0},"end":{"line":806,"column":3}},"806":{"start":{"line":807,"column":0},"end":{"line":807,"column":1}},"811":{"start":{"line":812,"column":0},"end":{"line":812,"column":102}},"812":{"start":{"line":813,"column":0},"end":{"line":813,"column":48}},"813":{"start":{"line":814,"column":0},"end":{"line":814,"column":27}},"814":{"start":{"line":815,"column":0},"end":{"line":815,"column":23}},"815":{"start":{"line":816,"column":0},"end":{"line":816,"column":27}},"816":{"start":{"line":817,"column":0},"end":{"line":817,"column":29}},"817":{"start":{"line":818,"column":0},"end":{"line":818,"column":31}},"818":{"start":{"line":819,"column":0},"end":{"line":819,"column":29}},"819":{"start":{"line":820,"column":0},"end":{"line":820,"column":39}},"820":{"start":{"line":821,"column":0},"end":{"line":821,"column":29}},"821":{"start":{"line":822,"column":0},"end":{"line":822,"column":28}},"822":{"start":{"line":823,"column":0},"end":{"line":823,"column":40}},"823":{"start":{"line":824,"column":0},"end":{"line":824,"column":34}},"824":{"start":{"line":825,"column":0},"end":{"line":825,"column":28}},"825":{"start":{"line":826,"column":0},"end":{"line":826,"column":28}},"826":{"start":{"line":827,"column":0},"end":{"line":827,"column":24}},"827":{"start":{"line":828,"column":0},"end":{"line":828,"column":34}},"828":{"start":{"line":829,"column":0},"end":{"line":829,"column":4}},"830":{"start":{"line":831,"column":0},"end":{"line":831,"column":78}},"831":{"start":{"line":832,"column":0},"end":{"line":832,"column":68}},"833":{"start":{"line":834,"column":0},"end":{"line":834,"column":38}},"834":{"start":{"line":835,"column":0},"end":{"line":835,"column":21}},"835":{"start":{"line":836,"column":0},"end":{"line":836,"column":15}},"836":{"start":{"line":837,"column":0},"end":{"line":837,"column":60}},"837":{"start":{"line":838,"column":0},"end":{"line":838,"column":4}},"838":{"start":{"line":839,"column":0},"end":{"line":839,"column":1}}},"s":{"12":0,"14":0,"15":0,"16":0,"19":0,"20":0,"21":0,"22":0,"25":0,"26":0,"29":0,"30":0,"31":0,"32":0,"35":0,"36":0,"37":0,"40":0,"43":0,"44":0,"47":0,"48":0,"51":0,"52":0,"55":0,"56":0,"57":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"77":0,"78":0,"79":0,"80":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"98":0,"99":0,"100":0,"101":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"158":0,"159":0,"160":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"231":0,"232":0,"233":0,"234":0,"239":0,"240":0,"241":0,"242":0,"249":0,"250":0,"251":0,"252":0,"253":0,"254":0,"255":0,"256":0,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"281":0,"282":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":0,"303":0,"304":0,"305":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"341":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":0,"381":0,"382":0,"383":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"522":0,"523":0,"524":0,"525":0,"527":0,"528":0,"529":0,"530":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":0,"545":0,"546":0,"547":0,"548":0,"555":0,"556":0,"557":0,"558":0,"559":0,"560":0,"561":0,"562":0,"563":0,"564":0,"565":0,"566":0,"567":0,"568":0,"569":0,"570":0,"575":0,"576":0,"577":0,"578":0,"579":0,"581":0,"582":0,"583":0,"584":0,"591":0,"592":0,"593":0,"594":0,"595":0,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"617":0,"618":0,"619":0,"624":0,"625":0,"626":0,"631":0,"632":0,"633":0,"638":0,"639":0,"640":0,"645":0,"646":0,"647":0,"652":0,"653":0,"654":0,"659":0,"660":0,"661":0,"666":0,"667":0,"668":0,"673":0,"674":0,"675":0,"680":0,"681":0,"682":0,"687":0,"688":0,"689":0,"694":0,"695":0,"696":0,"701":0,"702":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"713":0,"714":0,"723":0,"724":0,"726":0,"727":0,"728":0,"730":0,"731":0,"732":0,"734":0,"735":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"750":0,"751":0,"752":0,"753":0,"754":0,"757":0,"758":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"773":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":0,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":0,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"811":0,"812":0,"813":0,"814":0,"815":0,"816":0,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"830":0,"831":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":264},"end":{"line":839,"column":-493}},"locations":[{"start":{"line":1,"column":264},"end":{"line":839,"column":-493}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":264},"end":{"line":839,"column":-493}},"loc":{"start":{"line":1,"column":264},"end":{"line":839,"column":-493}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\hands.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\hands.ts","all":true,"statementMap":{"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":99}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":3}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":15}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":22}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":42}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":18}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":17}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":97}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":88}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":39}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":41}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":39}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":31}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":94}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":92}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":6}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":4}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":3}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":15}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":22}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":37}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":21}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":17}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":81}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":49}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":53}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":44}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":10}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":96}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":96}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":6}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":4}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":3}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":20}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":27}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":41}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":21}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":17}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":96}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":99}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":88}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":41}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":39}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":42}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":32}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":99}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":6}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":4}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":3}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":20}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":27}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":43}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":23}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":17}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":99}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":80}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":47}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":51}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":47}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":10}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":75}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":6}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":4}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":3}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":21}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":28}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":42}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":19}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":17}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":96}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":81}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":44}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":43}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":41}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":34}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":93}},"172":{"start":{"line":173,"column":0},"end":{"line":173,"column":6}},"173":{"start":{"line":174,"column":0},"end":{"line":174,"column":4}},"174":{"start":{"line":175,"column":0},"end":{"line":175,"column":3}},"175":{"start":{"line":176,"column":0},"end":{"line":176,"column":18}},"176":{"start":{"line":177,"column":0},"end":{"line":177,"column":24}},"177":{"start":{"line":178,"column":0},"end":{"line":178,"column":47}},"178":{"start":{"line":179,"column":0},"end":{"line":179,"column":20}},"179":{"start":{"line":180,"column":0},"end":{"line":180,"column":17}},"180":{"start":{"line":181,"column":0},"end":{"line":181,"column":81}},"181":{"start":{"line":182,"column":0},"end":{"line":182,"column":41}},"182":{"start":{"line":183,"column":0},"end":{"line":183,"column":43}},"183":{"start":{"line":184,"column":0},"end":{"line":184,"column":44}},"184":{"start":{"line":185,"column":0},"end":{"line":185,"column":49}},"185":{"start":{"line":186,"column":0},"end":{"line":186,"column":10}},"186":{"start":{"line":187,"column":0},"end":{"line":187,"column":101}},"187":{"start":{"line":188,"column":0},"end":{"line":188,"column":99}},"188":{"start":{"line":189,"column":0},"end":{"line":189,"column":6}},"189":{"start":{"line":190,"column":0},"end":{"line":190,"column":4}},"190":{"start":{"line":191,"column":0},"end":{"line":191,"column":3}},"191":{"start":{"line":192,"column":0},"end":{"line":192,"column":18}},"192":{"start":{"line":193,"column":0},"end":{"line":193,"column":27}},"193":{"start":{"line":194,"column":0},"end":{"line":194,"column":46}},"194":{"start":{"line":195,"column":0},"end":{"line":195,"column":18}},"195":{"start":{"line":196,"column":0},"end":{"line":196,"column":17}},"196":{"start":{"line":197,"column":0},"end":{"line":197,"column":103}},"197":{"start":{"line":198,"column":0},"end":{"line":198,"column":100}},"198":{"start":{"line":199,"column":0},"end":{"line":199,"column":96}},"199":{"start":{"line":200,"column":0},"end":{"line":200,"column":96}},"200":{"start":{"line":201,"column":0},"end":{"line":201,"column":6}},"201":{"start":{"line":202,"column":0},"end":{"line":202,"column":4}},"202":{"start":{"line":203,"column":0},"end":{"line":203,"column":3}},"203":{"start":{"line":204,"column":0},"end":{"line":204,"column":17}},"204":{"start":{"line":205,"column":0},"end":{"line":205,"column":24}},"205":{"start":{"line":206,"column":0},"end":{"line":206,"column":52}},"206":{"start":{"line":207,"column":0},"end":{"line":207,"column":23}},"207":{"start":{"line":208,"column":0},"end":{"line":208,"column":17}},"208":{"start":{"line":209,"column":0},"end":{"line":209,"column":96}},"209":{"start":{"line":210,"column":0},"end":{"line":210,"column":88}},"210":{"start":{"line":211,"column":0},"end":{"line":211,"column":46}},"211":{"start":{"line":212,"column":0},"end":{"line":212,"column":49}},"212":{"start":{"line":213,"column":0},"end":{"line":213,"column":46}},"213":{"start":{"line":214,"column":0},"end":{"line":214,"column":37}},"214":{"start":{"line":215,"column":0},"end":{"line":215,"column":85}},"215":{"start":{"line":216,"column":0},"end":{"line":216,"column":38}},"216":{"start":{"line":217,"column":0},"end":{"line":217,"column":38}},"217":{"start":{"line":218,"column":0},"end":{"line":218,"column":37}},"218":{"start":{"line":219,"column":0},"end":{"line":219,"column":37}},"219":{"start":{"line":220,"column":0},"end":{"line":220,"column":30}},"220":{"start":{"line":221,"column":0},"end":{"line":221,"column":6}},"221":{"start":{"line":222,"column":0},"end":{"line":222,"column":4}},"222":{"start":{"line":223,"column":0},"end":{"line":223,"column":2}},"225":{"start":{"line":226,"column":0},"end":{"line":226,"column":64}},"226":{"start":{"line":227,"column":0},"end":{"line":227,"column":43}},"227":{"start":{"line":228,"column":0},"end":{"line":228,"column":19}},"228":{"start":{"line":229,"column":0},"end":{"line":229,"column":25}},"229":{"start":{"line":230,"column":0},"end":{"line":230,"column":25}},"230":{"start":{"line":231,"column":0},"end":{"line":231,"column":29}},"231":{"start":{"line":232,"column":0},"end":{"line":232,"column":21}},"232":{"start":{"line":233,"column":0},"end":{"line":233,"column":23}},"233":{"start":{"line":234,"column":0},"end":{"line":234,"column":19}},"234":{"start":{"line":235,"column":0},"end":{"line":235,"column":4}},"235":{"start":{"line":236,"column":0},"end":{"line":236,"column":36}},"236":{"start":{"line":237,"column":0},"end":{"line":237,"column":1}}},"s":{"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":8000},"end":{"line":237,"column":1}},"locations":[{"start":{"line":1,"column":8000},"end":{"line":237,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":8000},"end":{"line":237,"column":1}},"loc":{"start":{"line":1,"column":8000},"end":{"line":237,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\index.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\index.ts","all":true,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}}},"s":{"0":0},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3499},"end":{"line":179,"column":22}},"locations":[{"start":{"line":1,"column":3499},"end":{"line":179,"column":22}}]}},"b":{"0":[0]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3499},"end":{"line":179,"column":22}},"loc":{"start":{"line":1,"column":3499},"end":{"line":179,"column":22}},"line":1}},"f":{"0":0}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\session.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\session.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":2570},"end":{"line":107,"column":1}},"locations":[{"start":{"line":1,"column":2570},"end":{"line":107,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":2570},"end":{"line":107,"column":1}},"loc":{"start":{"line":1,"column":2570},"end":{"line":107,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\settings.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\settings.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":3095},"end":{"line":129,"column":1}},"locations":[{"start":{"line":1,"column":3095},"end":{"line":129,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":3095},"end":{"line":129,"column":1}},"loc":{"start":{"line":1,"column":3095},"end":{"line":129,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\skill-market.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\skill-market.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":1177},"end":{"line":73,"column":1}},"locations":[{"start":{"line":1,"column":1177},"end":{"line":73,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":1177},"end":{"line":73,"column":1}},"loc":{"start":{"line":1,"column":1177},"end":{"line":73,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\team.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\team.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":7396},"end":{"line":296,"column":1}},"locations":[{"start":{"line":1,"column":7396},"end":{"line":296,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":7396},"end":{"line":296,"column":1}},"loc":{"start":{"line":1,"column":7396},"end":{"line":296,"column":1}},"line":1}},"f":{"0":1}} +,"G:\\ZClaw_openfang\\desktop\\src\\types\\workflow.ts": {"path":"G:\\ZClaw_openfang\\desktop\\src\\types\\workflow.ts","all":true,"statementMap":{},"s":{},"branchMap":{"0":{"type":"branch","line":1,"loc":{"start":{"line":1,"column":5629},"end":{"line":212,"column":1}},"locations":[{"start":{"line":1,"column":5629},"end":{"line":212,"column":1}}]}},"b":{"0":[1]},"fnMap":{"0":{"name":"(empty-report)","decl":{"start":{"line":1,"column":5629},"end":{"line":212,"column":1}},"loc":{"start":{"line":1,"column":5629},"end":{"line":212,"column":1}},"line":1}},"f":{"0":1}} +} diff --git a/desktop/coverage/favicon.png b/desktop/coverage/favicon.png new file mode 100644 index 0000000..c1525b8 Binary files /dev/null and b/desktop/coverage/favicon.png differ diff --git a/desktop/coverage/index.html b/desktop/coverage/index.html new file mode 100644 index 0000000..6534ae2 --- /dev/null +++ b/desktop/coverage/index.html @@ -0,0 +1,476 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 5.52% + Statements + 2451/44332 +
+ + +
+ 58.92% + Branches + 439/745 +
+ + +
+ 28.61% + Functions + 192/671 +
+ + +
+ 5.52% + Lines + 2451/44332 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
dist/assets +
+
0%0/3640%0/10%0/10%0/364
scripts +
+
0%0/17340%0/70%0/70%0/1734
src +
+
0%0/3770%0/10%0/10%0/377
src-tauri/target/debug/build/desktop-db285a9d1e393983/out +
+
0%0/10%0/10%0/10%0/1
src/components +
+
0%0/157610%0/510%0/510%0/15761
src/components/Automation +
+
0%0/16720%0/80%0/80%0/1672
src/components/BrowserHand +
+
0%0/5770%0/40%0/40%0/577
src/components/BrowserHand/templates +
+
0%0/132480%4/580%4/50%0/1324
src/components/Feedback +
+
0%0/4840%0/50%0/50%0/484
src/components/Settings +
+
0%0/18920%0/120%0/120%0/1892
src/components/SkillMarket +
+
0%0/1370%0/10%0/10%0/137
src/components/WorkflowBuilder +
+
0%0/6330%0/50%0/50%0/633
src/components/WorkflowBuilder/nodes +
+
0%0/3700%0/90%0/90%0/370
src/components/ui +
+
0%0/11750%0/120%0/120%0/1175
src/constants +
+
37.76%54/14366.66%2/340%2/537.76%54/143
src/domains/chat +
+
0%0/17725%1/425%1/40%0/177
src/domains/hands +
+
0%0/25020%1/520%1/50%0/250
src/domains/intelligence +
+
0%0/56940%2/540%2/50%0/569
src/hooks +
+
0%0/1710%0/20%0/20%0/171
src/lib +
+
16.84%1711/1015974.48%289/38832.55%125/38416.84%1711/10159
src/lib/__tests__ +
+
0%0/2560%0/10%0/10%0/256
src/lib/workflow-builder +
+
0%0/62033.33%1/333.33%1/30%0/620
src/shared +
+
0%0/6266.66%2/366.66%2/30%0/62
src/store +
+
15.17%686/452164.28%126/19634.67%43/12415.17%686/4521
src/types +
+
0%0/90384.61%11/1384.61%11/130%0/903
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/prettify.css b/desktop/coverage/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/desktop/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/desktop/coverage/prettify.js b/desktop/coverage/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/desktop/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/desktop/coverage/scripts/download-openfang.ts.html b/desktop/coverage/scripts/download-openfang.ts.html new file mode 100644 index 0000000..f5c7384 --- /dev/null +++ b/desktop/coverage/scripts/download-openfang.ts.html @@ -0,0 +1,535 @@ + + + + + + Code coverage report for scripts/download-openfang.ts + + + + + + + + + +
+
+

All files / scripts download-openfang.ts

+
+ +
+ 0% + Statements + 0/109 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+/**
+ * OpenFang Binary Downloader
+ * Automatically downloads the correct OpenFang binary for the current platform
+ * Run during Tauri build process
+ */
+ 
+import { execSync } from 'child_process';
+import { existsSync, mkdirSync, writeFileSync, renameSync } from 'fs';
+import { join, dirname } from 'path';
+import { fileURLToPath } from 'url';
+import { platform, arch } from 'os';
+ 
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const RESOURCES_DIR = join(__dirname, '../src-tauri/resources/openfang-runtime');
+ 
+// OpenFang release info
+const OPENFANG_REPO = 'RightNow-AI/openfang';
+const OPENFANG_VERSION = process.env.OPENFANG_VERSION || 'latest';
+ 
+interface PlatformConfig {
+  binaryName: string;
+  downloadName: string;
+}
+ 
+function getPlatformConfig(): PlatformConfig {
+  const currentPlatform = platform();
+  const currentArch = arch();
+ 
+  switch (currentPlatform) {
+    case 'win32':
+      return {
+        binaryName: 'openfang.exe',
+        downloadName: currentArch === 'x64'
+          ? 'openfang-x86_64-pc-windows-msvc.exe'
+          : 'openfang-aarch64-pc-windows-msvc.exe',
+      };
+    case 'darwin':
+      return {
+        binaryName: currentArch === 'arm64'
+          ? 'openfang-aarch64-apple-darwin'
+          : 'openfang-x86_64-apple-darwin',
+        downloadName: currentArch === 'arm64'
+          ? 'openfang-aarch64-apple-darwin'
+          : 'openfang-x86_64-apple-darwin',
+      };
+    case 'linux':
+      return {
+        binaryName: currentArch === 'arm64'
+          ? 'openfang-aarch64-unknown-linux-gnu'
+          : 'openfang-x86_64-unknown-linux-gnu',
+        downloadName: currentArch === 'arm64'
+          ? 'openfang-aarch64-unknown-linux-gnu'
+          : 'openfang-x86_64-unknown-linux-gnu',
+      };
+    default:
+      throw new Error(`Unsupported platform: ${currentPlatform}`);
+  }
+}
+ 
+function downloadBinary(): void {
+  const config = getPlatformConfig();
+  const baseUrl = `https://github.com/${OPENFANG_REPO}/releases`;
+  const downloadUrl = OPENFANG_VERSION === 'latest'
+    ? `${baseUrl}/latest/download/${config.downloadName}`
+    : `${baseUrl}/download/${OPENFANG_VERSION}/${config.downloadName}`;
+ 
+  const outputPath = join(RESOURCES_DIR, config.binaryName);
+ 
+  console.log('='.repeat(60));
+  console.log('OpenFang Binary Downloader');
+  console.log('='.repeat(60));
+  console.log(`Platform: ${platform()} (${arch()})`);
+  console.log(`Binary: ${config.binaryName}`);
+  console.log(`Version: ${OPENFANG_VERSION}`);
+  console.log(`URL: ${downloadUrl}`);
+  console.log('='.repeat(60));
+ 
+  // Ensure directory exists
+  if (!existsSync(RESOURCES_DIR)) {
+    mkdirSync(RESOURCES_DIR, { recursive: true });
+  }
+ 
+  // Check if already downloaded
+  if (existsSync(outputPath)) {
+    console.log('✓ Binary already exists, skipping download.');
+    return;
+  }
+ 
+  // Download using curl (cross-platform via Node.js)
+  console.log('Downloading...');
+ 
+  try {
+    // Use curl for download (available on all platforms with Git/WSL)
+    const tempPath = `${outputPath}.tmp`;
+ 
+    if (platform() === 'win32') {
+      // Windows: use PowerShell
+      execSync(
+        `powershell -Command "Invoke-WebRequest -Uri '${downloadUrl}' -OutFile '${tempPath}'"`,
+        { stdio: 'inherit' }
+      );
+    } else {
+      // Unix: use curl
+      execSync(`curl -fsSL -o "${tempPath}" "${downloadUrl}"`, { stdio: 'inherit' });
+    }
+ 
+    // Rename temp file to final name
+    renameSync(tempPath, outputPath);
+ 
+    // Make executable on Unix
+    if (platform() !== 'win32') {
+      execSync(`chmod +x "${outputPath}"`);
+    }
+ 
+    console.log('✓ Download complete!');
+  } catch (error) {
+    console.error('✗ Download failed:', error);
+    console.log('\nPlease download manually from:');
+    console.log(`  ${baseUrl}/${OPENFANG_VERSION === 'latest' ? 'latest' : 'tag/' + OPENFANG_VERSION}`);
+    process.exit(1);
+  }
+}
+ 
+function updateManifest(): void {
+  const manifestPath = join(RESOURCES_DIR, 'runtime-manifest.json');
+ 
+  const manifest = {
+    source: {
+      binPath: platform() === 'win32' ? 'openfang.exe' : `openfang-${arch()}-${platform()}`,
+    },
+    stagedAt: new Date().toISOString(),
+    version: OPENFANG_VERSION === 'latest' ? new Date().toISOString().split('T')[0].replace(/-/g, '.') : OPENFANG_VERSION,
+    runtimeType: 'openfang',
+    description: 'OpenFang Agent OS - Single binary runtime (~32MB)',
+    endpoints: {
+      websocket: 'ws://127.0.0.1:4200/ws',
+      rest: 'http://127.0.0.1:4200/api',
+    },
+  };
+ 
+  writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
+  console.log('✓ Manifest updated');
+}
+ 
+// Run
+downloadBinary();
+updateManifest();
+ 
+console.log('\n✓ OpenFang runtime ready for build!');
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/index.html b/desktop/coverage/scripts/index.html new file mode 100644 index 0000000..2607c92 --- /dev/null +++ b/desktop/coverage/scripts/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for scripts + + + + + + + + + +
+
+

All files scripts

+
+ +
+ 0% + Statements + 0/1734 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 0% + Lines + 0/1734 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
download-openfang.ts +
+
0%0/1090%0/10%0/10%0/109
prepare-openclaw-runtime.mjs +
+
0%0/1670%0/10%0/10%0/167
prepare-openfang-runtime.mjs +
+
0%0/4230%0/10%0/10%0/423
preseed-tauri-tools.mjs +
+
0%0/2960%0/10%0/10%0/296
tauri-build-bundled.mjs +
+
0%0/400%0/10%0/10%0/40
test-api-connection.mjs +
+
0%0/5950%0/10%0/10%0/595
test-toml-parsing.mjs +
+
0%0/1040%0/10%0/10%0/104
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/prepare-openclaw-runtime.mjs.html b/desktop/coverage/scripts/prepare-openclaw-runtime.mjs.html new file mode 100644 index 0000000..6df8db1 --- /dev/null +++ b/desktop/coverage/scripts/prepare-openclaw-runtime.mjs.html @@ -0,0 +1,586 @@ + + + + + + Code coverage report for scripts/prepare-openclaw-runtime.mjs + + + + + + + + + +
+
+

All files / scripts prepare-openclaw-runtime.mjs

+
+ +
+ 0% + Statements + 0/167 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/167 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { execFileSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const desktopRoot = path.resolve(__dirname, '..');
+const outputDir = path.join(desktopRoot, 'src-tauri', 'resources', 'openclaw-runtime');
+const dryRun = process.argv.includes('--dry-run');
+
+function log(message) {
+  console.log(`[prepare-openclaw-runtime] ${message}`);
+}
+
+function readFirstExistingPath(commandNames) {
+  for (const commandName of commandNames) {
+    try {
+      const stdout = execFileSync('where.exe', [commandName], {
+        encoding: 'utf8',
+        stdio: ['ignore', 'pipe', 'ignore'],
+      });
+      const firstMatch = stdout
+        .split(/\r?\n/)
+        .map((line) => line.trim())
+        .find(Boolean);
+      if (firstMatch) {
+        return firstMatch;
+      }
+    } catch {
+      continue;
+    }
+  }
+
+  return null;
+}
+
+function ensureFileExists(filePath, label) {
+  if (!filePath || !fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) {
+    throw new Error(`${label} 不存在:${filePath || '(empty)'}`);
+  }
+}
+
+function ensureDirExists(dirPath, label) {
+  if (!dirPath || !fs.existsSync(dirPath) || !fs.statSync(dirPath).isDirectory()) {
+    throw new Error(`${label} 不存在:${dirPath || '(empty)'}`);
+  }
+}
+
+function resolveOpenClawBin() {
+  const override = process.env.OPENCLAW_BIN;
+  if (override) {
+    return path.resolve(override);
+  }
+
+  const resolved = readFirstExistingPath(['openclaw.cmd', 'openclaw']);
+  if (!resolved) {
+    throw new Error('未找到 openclaw 入口。请先安装 OpenClaw,或设置 OPENCLAW_BIN。');
+  }
+
+  return resolved;
+}
+
+function resolvePackageDir(openclawBinPath) {
+  const override = process.env.OPENCLAW_PACKAGE_DIR;
+  if (override) {
+    return path.resolve(override);
+  }
+
+  return path.join(path.dirname(openclawBinPath), 'node_modules', 'openclaw');
+}
+
+function resolveNodeExe(openclawBinPath) {
+  const override = process.env.OPENCLAW_NODE_EXE;
+  if (override) {
+    return path.resolve(override);
+  }
+
+  const bundledNode = path.join(path.dirname(openclawBinPath), 'node.exe');
+  if (fs.existsSync(bundledNode)) {
+    return bundledNode;
+  }
+
+  const resolved = readFirstExistingPath(['node.exe', 'node']);
+  if (!resolved) {
+    throw new Error('未找到 node.exe。请先安装 Node.js,或设置 OPENCLAW_NODE_EXE。');
+  }
+
+  return resolved;
+}
+
+function cleanOutputDirectory(dirPath) {
+  if (!fs.existsSync(dirPath)) {
+    return;
+  }
+
+  for (const entry of fs.readdirSync(dirPath)) {
+    fs.rmSync(path.join(dirPath, entry), { recursive: true, force: true });
+  }
+}
+
+function writeCmdLauncher(dirPath) {
+  const launcher = [
+    '@ECHO off',
+    'SETLOCAL',
+    'SET "_prog=%~dp0\\node.exe"',
+    '"%_prog%" "%~dp0\\node_modules\\openclaw\\openclaw.mjs" %*',
+    '',
+  ].join('\r\n');
+
+  fs.writeFileSync(path.join(dirPath, 'openclaw.cmd'), launcher, 'utf8');
+}
+
+function stageRuntime() {
+  const openclawBinPath = resolveOpenClawBin();
+  const packageDir = resolvePackageDir(openclawBinPath);
+  const nodeExePath = resolveNodeExe(openclawBinPath);
+  const packageJsonPath = path.join(packageDir, 'package.json');
+  const entryPath = path.join(packageDir, 'openclaw.mjs');
+
+  ensureFileExists(openclawBinPath, 'OpenClaw 入口');
+  ensureDirExists(packageDir, 'OpenClaw 包目录');
+  ensureFileExists(packageJsonPath, 'OpenClaw package.json');
+  ensureFileExists(entryPath, 'OpenClaw 入口脚本');
+  ensureFileExists(nodeExePath, 'Node.js 可执行文件');
+
+  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
+  const destinationPackageDir = path.join(outputDir, 'node_modules', 'openclaw');
+  const manifest = {
+    source: {
+      openclawBinPath,
+      packageDir,
+      nodeExePath,
+    },
+    stagedAt: new Date().toISOString(),
+    version: packageJson.version ?? null,
+  };
+
+  log(`OpenClaw version: ${packageJson.version || 'unknown'}`);
+  log(`Source bin: ${openclawBinPath}`);
+  log(`Source package: ${packageDir}`);
+  log(`Source node.exe: ${nodeExePath}`);
+  log(`Target dir: ${outputDir}`);
+
+  if (dryRun) {
+    log('Dry run 完成,未写入任何文件。');
+    return;
+  }
+
+  fs.mkdirSync(outputDir, { recursive: true });
+  cleanOutputDirectory(outputDir);
+  fs.mkdirSync(path.join(outputDir, 'node_modules'), { recursive: true });
+  fs.copyFileSync(nodeExePath, path.join(outputDir, 'node.exe'));
+  fs.cpSync(packageDir, destinationPackageDir, { recursive: true, force: true });
+  writeCmdLauncher(outputDir);
+  fs.writeFileSync(path.join(outputDir, 'runtime-manifest.json'), JSON.stringify(manifest, null, 2), 'utf8');
+
+  log('OpenClaw runtime 已写入 src-tauri/resources/openclaw-runtime');
+}
+
+try {
+  stageRuntime();
+} catch (error) {
+  const message = error instanceof Error ? error.message : String(error);
+  console.error(`[prepare-openclaw-runtime] ${message}`);
+  process.exit(1);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/prepare-openfang-runtime.mjs.html b/desktop/coverage/scripts/prepare-openfang-runtime.mjs.html new file mode 100644 index 0000000..da91034 --- /dev/null +++ b/desktop/coverage/scripts/prepare-openfang-runtime.mjs.html @@ -0,0 +1,1354 @@ + + + + + + Code coverage report for scripts/prepare-openfang-runtime.mjs + + + + + + + + + +
+
+

All files / scripts prepare-openfang-runtime.mjs

+
+ +
+ 0% + Statements + 0/423 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/423 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+/**
+ * OpenFang Runtime Preparation Script
+ *
+ * Prepares the OpenFang binary for bundling with Tauri.
+ * Supports cross-platform: Windows, Linux, macOS
+ *
+ * Usage:
+ *   node scripts/prepare-openfang-runtime.mjs
+ *   node scripts/prepare-openfang-runtime.mjs --dry-run
+ *   OPENFANG_VERSION=v1.2.3 node scripts/prepare-openfang-runtime.mjs
+ */
+
+import { execSync, execFileSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { arch as osArch, platform as osPlatform, homedir } from 'node:os';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const desktopRoot = path.resolve(__dirname, '..');
+const outputDir = path.join(desktopRoot, 'src-tauri', 'resources', 'openfang-runtime');
+const dryRun = process.argv.includes('--dry-run');
+const openfangVersion = process.env.OPENFANG_VERSION || 'latest';
+
+const PLATFORM = osPlatform();
+const ARCH = osArch();
+
+function log(message) {
+  console.log(`[prepare-openfang-runtime] ${message}`);
+}
+
+function warn(message) {
+  console.warn(`[prepare-openfang-runtime] WARN: ${message}`);
+}
+
+function error(message) {
+  console.error(`[prepare-openfang-runtime] ERROR: ${message}`);
+}
+
+/**
+ * Get platform-specific binary configuration
+ * OpenFang releases: .zip for Windows, .tar.gz for Unix
+ */
+function getPlatformConfig() {
+  const configs = {
+    win32: {
+      x64: {
+        binaryName: 'openfang.exe',
+        downloadName: 'openfang-x86_64-pc-windows-msvc.zip',
+        archiveFormat: 'zip',
+      },
+      arm64: {
+        binaryName: 'openfang.exe',
+        downloadName: 'openfang-aarch64-pc-windows-msvc.zip',
+        archiveFormat: 'zip',
+      },
+    },
+    darwin: {
+      x64: {
+        binaryName: 'openfang-x86_64-apple-darwin',
+        downloadName: 'openfang-x86_64-apple-darwin.tar.gz',
+        archiveFormat: 'tar.gz',
+      },
+      arm64: {
+        binaryName: 'openfang-aarch64-apple-darwin',
+        downloadName: 'openfang-aarch64-apple-darwin.tar.gz',
+        archiveFormat: 'tar.gz',
+      },
+    },
+    linux: {
+      x64: {
+        binaryName: 'openfang-x86_64-unknown-linux-gnu',
+        downloadName: 'openfang-x86_64-unknown-linux-gnu.tar.gz',
+        archiveFormat: 'tar.gz',
+      },
+      arm64: {
+        binaryName: 'openfang-aarch64-unknown-linux-gnu',
+        downloadName: 'openfang-aarch64-unknown-linux-gnu.tar.gz',
+        archiveFormat: 'tar.gz',
+      },
+    },
+  };
+
+  const platformConfig = configs[PLATFORM];
+  if (!platformConfig) {
+    throw new Error(`Unsupported platform: ${PLATFORM}`);
+  }
+
+  const archConfig = platformConfig[ARCH];
+  if (!archConfig) {
+    throw new Error(`Unsupported architecture: ${ARCH} on ${PLATFORM}`);
+  }
+
+  return archConfig;
+}
+
+/**
+ * Find OpenFang binary in system PATH
+ */
+function findSystemBinary() {
+  const override = process.env.OPENFANG_BIN;
+  if (override) {
+    if (fs.existsSync(override)) {
+      return override;
+    }
+    throw new Error(`OPENFANG_BIN specified but file not found: ${override}`);
+  }
+
+  try {
+    let result;
+    if (PLATFORM === 'win32') {
+      result = execFileSync('where.exe', ['openfang'], {
+        encoding: 'utf8',
+        stdio: ['ignore', 'pipe', 'ignore'],
+      });
+    } else {
+      result = execFileSync('which', ['openfang'], {
+        encoding: 'utf8',
+        stdio: ['ignore', 'pipe', 'ignore'],
+      });
+    }
+
+    const binaryPath = result.split(/\r?\n/).map(s => s.trim()).find(Boolean);
+    if (binaryPath && fs.existsSync(binaryPath)) {
+      return binaryPath;
+    }
+  } catch {
+    // Binary not found in PATH
+  }
+
+  return null;
+}
+
+/**
+ * Check if OpenFang is installed via install script
+ */
+function findInstalledBinary() {
+  const config = getPlatformConfig();
+  const home = homedir();
+
+  const possiblePaths = [
+    // Default install location
+    path.join(home, '.openfang', 'bin', config.binaryName),
+    path.join(home, '.local', 'bin', config.binaryName),
+    // macOS
+    path.join(home, '.openfang', 'bin', 'openfang'),
+    '/usr/local/bin/openfang',
+    '/usr/bin/openfang',
+  ];
+
+  for (const p of possiblePaths) {
+    if (fs.existsSync(p)) {
+      return p;
+    }
+  }
+
+  return null;
+}
+
+/**
+ * Download OpenFang binary from GitHub Releases
+ * Handles .zip for Windows, .tar.gz for Unix
+ */
+function downloadBinary(config) {
+  const baseUrl = 'https://github.com/RightNow-AI/openfang/releases';
+  const downloadUrl = openfangVersion === 'latest'
+    ? `${baseUrl}/latest/download/${config.downloadName}`
+    : `${baseUrl}/download/${openfangVersion}/${config.downloadName}`;
+
+  const archivePath = path.join(outputDir, config.downloadName);
+  const binaryOutputPath = path.join(outputDir, config.binaryName);
+
+  log(`Downloading OpenFang binary...`);
+  log(`  Platform: ${PLATFORM} (${ARCH})`);
+  log(`  Version: ${openfangVersion}`);
+  log(`  Archive: ${config.downloadName}`);
+  log(`  URL: ${downloadUrl}`);
+
+  if (dryRun) {
+    log('DRY RUN: Would download and extract binary');
+    return null;
+  }
+
+  // Ensure output directory exists
+  fs.mkdirSync(outputDir, { recursive: true });
+
+  try {
+    // Download archive using curl (works on all platforms)
+    log('Downloading archive...');
+    execSync(`curl -fsSL -o "${archivePath}" "${downloadUrl}"`, { stdio: 'inherit' });
+
+    if (!fs.existsSync(archivePath)) {
+      throw new Error('Download failed - archive not created');
+    }
+
+    // Extract archive
+    log('Extracting binary...');
+    if (config.archiveFormat === 'zip') {
+      // Use PowerShell to extract zip on Windows
+      execSync(
+        `powershell -Command "Expand-Archive -Path '${archivePath}' -DestinationPath '${outputDir}' -Force"`,
+        { stdio: 'inherit' }
+      );
+    } else {
+      // Use tar for .tar.gz on Unix
+      execSync(`tar -xzf "${archivePath}" -C "${outputDir}"`, { stdio: 'inherit' });
+    }
+
+    // Find and rename the extracted binary
+    // The archive contains a single binary file
+    const extractedFiles = fs.readdirSync(outputDir).filter(f =>
+      f.startsWith('openfang') && !f.endsWith('.zip') && !f.endsWith('.tar.gz') && !f.endsWith('.sha256')
+    );
+
+    if (extractedFiles.length === 0) {
+      throw new Error('No binary found in archive');
+    }
+
+    // Use the first extracted binary (should be only one)
+    const extractedBinary = path.join(outputDir, extractedFiles[0]);
+    log(`Found extracted binary: ${extractedFiles[0]}`);
+
+    // Rename to standard name if needed
+    if (extractedFiles[0] !== config.binaryName) {
+      if (fs.existsSync(binaryOutputPath)) {
+        fs.unlinkSync(binaryOutputPath);
+      }
+      fs.renameSync(extractedBinary, binaryOutputPath);
+      log(`Renamed to: ${config.binaryName}`);
+    }
+
+    // Make executable on Unix
+    if (PLATFORM !== 'win32') {
+      fs.chmodSync(binaryOutputPath, 0o755);
+    }
+
+    // Clean up archive
+    fs.unlinkSync(archivePath);
+    log('Cleaned up archive file');
+
+    log(`Binary ready at: ${binaryOutputPath}`);
+    return binaryOutputPath;
+  } catch (err) {
+    error(`Failed to download/extract: ${err.message}`);
+    // Clean up partial files
+    if (fs.existsSync(archivePath)) {
+      fs.unlinkSync(archivePath);
+    }
+    return null;
+  }
+}
+
+/**
+ * Copy binary to output directory
+ */
+function copyBinary(sourcePath, config) {
+  if (dryRun) {
+    log(`DRY RUN: Would copy binary from ${sourcePath}`);
+    return;
+  }
+
+  fs.mkdirSync(outputDir, { recursive: true });
+  const destPath = path.join(outputDir, config.binaryName);
+  fs.copyFileSync(sourcePath, destPath);
+
+  // Make executable on Unix
+  if (PLATFORM !== 'win32') {
+    fs.chmodSync(destPath, 0o755);
+  }
+
+  log(`Copied binary to: ${destPath}`);
+}
+
+/**
+ * Write runtime manifest
+ */
+function writeManifest(config) {
+  if (dryRun) {
+    log('DRY RUN: Would write manifest');
+    return;
+  }
+
+  const manifest = {
+    source: {
+      binPath: config.binaryName,
+      binPathLinux: 'openfang-x86_64-unknown-linux-gnu',
+      binPathMac: 'openfang-x86_64-apple-darwin',
+      binPathMacArm: 'openfang-aarch64-apple-darwin',
+    },
+    stagedAt: new Date().toISOString(),
+    version: openfangVersion === 'latest'
+      ? new Date().toISOString().split('T')[0].replace(/-/g, '.')
+      : openfangVersion,
+    runtimeType: 'openfang',
+    description: 'OpenFang Agent OS - Single binary runtime (~32MB)',
+    endpoints: {
+      websocket: 'ws://127.0.0.1:4200/ws',
+      rest: 'http://127.0.0.1:4200/api',
+    },
+    platform: {
+      os: PLATFORM,
+      arch: ARCH,
+    },
+  };
+
+  const manifestPath = path.join(outputDir, 'runtime-manifest.json');
+  fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf8');
+  log(`Manifest written to: ${manifestPath}`);
+}
+
+/**
+ * Write launcher scripts for convenience
+ */
+function writeLauncherScripts(config) {
+  if (dryRun) {
+    log('DRY RUN: Would write launcher scripts');
+    return;
+  }
+
+  // Windows launcher
+  const cmdLauncher = [
+    '@echo off',
+    'REM OpenFang Agent OS - Bundled Binary Launcher',
+    `"%~dp0${config.binaryName}" %*`,
+    '',
+  ].join('\r\n');
+  fs.writeFileSync(path.join(outputDir, 'openfang.cmd'), cmdLauncher, 'utf8');
+
+  // Unix launcher
+  const shLauncher = [
+    '#!/bin/bash',
+    '# OpenFang Agent OS - Bundled Binary Launcher',
+    `SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"`,
+    `exec "$SCRIPT_DIR/${config.binaryName}" "$@"`,
+    '',
+  ].join('\n');
+  const shPath = path.join(outputDir, 'openfang.sh');
+  fs.writeFileSync(shPath, shLauncher, 'utf8');
+  fs.chmodSync(shPath, 0o755);
+
+  log('Launcher scripts written');
+}
+
+/**
+ * Clean old OpenClaw runtime files
+ */
+function cleanOldRuntime() {
+  const oldPaths = [
+    path.join(outputDir, 'node.exe'),
+    path.join(outputDir, 'node_modules'),
+    path.join(outputDir, 'openclaw.cmd'),
+  ];
+
+  for (const p of oldPaths) {
+    if (fs.existsSync(p)) {
+      if (dryRun) {
+        log(`DRY RUN: Would remove ${p}`);
+      } else {
+        fs.rmSync(p, { recursive: true, force: true });
+        log(`Removed old file: ${p}`);
+      }
+    }
+  }
+}
+
+/**
+ * Main function
+ */
+function main() {
+  log('='.repeat(60));
+  log('OpenFang Runtime Preparation');
+  log('='.repeat(60));
+
+  const config = getPlatformConfig();
+  log(`Platform: ${PLATFORM} (${ARCH})`);
+  log(`Binary: ${config.binaryName}`);
+  log(`Output: ${outputDir}`);
+
+  // Clean old OpenClaw runtime
+  cleanOldRuntime();
+
+  // Try to find existing binary
+  let binaryPath = findSystemBinary();
+
+  if (binaryPath) {
+    log(`Found OpenFang in PATH: ${binaryPath}`);
+    copyBinary(binaryPath, config);
+  } else {
+    binaryPath = findInstalledBinary();
+    if (binaryPath) {
+      log(`Found installed OpenFang: ${binaryPath}`);
+      copyBinary(binaryPath, config);
+    } else {
+      log('OpenFang not found locally, downloading...');
+      const downloaded = downloadBinary(config);
+      if (!downloaded && !dryRun) {
+        error('Failed to obtain OpenFang binary!');
+        error('');
+        error('Please either:');
+        error('  1. Install OpenFang: curl -fsSL https://openfang.sh/install | sh');
+        error('  2. Set OPENFANG_BIN environment variable to binary path');
+        error('  3. Manually download from: https://github.com/RightNow-AI/openfang/releases');
+        process.exit(1);
+      }
+    }
+  }
+
+  // Write supporting files
+  writeManifest(config);
+  writeLauncherScripts(config);
+
+  log('='.repeat(60));
+  if (dryRun) {
+    log('DRY RUN complete. No files were written.');
+  } else {
+    log('OpenFang runtime ready for build!');
+  }
+  log('='.repeat(60));
+}
+
+main();
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/preseed-tauri-tools.mjs.html b/desktop/coverage/scripts/preseed-tauri-tools.mjs.html new file mode 100644 index 0000000..e5c65f8 --- /dev/null +++ b/desktop/coverage/scripts/preseed-tauri-tools.mjs.html @@ -0,0 +1,973 @@ + + + + + + Code coverage report for scripts/preseed-tauri-tools.mjs + + + + + + + + + +
+
+

All files / scripts preseed-tauri-tools.mjs

+
+ +
+ 0% + Statements + 0/296 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/296 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { mkdtempSync, rmSync, existsSync, cpSync, mkdirSync, readdirSync, statSync } from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { spawnSync } from 'node:child_process';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const desktopRoot = path.resolve(__dirname, '..');
+const localToolsRoot = path.join(desktopRoot, 'local-tools');
+const args = new Set(process.argv.slice(2));
+const dryRun = args.has('--dry-run');
+const showHelp = args.has('--help') || args.has('-h');
+const projectCacheRoot = path.join(desktopRoot, 'src-tauri', 'target', '.tauri');
+const userCacheRoot = process.env.LOCALAPPDATA ? path.join(process.env.LOCALAPPDATA, 'tauri') : null;
+const cacheRoots = [projectCacheRoot, userCacheRoot].filter(Boolean);
+const nsisUtilsDllName = 'nsis_tauri_utils.dll';
+
+function log(message) {
+  console.log(`[preseed-tauri-tools] ${message}`);
+}
+
+function fail(message) {
+  console.error(`[preseed-tauri-tools] ${message}`);
+  process.exit(1);
+}
+
+function ensureDir(dirPath) {
+  mkdirSync(dirPath, { recursive: true });
+}
+
+function findNsisRoot(dirPath) {
+  return findDirectoryContaining(dirPath, (current, entries) => {
+    const names = new Set(entries.map((entry) => entry.name));
+    return names.has('makensis.exe') || names.has('Bin');
+  });
+}
+
+function findWixRoot(dirPath) {
+  return findDirectoryContaining(dirPath, (current, entries) => {
+    const names = new Set(entries.map((entry) => entry.name));
+    return names.has('candle.exe') || names.has('light.exe');
+  });
+}
+
+function directoryHasToolSignature(toolName, dirPath) {
+  if (!existsSync(dirPath) || !statSync(dirPath).isDirectory()) {
+    return false;
+  }
+
+  const match = toolName === 'NSIS' ? findNsisRoot(dirPath) : findWixRoot(dirPath);
+
+  return Boolean(match);
+}
+
+function directoryHasReadyNsisLayout(dirPath) {
+  const root = findNsisRoot(dirPath);
+  if (!root) {
+    return false;
+  }
+
+  return existsSync(path.join(root, 'Plugins', 'x86-unicode', nsisUtilsDllName))
+    || existsSync(path.join(root, 'Plugins', 'x86-unicode', 'additional', nsisUtilsDllName));
+}
+
+function copyDirectoryContents(sourceDir, destinationDir) {
+  ensureDir(destinationDir);
+  for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
+    const sourcePath = path.join(sourceDir, entry.name);
+    const destinationPath = path.join(destinationDir, entry.name);
+    cpSync(sourcePath, destinationPath, { recursive: true, force: true });
+  }
+}
+
+function expandZip(zipPath, destinationDir) {
+  const command = [
+    '-NoProfile',
+    '-Command',
+    `Expand-Archive -LiteralPath '${zipPath.replace(/'/g, "''")}' -DestinationPath '${destinationDir.replace(/'/g, "''")}' -Force`,
+  ];
+  const result = spawnSync('powershell', command, {
+    stdio: 'inherit',
+    shell: process.platform === 'win32',
+  });
+  if (typeof result.status === 'number' && result.status !== 0) {
+    process.exit(result.status);
+  }
+  if (result.error) {
+    throw result.error;
+  }
+}
+
+function findDirectoryContaining(rootDir, predicate) {
+  const queue = [rootDir];
+  while (queue.length > 0) {
+    const current = queue.shift();
+    const entries = readdirSync(current, { withFileTypes: true });
+    if (predicate(current, entries)) {
+      return current;
+    }
+    for (const entry of entries) {
+      if (entry.isDirectory()) {
+        queue.push(path.join(current, entry.name));
+      }
+    }
+  }
+  return null;
+}
+
+function firstExistingFile(candidates) {
+  for (const candidate of candidates.filter(Boolean).map((value) => path.resolve(value))) {
+    if (existsSync(candidate) && statSync(candidate).isFile()) {
+      return candidate;
+    }
+  }
+  return null;
+}
+
+function resolveNsisSupportDll() {
+  return firstExistingFile([
+    process.env.ZCLAW_TAURI_NSIS_TAURI_UTILS_DLL,
+    path.join(localToolsRoot, nsisUtilsDllName),
+    path.join(localToolsRoot, 'nsis_tauri_utils-v0.5.3', nsisUtilsDllName),
+    path.join(localToolsRoot, 'nsis_tauri_utils-v0.5.2', nsisUtilsDllName),
+  ]);
+}
+
+function resolveSource(toolName) {
+  if (toolName === 'NSIS') {
+    const dirCandidates = [
+      process.env.ZCLAW_TAURI_NSIS_DIR,
+      path.join(localToolsRoot, 'NSIS'),
+    ].filter(Boolean).map((value) => path.resolve(value));
+    for (const candidate of dirCandidates) {
+      if (directoryHasReadyNsisLayout(candidate)) {
+        return { kind: 'dir', path: candidate };
+      }
+    }
+
+    const supportDll = resolveNsisSupportDll();
+
+    for (const candidate of dirCandidates) {
+      if (directoryHasToolSignature('NSIS', candidate)) {
+        return { kind: 'nsis-base-dir', path: candidate, supportDll };
+      }
+    }
+
+    const zipCandidates = [
+      process.env.ZCLAW_TAURI_NSIS_ZIP,
+      path.join(localToolsRoot, 'nsis.zip'),
+      path.join(localToolsRoot, 'nsis-3.11.zip'),
+      path.join(localToolsRoot, 'nsis-3.08.zip'),
+    ].filter(Boolean).map((value) => path.resolve(value));
+    for (const candidate of zipCandidates) {
+      if (existsSync(candidate) && statSync(candidate).isFile()) {
+        return { kind: 'nsis-base-zip', path: candidate, supportDll };
+      }
+    }
+
+    return null;
+  }
+
+  const envDirKey = toolName === 'NSIS' ? 'ZCLAW_TAURI_NSIS_DIR' : 'ZCLAW_TAURI_WIX_DIR';
+  const envZipKey = toolName === 'NSIS' ? 'ZCLAW_TAURI_NSIS_ZIP' : 'ZCLAW_TAURI_WIX_ZIP';
+  const localZipCandidates = toolName === 'NSIS'
+    ? [path.join(localToolsRoot, 'nsis.zip'), path.join(localToolsRoot, 'nsis-3.11.zip')]
+    : [
+      path.join(localToolsRoot, 'wix.zip'),
+      path.join(localToolsRoot, 'wix314-binaries.zip'),
+      path.join(localToolsRoot, 'wix311-binaries.zip'),
+    ];
+
+  const localDirCandidates = toolName === 'NSIS'
+    ? [path.join(localToolsRoot, toolName)]
+    : [path.join(localToolsRoot, 'WixTools314'), path.join(localToolsRoot, 'WixTools')];
+  const dirCandidates = [process.env[envDirKey], ...localDirCandidates].filter(Boolean).map((value) => path.resolve(value));
+  for (const candidate of dirCandidates) {
+    if (directoryHasToolSignature(toolName, candidate)) {
+      return { kind: 'dir', path: candidate };
+    }
+  }
+
+  const zipCandidates = [process.env[envZipKey], ...localZipCandidates].filter(Boolean).map((value) => path.resolve(value));
+  for (const candidate of zipCandidates) {
+    if (existsSync(candidate) && statSync(candidate).isFile()) {
+      return { kind: 'zip', path: candidate };
+    }
+  }
+
+  return null;
+}
+
+function normalizeToolSource(toolName, source) {
+  if (toolName === 'NSIS' && source.kind !== 'dir') {
+    const tempRoot = mkdtempSync(path.join(os.tmpdir(), 'zclaw-tauri-tool-'));
+    const assembledRoot = path.join(tempRoot, 'NSIS');
+    ensureDir(assembledRoot);
+
+    if (source.kind === 'nsis-base-dir') {
+      const baseRoot = findNsisRoot(source.path);
+      if (!baseRoot) {
+        fail(`NSIS 目录未找到 makensis:${source.path}`);
+      }
+      copyDirectoryContents(baseRoot, assembledRoot);
+    } else if (source.kind === 'nsis-base-zip') {
+      const extractedRoot = path.join(tempRoot, 'extract');
+      ensureDir(extractedRoot);
+      expandZip(source.path, extractedRoot);
+      const baseRoot = findNsisRoot(extractedRoot);
+      if (!baseRoot) {
+        fail(`NSIS zip 解压后未找到 makensis:${source.path}`);
+      }
+      copyDirectoryContents(baseRoot, assembledRoot);
+    }
+
+    if (!source.supportDll) {
+      fail(`检测到 NSIS 基础包,但缺少 ${nsisUtilsDllName}。请放到 desktop/local-tools/${nsisUtilsDllName} 或设置 ZCLAW_TAURI_NSIS_TAURI_UTILS_DLL。`);
+    }
+
+    const pluginsDir = path.join(assembledRoot, 'Plugins', 'x86-unicode');
+    const additionalPluginsDir = path.join(pluginsDir, 'additional');
+    ensureDir(pluginsDir);
+    ensureDir(additionalPluginsDir);
+    cpSync(source.supportDll, path.join(pluginsDir, nsisUtilsDllName), { force: true });
+    cpSync(source.supportDll, path.join(additionalPluginsDir, nsisUtilsDllName), { force: true });
+
+    return { tempRoot, path: assembledRoot };
+  }
+
+  if (source.kind === 'dir') {
+    return source.path;
+  }
+
+  const tempRoot = mkdtempSync(path.join(os.tmpdir(), 'zclaw-tauri-tool-'));
+  const extractedRoot = path.join(tempRoot, 'extract');
+  ensureDir(extractedRoot);
+  expandZip(source.path, extractedRoot);
+  const normalized = toolName === 'NSIS'
+    ? findNsisRoot(extractedRoot)
+    : findWixRoot(extractedRoot);
+
+  if (!normalized) {
+    fail(`${toolName} zip 解压后未找到有效工具目录:${source.path}`);
+  }
+
+  return { tempRoot, path: normalized };
+}
+
+function printUsage() {
+  console.log('Usage: node scripts/preseed-tauri-tools.mjs [--dry-run]');
+  console.log('Sources:');
+  console.log('  ZCLAW_TAURI_NSIS_DIR / desktop/local-tools/NSIS');
+  console.log('  ZCLAW_TAURI_NSIS_ZIP / desktop/local-tools/nsis.zip or nsis-3.11.zip');
+  console.log(`  ZCLAW_TAURI_NSIS_TAURI_UTILS_DLL / desktop/local-tools/${nsisUtilsDllName}`);
+  console.log('  ZCLAW_TAURI_WIX_DIR / desktop/local-tools/WixTools314 or WixTools');
+  console.log('  ZCLAW_TAURI_WIX_ZIP / desktop/local-tools/wix.zip or wix314-binaries.zip');
+}
+
+if (showHelp) {
+  printUsage();
+  process.exit(0);
+}
+
+for (const toolName of ['NSIS', 'WixTools']) {
+  const source = resolveSource(toolName);
+  if (!source) {
+    log(`${toolName} 未提供本地预置源,跳过。`);
+    continue;
+  }
+
+  let normalized = null;
+  try {
+    normalized = normalizeToolSource(toolName, source);
+    const sourcePath = typeof normalized === 'string' ? normalized : normalized.path;
+    for (const cacheRoot of cacheRoots) {
+      const destinationNames = toolName === 'WixTools' ? ['WixTools314', 'WixTools'] : [toolName];
+      for (const destinationName of destinationNames) {
+        const destination = path.join(cacheRoot, destinationName);
+        log(`${toolName}: ${source.path} -> ${destination}`);
+        if (!dryRun) {
+          ensureDir(cacheRoot);
+          rmSync(destination, { recursive: true, force: true });
+          copyDirectoryContents(sourcePath, destination);
+        }
+      }
+    }
+  } finally {
+    if (normalized && typeof normalized !== 'string' && normalized.tempRoot) {
+      rmSync(normalized.tempRoot, { recursive: true, force: true });
+    }
+  }
+}
+
+if (dryRun) {
+  log('Dry run 完成,未写入任何文件。');
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/tauri-build-bundled.mjs.html b/desktop/coverage/scripts/tauri-build-bundled.mjs.html new file mode 100644 index 0000000..2601d58 --- /dev/null +++ b/desktop/coverage/scripts/tauri-build-bundled.mjs.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for scripts/tauri-build-bundled.mjs + + + + + + + + + +
+
+

All files / scripts tauri-build-bundled.mjs

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { spawnSync } from 'node:child_process';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const desktopRoot = path.resolve(__dirname, '..');
+const forwardArgs = process.argv.slice(2);
+
+function run(command, args, extraEnv = {}) {
+  const result = spawnSync(command, args, {
+    cwd: desktopRoot,
+    stdio: 'inherit',
+    shell: process.platform === 'win32',
+    env: {
+      ...process.env,
+      ...extraEnv,
+    },
+  });
+
+  if (typeof result.status === 'number' && result.status !== 0) {
+    process.exit(result.status);
+  }
+
+  if (result.error) {
+    throw result.error;
+  }
+}
+
+const env = {};
+if (!process.env.TAURI_BUNDLER_TOOLS_GITHUB_MIRROR && process.env.ZCLAW_TAURI_TOOLS_GITHUB_MIRROR) {
+  env.TAURI_BUNDLER_TOOLS_GITHUB_MIRROR = process.env.ZCLAW_TAURI_TOOLS_GITHUB_MIRROR;
+}
+if (!process.env.TAURI_BUNDLER_TOOLS_GITHUB_MIRROR_TEMPLATE && process.env.ZCLAW_TAURI_TOOLS_GITHUB_MIRROR_TEMPLATE) {
+  env.TAURI_BUNDLER_TOOLS_GITHUB_MIRROR_TEMPLATE = process.env.ZCLAW_TAURI_TOOLS_GITHUB_MIRROR_TEMPLATE;
+}
+
+run('node', ['scripts/prepare-openfang-runtime.mjs']);
+run('node', ['scripts/preseed-tauri-tools.mjs']);
+run('pnpm', ['exec', 'tauri', 'build', ...forwardArgs], env);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/test-api-connection.mjs.html b/desktop/coverage/scripts/test-api-connection.mjs.html new file mode 100644 index 0000000..fbe8f81 --- /dev/null +++ b/desktop/coverage/scripts/test-api-connection.mjs.html @@ -0,0 +1,1870 @@ + + + + + + Code coverage report for scripts/test-api-connection.mjs + + + + + + + + + +
+
+

All files / scripts test-api-connection.mjs

+
+ +
+ 0% + Statements + 0/595 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/595 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+/**
+ * OpenFang Backend API Connection Test Script
+ *
+ * Tests all API endpoints used by the ZCLAW desktop client against
+ * the OpenFang Kernel backend.
+ *
+ * Usage:
+ *   node desktop/scripts/test-api-connection.mjs [options]
+ *
+ * Options:
+ *   --url=URL     Base URL for OpenFang API (default: http://127.0.0.1:50051)
+ *   --verbose     Show detailed output
+ *   --json        Output results as JSON
+ *   --timeout=MS  Request timeout in milliseconds (default: 5000)
+ */
+
+import { WebSocket } from 'ws';
+
+// Configuration
+const DEFAULT_BASE_URL = 'http://127.0.0.1:50051';
+const DEFAULT_TIMEOUT = 5000;
+
+// Parse command line arguments
+const args = process.argv.slice(2);
+const config = {
+  baseUrl: DEFAULT_BASE_URL,
+  verbose: false,
+  json: false,
+  timeout: DEFAULT_TIMEOUT,
+};
+
+for (const arg of args) {
+  if (arg.startsWith('--url=')) {
+    config.baseUrl = arg.slice(6);
+  } else if (arg === '--verbose' || arg === '-v') {
+    config.verbose = true;
+  } else if (arg === '--json') {
+    config.json = true;
+  } else if (arg.startsWith('--timeout=')) {
+    config.timeout = parseInt(arg.slice(10), 10);
+  } else if (arg === '--help' || arg === '-h') {
+    console.log(`
+OpenFang API Connection Tester
+
+Usage: node test-api-connection.mjs [options]
+
+Options:
+  --url=URL      Base URL for OpenFang API (default: ${DEFAULT_BASE_URL})
+  --verbose      Show detailed output including response bodies
+  --json         Output results as JSON for programmatic processing
+  --timeout=MS   Request timeout in milliseconds (default: ${DEFAULT_TIMEOUT})
+  --help, -h     Show this help message
+`);
+    process.exit(0);
+  }
+}
+
+// Test result tracking
+const results = {
+  timestamp: new Date().toISOString(),
+  baseUrl: config.baseUrl,
+  summary: {
+    total: 0,
+    passed: 0,
+    failed: 0,
+    skipped: 0,
+  },
+  categories: {},
+  errors: [],
+};
+
+/**
+ * Make an HTTP request with timeout
+ */
+async function makeRequest(method, path, body = null, expectedStatus = null) {
+  const url = `${config.baseUrl}${path}`;
+  const controller = new AbortController();
+  const timeoutId = setTimeout(() => controller.abort(), config.timeout);
+
+  const startTime = Date.now();
+
+  try {
+    const fetchOptions = {
+      method,
+      signal: controller.signal,
+      headers: {
+        'Content-Type': 'application/json',
+      },
+    };
+
+    if (body && (method === 'POST' || method === 'PUT')) {
+      fetchOptions.body = JSON.stringify(body);
+    }
+
+    const response = await fetch(url, fetchOptions);
+    clearTimeout(timeoutId);
+
+    const duration = Date.now() - startTime;
+    let responseBody = null;
+
+    try {
+      responseBody = await response.json();
+    } catch {
+      responseBody = await response.text().catch(() => null);
+    }
+
+    const statusMatch = expectedStatus ? response.status === expectedStatus : response.status < 500;
+
+    return {
+      success: statusMatch,
+      status: response.status,
+      statusText: response.statusText,
+      duration,
+      body: responseBody,
+      error: null,
+    };
+  } catch (error) {
+    clearTimeout(timeoutId);
+    const duration = Date.now() - startTime;
+
+    return {
+      success: false,
+      status: 0,
+      statusText: 'Network Error',
+      duration,
+      body: null,
+      error: error.name === 'AbortError' ? 'Timeout' : error.message,
+    };
+  }
+}
+
+/**
+ * Test a single endpoint and record results
+ */
+async function testEndpoint(category, method, path, testOptions = {}) {
+  const { body = null, expectedStatus = null, description = '' } = testOptions;
+
+  results.summary.total++;
+
+  if (!results.categories[category]) {
+    results.categories[category] = { total: 0, passed: 0, failed: 0, tests: [] };
+  }
+  results.categories[category].total++;
+
+  const result = await makeRequest(method, path, body, expectedStatus);
+
+  const testResult = {
+    method,
+    path,
+    description,
+    status: result.status,
+    statusText: result.statusText,
+    duration: result.duration,
+    success: result.success,
+    error: result.error,
+  };
+
+  if (config.verbose && result.body) {
+    testResult.responseBody = result.body;
+  }
+
+  results.categories[category].tests.push(testResult);
+
+  if (result.success) {
+    results.summary.passed++;
+    results.categories[category].passed++;
+  } else {
+    results.summary.failed++;
+    results.categories[category].failed++;
+
+    if (result.error) {
+      results.errors.push({
+        category,
+        method,
+        path,
+        error: result.error,
+        status: result.status,
+      });
+    }
+  }
+
+  // Print progress
+  if (!config.json) {
+    const statusIcon = result.success ? '[PASS]' : '[FAIL]';
+    const statusColor = result.success ? '\x1b[32m' : '\x1b[31m';
+    const reset = '\x1b[0m';
+    const dim = '\x1b[2m';
+
+    console.log(
+      `${statusColor}${statusIcon}${reset} ${method.padEnd(6)} ${path} ${dim}${result.status} ${result.duration}ms${reset}`
+    );
+
+    if (config.verbose && result.body) {
+      const bodyStr = JSON.stringify(result.body, null, 2);
+      const indented = bodyStr.split('\n').join('\n        ');
+      console.log(`        Response: ${indented}`);
+    }
+
+    if (!result.success && result.error) {
+      console.log(`        Error: ${result.error}`);
+    }
+  }
+
+  return result;
+}
+
+/**
+ * Test WebSocket connection
+ */
+async function testWebSocketConnection(url) {
+  return new Promise((resolve) => {
+    const startTime = Date.now();
+    let resolved = false;
+
+    const ws = new WebSocket(url);
+
+    const timeout = setTimeout(() => {
+      if (!resolved) {
+        resolved = true;
+        ws.close();
+        resolve({
+          method: 'CONNECT',
+          path: '/ws',
+          description: 'WebSocket connection test',
+          status: 0,
+          statusText: 'Timeout',
+          duration: Date.now() - startTime,
+          success: false,
+          error: 'Connection timeout',
+        });
+      }
+    }, config.timeout);
+
+    ws.on('open', () => {
+      if (!resolved) {
+        resolved = true;
+        clearTimeout(timeout);
+        ws.close();
+        resolve({
+          method: 'CONNECT',
+          path: '/ws',
+          description: 'WebSocket connection test',
+          status: 101,
+          statusText: 'Switching Protocols',
+          duration: Date.now() - startTime,
+          success: true,
+          error: null,
+        });
+      }
+    });
+
+    ws.on('error', (error) => {
+      if (!resolved) {
+        resolved = true;
+        clearTimeout(timeout);
+        resolve({
+          method: 'CONNECT',
+          path: '/ws',
+          description: 'WebSocket connection test',
+          status: 0,
+          statusText: 'Connection Failed',
+          duration: Date.now() - startTime,
+          success: false,
+          error: error.message,
+        });
+      }
+    });
+  });
+}
+
+/**
+ * Print test summary
+ */
+function printSummary() {
+  console.log(`\n`);
+  console.log(`=== Test Summary ===`);
+  console.log(`\n`);
+
+  const categories = Object.entries(results.categories);
+  const maxCategoryLen = Math.max(...categories.map(([name]) => name.length));
+
+  for (const [name, data] of categories) {
+    const passRate = data.total > 0 ? ((data.passed / data.total) * 100).toFixed(0) : '0';
+    const statusIcon = data.failed === 0 ? '\x1b[32m' : '\x1b[31m';
+    const reset = '\x1b[0m';
+
+    console.log(
+      `${statusIcon}${name.padEnd(maxCategoryLen + 1)}${reset} ` +
+      `${data.passed}/${data.total} passed (${passRate}%)`
+    );
+  }
+
+  console.log(`\n`);
+  const totalPassRate = results.summary.total > 0
+    ? ((results.summary.passed / results.summary.total) * 100).toFixed(0)
+    : '0';
+  console.log(
+    `Total: ${results.summary.passed}/${results.summary.total} passed ` +
+    `(${totalPassRate}%)`
+  );
+
+  if (results.errors.length > 0) {
+    console.log(`\n\x1b[31m=== Errors ===\x1b[0m\n`);
+    for (const error of results.errors) {
+      console.log(`  [${error.category}] ${error.method} ${error.path}`);
+      console.log(`    Status: ${error.status || 'N/A'}`);
+      console.log(`    Error: ${error.error}`);
+      console.log();
+    }
+  }
+
+  // JSON output if requested
+  if (config.json) {
+    console.log(`\n=== JSON Output ===\n`);
+    console.log(JSON.stringify(results, null, 2));
+  }
+
+  // Exit with appropriate code
+  process.exit(results.summary.failed > 0 ? 1 : 0);
+}
+
+/**
+ * Run all API tests
+ */
+async function runAllTests() {
+  console.log(`\n=== OpenFang API Connection Test ===`);
+  console.log(`Base URL: ${config.baseUrl}`);
+  console.log(`Timeout: ${config.timeout}ms`);
+  console.log(`\n`);
+
+  // =========================================
+  // Health & System Endpoints
+  // =========================================
+  console.log(`\n--- Health & System ---`);
+
+  await testEndpoint('System', 'GET', '/api/health', {
+    expectedStatus: 200,
+    description: 'Health check endpoint',
+  });
+
+  await testEndpoint('System', 'GET', '/api/version', {
+    description: 'Version information',
+  });
+
+  // =========================================
+  // Agent Endpoints
+  // =========================================
+  console.log(`\n--- Agent API ---`);
+
+  await testEndpoint('Agents', 'GET', '/api/agents', {
+    expectedStatus: 200,
+    description: 'List all agents',
+  });
+
+  // Test agent creation (will fail if not authenticated)
+  await testEndpoint('Agents', 'POST', '/api/agents', {
+    body: {
+      name: 'test-agent',
+      role: 'assistant',
+    },
+    description: 'Create agent (expect 401 without auth)',
+  });
+
+  // =========================================
+  // Team API Endpoints
+  // =========================================
+  console.log(`\n--- Team API ---`);
+
+  await testEndpoint('Teams', 'GET', '/api/teams', {
+    description: 'List all teams',
+  });
+
+  await testEndpoint('Teams', 'POST', '/api/teams', {
+    body: {
+      name: 'Test Team',
+      pattern: 'sequential',
+      memberAgents: [],
+    },
+    description: 'Create team (expect 401 without auth)',
+  });
+
+  await testEndpoint('Teams', 'GET', '/api/teams/test-team-id', {
+    description: 'Get team by ID',
+  });
+
+  await testEndpoint('Teams', 'PUT', '/api/teams/test-team-id', {
+    body: { name: 'Updated Team' },
+    description: 'Update team',
+  });
+
+  await testEndpoint('Teams', 'DELETE', '/api/teams/test-team-id', {
+    description: 'Delete team',
+  });
+
+  // Team member endpoints
+  await testEndpoint('Teams', 'POST', '/api/teams/test-team-id/members', {
+    body: { agentId: 'test-agent', role: 'developer' },
+    description: 'Add team member',
+  });
+
+  await testEndpoint('Teams', 'DELETE', '/api/teams/test-team-id/members/test-member-id', {
+    description: 'Remove team member',
+  });
+
+  // Team task endpoints
+  await testEndpoint('Teams', 'GET', '/api/teams/test-team-id/metrics', {
+    description: 'Get team metrics',
+  });
+
+  await testEndpoint('Teams', 'GET', '/api/teams/test-team-id/events', {
+    description: 'Get team events',
+  });
+
+  // =========================================
+  // Config API Endpoints
+  // =========================================
+  console.log(`\n--- Config API ---`);
+
+  await testEndpoint('Config', 'GET', '/api/config', {
+    description: 'Get full configuration',
+  });
+
+  await testEndpoint('Config', 'GET', '/api/config/quick', {
+    description: 'Get quick configuration',
+  });
+
+  await testEndpoint('Config', 'PUT', '/api/config/quick', {
+    body: { default_model: 'gpt-4' },
+    description: 'Update quick configuration',
+  });
+
+  // =========================================
+  // Trigger API Endpoints
+  // =========================================
+  console.log(`\n--- Trigger API ---`);
+
+  await testEndpoint('Triggers', 'GET', '/api/triggers', {
+    description: 'List all triggers',
+  });
+
+  await testEndpoint('Triggers', 'POST', '/api/triggers', {
+    body: {
+      type: 'schedule',
+      enabled: true,
+      schedule: '0 * * * *',
+    },
+    description: 'Create trigger',
+  });
+
+  await testEndpoint('Triggers', 'GET', '/api/triggers/test-trigger-id', {
+    description: 'Get trigger by ID',
+  });
+
+  await testEndpoint('Triggers', 'PUT', '/api/triggers/test-trigger-id', {
+    body: { enabled: false },
+    description: 'Update trigger',
+  });
+
+  await testEndpoint('Triggers', 'DELETE', '/api/triggers/test-trigger-id', {
+    description: 'Delete trigger',
+  });
+
+  // =========================================
+  // Audit API Endpoints
+  // =========================================
+  console.log(`\n--- Audit API ---`);
+
+  await testEndpoint('Audit', 'GET', '/api/audit/logs', {
+    description: 'Get audit logs',
+  });
+
+  await testEndpoint('Audit', 'GET', '/api/audit/logs?limit=10', {
+    description: 'Get audit logs with limit',
+  });
+
+  await testEndpoint('Audit', 'GET', '/api/audit/verify/test-log-id', {
+    description: 'Verify audit chain for log ID',
+  });
+
+  // =========================================
+  // Skills & Plugins API Endpoints
+  // =========================================
+  console.log(`\n--- Skills & Plugins ---`);
+
+  await testEndpoint('Skills', 'GET', '/api/skills', {
+    description: 'List all skills',
+  });
+
+  await testEndpoint('Plugins', 'GET', '/api/plugins/status', {
+    description: 'Get plugin status',
+  });
+
+  // =========================================
+  // Hands API Endpoints
+  // =========================================
+  console.log(`\n--- Hands API ---`);
+
+  await testEndpoint('Hands', 'GET', '/api/hands', {
+    description: 'List all hands',
+  });
+
+  await testEndpoint('Hands', 'POST', '/api/hands/researcher/trigger', {
+    body: { query: 'test query' },
+    description: 'Trigger researcher hand',
+  });
+
+  // =========================================
+  // Workflow API Endpoints
+  // =========================================
+  console.log(`\n--- Workflow API ---`);
+
+  await testEndpoint('Workflows', 'GET', '/api/workflows', {
+    description: 'List all workflows',
+  });
+
+  await testEndpoint('Workflows', 'POST', '/api/workflows', {
+    body: {
+      name: 'Test Workflow',
+      steps: [],
+    },
+    description: 'Create workflow',
+  });
+
+  await testEndpoint('Workflows', 'GET', '/api/workflows/test-workflow-id', {
+    description: 'Get workflow by ID',
+  });
+
+  // =========================================
+  // Stats API Endpoints
+  // =========================================
+  console.log(`\n--- Stats API ---`);
+
+  await testEndpoint('Stats', 'GET', '/api/stats/usage', {
+    description: 'Get usage statistics',
+  });
+
+  await testEndpoint('Stats', 'GET', '/api/stats/sessions', {
+    description: 'Get session statistics',
+  });
+
+  // =========================================
+  // Channel API Endpoints
+  // =========================================
+  console.log(`\n--- Channels API ---`);
+
+  await testEndpoint('Channels', 'GET', '/api/channels', {
+    description: 'List all channels',
+  });
+
+  // =========================================
+  // WebSocket Endpoint
+  // =========================================
+  console.log(`\n--- WebSocket ---`);
+
+  // WebSocket test is different - we need to check if the endpoint exists
+  const wsUrl = `${config.baseUrl.replace(/^http/, 'ws')}/ws`;
+  const wsResult = await testWebSocketConnection(wsUrl);
+  results.categories['WebSocket'] = {
+    total: 1,
+    passed: wsResult.success ? 1 : 0,
+    failed: wsResult.success ? 0 : 1,
+    tests: [wsResult],
+  };
+  results.summary.total++;
+
+  if (wsResult.success) {
+    results.summary.passed++;
+    if (!config.json) {
+      console.log(`\x1b[32m[PASS]\x1b[0m CONNECT /ws \x1b[2m${wsResult.status} ${wsResult.duration}ms\x1b[0m`);
+    }
+  } else {
+    results.summary.failed++;
+    results.errors.push({
+      category: 'WebSocket',
+      method: 'CONNECT',
+      path: '/ws',
+      error: wsResult.error,
+      status: wsResult.status,
+    });
+    if (!config.json) {
+      console.log(`\x1b[31m[FAIL]\x1b[0m CONNECT /ws \x1b[2m${wsResult.status} ${wsResult.duration}ms\x1b[0m`);
+      console.log(`        Error: ${wsResult.error}`);
+    }
+  }
+
+  // Print summary
+  printSummary();
+}
+
+// Run tests
+runAllTests().catch((error) => {
+  console.error('Failed to run tests:', error.message);
+  process.exit(1);
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/scripts/test-toml-parsing.mjs.html b/desktop/coverage/scripts/test-toml-parsing.mjs.html new file mode 100644 index 0000000..6ffaaf9 --- /dev/null +++ b/desktop/coverage/scripts/test-toml-parsing.mjs.html @@ -0,0 +1,397 @@ + + + + + + Code coverage report for scripts/test-toml-parsing.mjs + + + + + + + + + +
+
+

All files / scripts test-toml-parsing.mjs

+
+ +
+ 0% + Statements + 0/104 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/104 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Test script to verify TOML parsing with actual config files
+ */
+
+import TOML from 'smol-toml';
+
+// Use inline TOML strings for testing
+const MAIN_CONFIG_TOML = `
+[server]
+host = "127.0.0.1"
+port = 4200
+websocket_port = 4200
+websocket_path = "/ws"
+
+[agent.defaults]
+workspace = "~/.openfang/workspace"
+default_model = "gpt-4"
+
+[llm]
+default_provider = "openai"
+default_model = "gpt-4"
+`;
+
+const CHINESE_PROVIDERS_TOML = `
+[[llm.providers]]
+name = "zhipu"
+display_name = "Zhipu GLM"
+api_key = "\${ZHIPU_API_KEY}"
+base_url = "https://open.bigmodel.cn/api/paas/v4"
+
+[[llm.providers.models]]
+id = "glm-4-plus"
+alias = "GLM-4-Plus"
+context_window = 128000
+
+[[llm.providers]]
+name = "qwen"
+display_name = "Qwen"
+api_key = "\${QWEN_API_KEY}"
+base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
+
+[[llm.providers.models]]
+id = "qwen-max"
+alias = "Qwen-Max"
+`;
+
+console.log('=== Testing TOML Parsing ===\n');
+
+// Test 1: Parse main config
+try {
+  console.log('\n--- Test 1: Main config.toml ---');
+  const mainConfig = TOML.parse(MAIN_CONFIG_TOML);
+  console.log('Parsed successfully!');
+  console.log('Server config:', JSON.stringify(mainConfig.server, null, 2));
+  console.log('Agent defaults:', JSON.stringify(mainConfig.agent?.defaults, null, 2));
+  console.log('LLM config:', JSON.stringify(mainConfig.llm, null, 2));
+
+  // Check required fields
+  if (!mainConfig.server?.host) throw new Error('Missing server.host');
+  if (!mainConfig.server?.port) throw new Error('Missing server.port');
+  if (!mainConfig.agent?.defaults?.workspace) throw new Error('Missing agent.defaults.workspace');
+  if (!mainConfig.agent?.defaults?.default_model) throw new Error('Missing agent.defaults.default_model');
+  if (!mainConfig.llm?.default_provider) throw new Error('Missing llm.default_provider');
+  if (!mainConfig.llm?.default_model) throw new Error('Missing llm.default_model');
+
+  console.log('All required fields present!');
+} catch (error) {
+  console.error('Failed to parse main config:', error.message);
+  process.exit(1);
+}
+
+// Test 2: Parse chinese-providers.toml
+try {
+  console.log('\n--- Test 2: chinese-providers.toml ---');
+  const chineseProviders = TOML.parse(CHINESE_PROVIDERS_TOML);
+  console.log('Parsed successfully!');
+  console.log('Number of providers:', chineseProviders.llm?.providers?.length || 0);
+
+  // List providers
+  if (chineseProviders.llm?.providers) {
+    console.log('\nProviders found:');
+    chineseProviders.llm.providers.forEach((provider, index) => {
+      console.log(`  ${index + 1}. ${provider.name} (${provider.display_name || 'N/A'})`);
+      if (provider.models) {
+        console.log(`     Models: ${provider.models.length}`);
+      }
+    });
+  }
+
+  // Check for environment variable references
+  const envVarPattern = /\$\{([^}]+)\}/g;
+  const envVars = CHINESE_PROVIDERS_TOML.match(envVarPattern);
+  if (envVars) {
+    console.log('\nEnvironment variables referenced:');
+    const uniqueVars = [...new Set(envVars)];
+    uniqueVars.forEach(v => console.log(`  - ${v}`));
+  }
+
+} catch (error) {
+  console.error('Failed to parse chinese-providers:', error.message);
+  process.exit(1);
+}
+
+console.log('\n=== All TOML parsing tests passed! ===\n');
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/sort-arrow-sprite.png b/desktop/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000..6ed6831 Binary files /dev/null and b/desktop/coverage/sort-arrow-sprite.png differ diff --git a/desktop/coverage/sorter.js b/desktop/coverage/sorter.js new file mode 100644 index 0000000..4ed70ae --- /dev/null +++ b/desktop/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/desktop/coverage/src/App.tsx.html b/desktop/coverage/src/App.tsx.html new file mode 100644 index 0000000..82cbca1 --- /dev/null +++ b/desktop/coverage/src/App.tsx.html @@ -0,0 +1,1564 @@ + + + + + + Code coverage report for src/App.tsx + + + + + + + + + +
+
+

All files / src App.tsx

+
+ +
+ 0% + Statements + 0/377 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/377 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect, useCallback } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import './index.css';
+import { Sidebar, MainViewType } from './components/Sidebar';
+import { ChatArea } from './components/ChatArea';
+import { RightPanel } from './components/RightPanel';
+import { SettingsLayout } from './components/Settings/SettingsLayout';
+import { AutomationPanel } from './components/Automation';
+import { TeamCollaborationView } from './components/TeamCollaborationView';
+import { TeamOrchestrator } from './components/TeamOrchestrator';
+import { SwarmDashboard } from './components/SwarmDashboard';
+import { SkillMarket } from './components/SkillMarket';
+import { AgentOnboardingWizard } from './components/AgentOnboardingWizard';
+import { HandApprovalModal } from './components/HandApprovalModal';
+import { TopBar } from './components/TopBar';
+import { DetailDrawer } from './components/DetailDrawer';
+import { useConnectionStore } from './store/connectionStore';
+import { useHandStore, type HandRun } from './store/handStore';
+import { useTeamStore } from './store/teamStore';
+import { useChatStore } from './store/chatStore';
+import { initializeStores } from './store';
+import { getStoredGatewayToken } from './lib/gateway-client';
+import { pageVariants, defaultTransition, fadeInVariants } from './lib/animations';
+import { Users, Loader2, Settings } from 'lucide-react';
+import { EmptyState } from './components/ui';
+import { isTauriRuntime, getLocalGatewayStatus, startLocalGateway } from './lib/tauri-gateway';
+import { useOnboarding } from './lib/use-onboarding';
+import { intelligenceClient } from './lib/intelligence-client';
+import { useProposalNotifications, ProposalNotificationHandler } from './lib/useProposalNotifications';
+import { useToast } from './components/ui/Toast';
+import type { Clone } from './store/agentStore';
+ 
+type View = 'main' | 'settings';
+ 
+// Bootstrap component that ensures OpenFang is running before rendering main UI
+function BootstrapScreen({ status }: { status: string }) {
+  return (
+    <div className="h-screen flex items-center justify-center bg-gray-50">
+      <div className="flex flex-col items-center gap-4">
+        <Loader2 className="w-8 h-8 animate-spin text-blue-500" />
+        <p className="text-gray-600 text-sm">{status}</p>
+      </div>
+    </div>
+  );
+}
+ 
+function App() {
+  const [view, setView] = useState<View>('main');
+  const [mainContentView, setMainContentView] = useState<MainViewType>('chat');
+  const [selectedTeamId, setSelectedTeamId] = useState<string | undefined>(undefined);
+  const [bootstrapping, setBootstrapping] = useState(true);
+  const [bootstrapStatus, setBootstrapStatus] = useState('Initializing...');
+  const [showOnboarding, setShowOnboarding] = useState(false);
+  const [showDetailDrawer, setShowDetailDrawer] = useState(false);
+ 
+  // Hand Approval state
+  const [pendingApprovalRun, setPendingApprovalRun] = useState<HandRun | null>(null);
+  const [showApprovalModal, setShowApprovalModal] = useState(false);
+  const [teamViewMode, setTeamViewMode] = useState<'collaboration' | 'orchestrator'>('collaboration');
+ 
+  const connect = useConnectionStore((s) => s.connect);
+  const hands = useHandStore((s) => s.hands);
+  const approveHand = useHandStore((s) => s.approveHand);
+  const loadHands = useHandStore((s) => s.loadHands);
+  const { activeTeam, setActiveTeam, teams } = useTeamStore();
+  const { setCurrentAgent, newConversation } = useChatStore();
+  const { isNeeded: onboardingNeeded, isLoading: onboardingLoading, markCompleted } = useOnboarding();
+ 
+  // Proposal notifications
+  const { toast } = useToast();
+  useProposalNotifications(); // Sets up polling for pending proposals
+ 
+  // Show toast when new proposals are available
+  useEffect(() => {
+    const handleProposalAvailable = (event: Event) => {
+      const customEvent = event as CustomEvent<{ count: number }>;
+      const { count } = customEvent.detail;
+      toast(`${count} 个新的人格变更提案待审批`, 'info');
+    };
+ 
+    window.addEventListener('zclaw:proposal-available', handleProposalAvailable);
+    return () => {
+      window.removeEventListener('zclaw:proposal-available', handleProposalAvailable);
+    };
+  }, [toast]);
+ 
+  useEffect(() => {
+    document.title = 'ZCLAW';
+  }, []);
+ 
+  // Watch for Hands that need approval
+  useEffect(() => {
+    const handsNeedingApproval = hands.filter(h => h.status === 'needs_approval');
+    if (handsNeedingApproval.length > 0 && !showApprovalModal) {
+      // Find the first hand with needs_approval and create a pending run
+      const hand = handsNeedingApproval[0];
+      if (hand.currentRunId) {
+        setPendingApprovalRun({
+          runId: hand.currentRunId,
+          status: 'needs_approval',
+          startedAt: new Date().toISOString(),
+        });
+        setShowApprovalModal(true);
+      }
+    }
+  }, [hands, showApprovalModal]);
+ 
+  // Handle approval/rejection of Hand runs
+  const handleApproveHand = useCallback(async (runId: string) => {
+    // Find the hand that owns this run
+    const hand = hands.find(h => h.currentRunId === runId);
+    if (!hand) return;
+ 
+    await approveHand(hand.id, runId, true);
+    await loadHands();
+    setShowApprovalModal(false);
+    setPendingApprovalRun(null);
+  }, [hands, approveHand, loadHands]);
+ 
+  const handleRejectHand = useCallback(async (runId: string, reason: string) => {
+    // Find the hand that owns this run
+    const hand = hands.find(h => h.currentRunId === runId);
+    if (!hand) return;
+ 
+    await approveHand(hand.id, runId, false, reason);
+    await loadHands();
+    setShowApprovalModal(false);
+    setPendingApprovalRun(null);
+  }, [hands, approveHand, loadHands]);
+ 
+  const handleCloseApprovalModal = useCallback(() => {
+    setShowApprovalModal(false);
+    // Don't clear pendingApprovalRun - keep it for reference
+  }, []);
+ 
+  // Bootstrap: Start OpenFang Gateway before rendering main UI
+  useEffect(() => {
+    let mounted = true;
+ 
+    const bootstrap = async () => {
+      try {
+        // Step 1: Check and start local gateway in Tauri environment
+        if (isTauriRuntime()) {
+          setBootstrapStatus('Checking gateway status...');
+ 
+          try {
+            const status = await getLocalGatewayStatus();
+            const isRunning = status.portStatus === 'busy' || status.listenerPids.length > 0;
+ 
+            if (!isRunning && status.cliAvailable) {
+              setBootstrapStatus('Starting OpenFang Gateway...');
+              console.log('[App] Local gateway not running, auto-starting...');
+ 
+            await startLocalGateway();
+ 
+            // Wait for gateway to be ready
+            await new Promise(resolve => setTimeout(resolve, 2000));
+            console.log('[App] Local gateway started');
+          } else if (isRunning) {
+            console.log('[App] Local gateway already running');
+          }
+        } catch (err) {
+          console.warn('[App] Failed to check/start local gateway:', err);
+        }
+      }
+ 
+      if (!mounted) return;
+ 
+      // Step 2: Connect to gateway
+      setBootstrapStatus('Connecting to gateway...');
+      const gatewayToken = getStoredGatewayToken();
+      await connect(undefined, gatewayToken);
+ 
+      if (!mounted) return;
+ 
+      // Step 3: Check if onboarding is needed
+      if (onboardingNeeded && !onboardingLoading) {
+        setShowOnboarding(true);
+      }
+ 
+      // Step 4: Initialize stores with gateway client
+      initializeStores();
+ 
+      // Step 4.5: Auto-start heartbeat engine for self-evolution
+      try {
+        const defaultAgentId = 'zclaw-main';
+        await intelligenceClient.heartbeat.init(defaultAgentId, {
+          enabled: true,
+          interval_minutes: 30,
+          quiet_hours_start: '22:00',
+          quiet_hours_end: '08:00',
+          notify_channel: 'ui',
+          proactivity_level: 'standard',
+          max_alerts_per_tick: 5,
+        });
+ 
+        // Sync memory stats to heartbeat engine
+        try {
+          const stats = await intelligenceClient.memory.stats();
+          const taskCount = stats.byType?.['task'] || 0;
+          await intelligenceClient.heartbeat.updateMemoryStats(
+            defaultAgentId,
+            taskCount,
+            stats.totalEntries,
+            stats.storageSizeBytes
+          );
+          console.log('[App] Memory stats synced to heartbeat engine');
+        } catch (statsErr) {
+          console.warn('[App] Failed to sync memory stats:', statsErr);
+        }
+ 
+        await intelligenceClient.heartbeat.start(defaultAgentId);
+        console.log('[App] Heartbeat engine started for self-evolution');
+ 
+        // Set up periodic memory stats sync (every 5 minutes)
+        const MEMORY_STATS_SYNC_INTERVAL = 5 * 60 * 1000;
+        const statsSyncInterval = setInterval(async () => {
+          try {
+            const stats = await intelligenceClient.memory.stats();
+            const taskCount = stats.byType?.['task'] || 0;
+            await intelligenceClient.heartbeat.updateMemoryStats(
+              defaultAgentId,
+              taskCount,
+              stats.totalEntries,
+              stats.storageSizeBytes
+            );
+            console.log('[App] Memory stats synced (periodic)');
+          } catch (err) {
+            console.warn('[App] Periodic memory stats sync failed:', err);
+          }
+        }, MEMORY_STATS_SYNC_INTERVAL);
+ 
+        // Store interval for cleanup
+        // @ts-expect-error - Global cleanup reference
+        window.__ZCLAW_STATS_SYNC_INTERVAL__ = statsSyncInterval;
+      } catch (err) {
+        console.warn('[App] Failed to start heartbeat engine:', err);
+        // Non-critical, continue without heartbeat
+      }
+ 
+      // Step 5: Bootstrap complete
+      setBootstrapping(false);
+    } catch (err) {
+      console.error('[App] Bootstrap failed:', err);
+      // Still allow app to load, connection status will show error
+      setBootstrapping(false);
+    }
+  };
+ 
+    bootstrap();
+ 
+    return () => {
+      mounted = false;
+      // Clean up periodic stats sync interval
+      // @ts-expect-error - Global cleanup reference
+      if (window.__ZCLAW_STATS_SYNC_INTERVAL__) {
+        // @ts-expect-error - Global cleanup reference
+        clearInterval(window.__ZCLAW_STATS_SYNC_INTERVAL__);
+      }
+    };
+  }, [connect, onboardingNeeded, onboardingLoading]);
+ 
+  // Handle onboarding completion
+  const handleOnboardingSuccess = (clone: Clone) => {
+    markCompleted({
+      userName: clone.userName || 'User',
+      userRole: clone.userRole,
+    });
+    setCurrentAgent({
+      id: clone.id,
+      name: clone.name,
+      icon: clone.emoji || '🦞',
+      color: 'bg-gradient-to-br from-orange-500 to-red-500',
+      lastMessage: clone.role || 'New Agent',
+      time: '',
+    });
+    setShowOnboarding(false);
+  };
+ 
+  // 处理主视图切换
+  const handleMainViewChange = (view: MainViewType) => {
+    setMainContentView(view);
+  };
+ 
+  // 处理新对话
+  const handleNewChat = () => {
+    newConversation();
+    setMainContentView('chat');
+  };
+ 
+  const handleSelectTeam = (teamId: string) => {
+    const team = teams.find(t => t.id === teamId);
+    if (team) {
+      setActiveTeam(team);
+      setSelectedTeamId(teamId);
+    }
+  };
+ 
+  if (view === 'settings') {
+    return <SettingsLayout onBack={() => setView('main')} />;
+  }
+ 
+  // Show bootstrap screen while starting gateway
+  if (bootstrapping) {
+    return <BootstrapScreen status={bootstrapStatus} />;
+  }
+ 
+  // Show onboarding wizard for first-time users
+  if (showOnboarding) {
+    return (
+      <AgentOnboardingWizard
+        isOpen={true}
+        onClose={async () => {
+          // Skip onboarding but still create a default agent with default personality
+          try {
+            const { getGatewayClient } = await import('./lib/gateway-client');
+            const client = getGatewayClient();
+            if (client) {
+              // Create default agent with versatile assistant personality
+              const defaultAgent = await client.createClone({
+                name: '全能助手',
+                role: '全能型 AI 助手',
+                nickname: '小龙',
+                emoji: '🦞',
+                personality: 'friendly',
+                scenarios: ['coding', 'writing', 'research', 'product', 'data'],
+                userName: 'User',
+                userRole: 'user',
+                communicationStyle: '亲切、耐心、善解人意,用易懂的语言解释复杂概念',
+              });
+ 
+              if (defaultAgent?.clone) {
+                setCurrentAgent({
+                  id: defaultAgent.clone.id,
+                  name: defaultAgent.clone.name,
+                  icon: defaultAgent.clone.emoji || '🦞',
+                  color: 'bg-gradient-to-br from-orange-500 to-red-500',
+                  lastMessage: defaultAgent.clone.role || '全能型 AI 助手',
+                  time: '',
+                });
+              }
+            }
+          } catch (err) {
+            console.warn('[App] Failed to create default agent on skip:', err);
+          }
+ 
+          // Mark onboarding as completed
+          markCompleted({
+            userName: 'User',
+            userRole: 'user',
+          });
+          setShowOnboarding(false);
+        }}
+        onSuccess={handleOnboardingSuccess}
+      />
+    );
+  }
+ 
+  return (
+    <div className="h-screen flex overflow-hidden text-gray-800 text-sm bg-white dark:bg-gray-950">
+      {/* 左侧边栏 */}
+      <Sidebar
+        onOpenSettings={() => setView('settings')}
+        onMainViewChange={handleMainViewChange}
+        selectedTeamId={selectedTeamId}
+        onSelectTeam={handleSelectTeam}
+        onNewChat={handleNewChat}
+      />
+ 
+      {/* 主内容区 */}
+      <div className="flex-1 flex flex-col overflow-hidden">
+        {/* 顶部工具栏 */}
+        <TopBar
+          title="ZCLAW"
+          onOpenDetail={() => setShowDetailDrawer(true)}
+        />
+ 
+        {/* 内容区域 */}
+        <AnimatePresence mode="wait">
+          <motion.main
+            key={mainContentView}
+            variants={pageVariants}
+            initial="initial"
+            animate="animate"
+            exit="exit"
+            transition={defaultTransition}
+            className="flex-1 overflow-hidden relative flex flex-col"
+          >
+            {mainContentView === 'automation' ? (
+              <motion.div
+                variants={fadeInVariants}
+                initial="initial"
+                animate="animate"
+                className="h-full overflow-y-auto"
+              >
+                <AutomationPanel />
+              </motion.div>
+            ) : mainContentView === 'team' ? (
+              activeTeam ? (
+                <div className="h-full flex flex-col">
+                  {/* Team View Tabs */}
+                  <div className="flex border-b border-gray-200 dark:border-gray-700 px-4">
+                    <button
+                      onClick={() => setTeamViewMode('collaboration')}
+                      className={`flex items-center gap-1.5 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors ${
+                        teamViewMode === 'collaboration'
+                          ? 'text-orange-600 dark:text-orange-400 border-orange-500'
+                          : 'text-gray-500 dark:text-gray-400 border-transparent hover:text-gray-700 dark:hover:text-gray-300'
+                      }`}
+                    >
+                      <Users className="w-4 h-4" />
+                      协作视图
+                    </button>
+                    <button
+                      onClick={() => setTeamViewMode('orchestrator')}
+                      className={`flex items-center gap-1.5 px-4 py-2.5 text-sm font-medium border-b-2 transition-colors ${
+                        teamViewMode === 'orchestrator'
+                          ? 'text-orange-600 dark:text-orange-400 border-orange-500'
+                          : 'text-gray-500 dark:text-gray-400 border-transparent hover:text-gray-700 dark:hover:text-gray-300'
+                      }`}
+                    >
+                      <Settings className="w-4 h-4" />
+                      编排管理
+                    </button>
+                  </div>
+                  {/* Tab Content */}
+                  <div className="flex-1 overflow-hidden">
+                    {teamViewMode === 'orchestrator' ? (
+                      <TeamOrchestrator isOpen={true} onClose={() => setTeamViewMode('collaboration')} />
+                    ) : (
+                      <TeamCollaborationView teamId={activeTeam.id} />
+                    )}
+                  </div>
+                </div>
+              ) : (
+                <EmptyState
+                  icon={<Users className="w-8 h-8" />}
+                  title="选择或创建团队"
+                  description="从左侧列表中选择一个团队,或点击 + 创建新的多 Agent 协作团队。"
+                />
+              )
+            ) : mainContentView === 'swarm' ? (
+              <motion.div
+                variants={fadeInVariants}
+                initial="initial"
+                animate="animate"
+                className="h-full overflow-hidden"
+              >
+                <SwarmDashboard />
+              </motion.div>
+            ) : mainContentView === 'skills' ? (
+              <motion.div
+                variants={fadeInVariants}
+                initial="initial"
+                animate="animate"
+                className="h-full overflow-hidden"
+              >
+                <SkillMarket />
+              </motion.div>
+            ) : (
+              <ChatArea />
+            )}
+          </motion.main>
+        </AnimatePresence>
+      </div>
+ 
+      {/* 详情抽屉 - 按需显示 */}
+      <DetailDrawer
+        open={showDetailDrawer}
+        onClose={() => setShowDetailDrawer(false)}
+        title="详情"
+      >
+        <RightPanel />
+      </DetailDrawer>
+ 
+      {/* Hand Approval Modal (global) */}
+      <HandApprovalModal
+        handRun={pendingApprovalRun}
+        isOpen={showApprovalModal}
+        onApprove={handleApproveHand}
+        onReject={handleRejectHand}
+        onClose={handleCloseApprovalModal}
+      />
+ 
+      {/* Proposal Notifications Handler */}
+      <ProposalNotificationHandler />
+    </div>
+  );
+}
+ 
+export default App;
+ 
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ActiveLearningPanel.tsx.html b/desktop/coverage/src/components/ActiveLearningPanel.tsx.html new file mode 100644 index 0000000..837832c --- /dev/null +++ b/desktop/coverage/src/components/ActiveLearningPanel.tsx.html @@ -0,0 +1,1354 @@ + + + + + + Code coverage report for src/components/ActiveLearningPanel.tsx + + + + + + + + + +
+
+

All files / src/components ActiveLearningPanel.tsx

+
+ +
+ 0% + Statements + 0/307 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/307 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ActiveLearningPanel - 主动学习状态面板
+ *
+ * 展示学习事件、模式和系统建议。
+ */
+ 
+import { useCallback, useState } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Brain,
+  TrendingUp,
+  Lightbulb,
+  Check,
+  X,
+  Download,
+  Clock,
+  BarChart3,
+} from 'lucide-react';
+import { Button, EmptyState, Badge } from './ui';
+import { useActiveLearningStore } from '../store/activeLearningStore';
+import {
+  type LearningEvent,
+  type LearningSuggestion,
+  type LearningEventType,
+} from '../types/active-learning';
+import { useChatStore } from '../store/chatStore';
+import { cardHover, defaultTransition } from '../lib/animations';
+ 
+// === Constants ===
+ 
+const EVENT_TYPE_LABELS: Record<LearningEventType, { label: string; color: string }> = {
+  preference: { label: '偏好', color: 'text-amber-400' },
+  correction: { label: '纠正', color: 'text-red-400' },
+  context: { label: '上下文', color: 'text-purple-400' },
+  feedback: { label: '反馈', color: 'text-blue-400' },
+  behavior: { label: '行为', color: 'text-green-400' },
+  implicit: { label: '隐式', color: 'text-gray-400' },
+};
+ 
+const PATTERN_TYPE_LABELS: Record<string, { label: string; icon: string }> = {
+  preference: { label: '偏好模式', icon: '🎯' },
+  rule: { label: '规则模式', icon: '📋' },
+  context: { label: '上下文模式', icon: '🔗' },
+  behavior: { label: '行为模式', icon: '⚡' },
+};
+ 
+// === Sub-Components ===
+ 
+interface EventItemProps {
+  event: LearningEvent;
+  onAcknowledge: () => void;
+}
+ 
+function EventItem({ event, onAcknowledge }: EventItemProps) {
+  const typeInfo = EVENT_TYPE_LABELS[event.type];
+  const timeAgo = getTimeAgo(event.timestamp);
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, y: 10 }}
+      animate={{ opacity: 1, y: 0 }}
+      exit={{ opacity: 0, y: -10 }}
+      whileHover={cardHover}
+      transition={defaultTransition}
+      className={`p-3 rounded-lg border ${
+        event.acknowledged
+          ? 'bg-gray-50 dark:bg-gray-800 border-gray-100 dark:border-gray-700'
+          : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-700'
+      }`}
+    >
+      <div className="flex items-start justify-between gap-2">
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2 mb-1">
+            <span className={`text-xs px-2 py-0.5 rounded ${typeInfo.color}`}>
+              {typeInfo.label}
+            </span>
+            <span className="text-xs text-gray-500 dark:text-gray-400">{timeAgo}</span>
+          </div>
+          <p className="text-sm text-gray-700 dark:text-gray-300 truncate">{event.observation}</p>
+          {event.inferredPreference && (
+            <p className="text-xs text-gray-500 dark:text-gray-400 mt-1">→ {event.inferredPreference}</p>
+          )}
+        </div>
+ 
+        {!event.acknowledged && (
+          <Button variant="ghost" size="sm" onClick={onAcknowledge}>
+            <Check className="w-4 h-4" />
+          </Button>
+        )}
+      </div>
+ 
+      <div className="flex items-center gap-2 mt-2 text-xs text-gray-500 dark:text-gray-400">
+        <span>置信度: {(event.confidence * 100).toFixed(0)}%</span>
+        {event.appliedCount > 0 && (
+          <span>• 应用 {event.appliedCount} 次</span>
+        )}
+      </div>
+    </motion.div>
+  );
+}
+ 
+interface SuggestionCardProps {
+  suggestion: LearningSuggestion;
+  onApply: () => void;
+  onDismiss: () => void;
+}
+ 
+function SuggestionCard({ suggestion, onApply, onDismiss }: SuggestionCardProps) {
+  const daysLeft = Math.ceil(
+    (suggestion.expiresAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24)
+  );
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, scale: 0.95 }}
+      animate={{ opacity: 1, scale: 1 }}
+      exit={{ opacity: 0, scale: 0.95 }}
+      whileHover={cardHover}
+      transition={defaultTransition}
+      className="p-4 bg-gradient-to-r from-amber-50 to-transparent dark:from-amber-900/20 dark:to-transparent rounded-lg border border-amber-200 dark:border-amber-700/50"
+    >
+      <div className="flex items-start gap-3">
+        <Lightbulb className="w-5 h-5 text-amber-500 flex-shrink-0 mt-0.5" />
+        <div className="flex-1 min-w-0">
+          <p className="text-sm text-gray-700 dark:text-gray-200">{suggestion.suggestion}</p>
+          <div className="flex items-center gap-2 mt-2 text-xs text-gray-500 dark:text-gray-400">
+            <span>置信度: {(suggestion.confidence * 100).toFixed(0)}%</span>
+            {daysLeft > 0 && <span>• {daysLeft} 天后过期</span>}
+          </div>
+        </div>
+      </div>
+ 
+      <div className="flex items-center gap-2 mt-3">
+        <Button variant="primary" size="sm" onClick={onApply}>
+          <Check className="w-3 h-3 mr-1" />
+          应用
+        </Button>
+        <Button variant="ghost" size="sm" onClick={onDismiss}>
+          <X className="w-3 h-3 mr-1" />
+          忽略
+        </Button>
+      </div>
+    </motion.div>
+  );
+}
+ 
+// === Main Component ===
+ 
+interface ActiveLearningPanelProps {
+  className?: string;
+}
+ 
+export function ActiveLearningPanel({ className = '' }: ActiveLearningPanelProps) {
+  const { currentAgent } = useChatStore();
+  const agentId = currentAgent?.id || 'default';
+ 
+  const [activeTab, setActiveTab] = useState<'events' | 'patterns' | 'suggestions'>('suggestions');
+ 
+  const {
+    events,
+    config,
+    acknowledgeEvent,
+    getPatterns,
+    getSuggestions,
+    applySuggestion,
+    dismissSuggestion,
+    getStats,
+    setConfig,
+    exportLearningData,
+    clearEvents,
+  } = useActiveLearningStore();
+ 
+  const stats = getStats(agentId);
+  const agentEvents = events.filter(e => e.agentId === agentId).slice(0, 20);
+  const agentPatterns = getPatterns(agentId);
+  const agentSuggestions = getSuggestions(agentId);
+ 
+  // 处理确认事件
+  const handleAcknowledge = useCallback((eventId: string) => {
+    acknowledgeEvent(eventId);
+  }, [acknowledgeEvent]);
+ 
+  // 处理应用建议
+  const handleApplySuggestion = useCallback((suggestionId: string) => {
+    applySuggestion(suggestionId);
+  }, [applySuggestion]);
+ 
+  // 处理忽略建议
+  const handleDismissSuggestion = useCallback((suggestionId: string) => {
+    dismissSuggestion(suggestionId);
+  }, [dismissSuggestion]);
+ 
+  // 导出学习数据
+  const handleExport = useCallback(async () => {
+    const data = await exportLearningData(agentId);
+    const blob = new Blob([data], { type: 'application/json' });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = url;
+    a.download = `zclaw-learning-${agentId}-${new Date().toISOString().slice(0, 10)}.json`;
+    a.click();
+    URL.revokeObjectURL(url);
+  }, [agentId, exportLearningData]);
+ 
+  // 清除学习数据
+  const handleClear = useCallback(() => {
+    if (confirm('确定要清除所有学习数据吗?此操作不可撤销。')) {
+      clearEvents(agentId);
+    }
+  }, [agentId, clearEvents]);
+ 
+  return (
+    <div className={`space-y-4 ${className}`}>
+      {/* 启用开关和导出 */}
+      <motion.div
+        whileHover={cardHover}
+        transition={defaultTransition}
+        className="bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-100 dark:border-gray-700 p-3"
+      >
+        <div className="flex items-center justify-between">
+          <label className="flex items-center gap-2 text-sm text-gray-700 dark:text-gray-300">
+            <Brain className="w-4 h-4 text-blue-500" />
+            <span>主动学习</span>
+            <Badge variant={config.enabled ? 'success' : 'default'} className="ml-1">
+              {config.enabled ? '已启用' : '已禁用'}
+            </Badge>
+          </label>
+          <div className="flex items-center gap-2">
+            <input
+              type="checkbox"
+              checked={config.enabled}
+              onChange={(e) => setConfig({ enabled: e.target.checked })}
+              className="rounded border-gray-300 dark:border-gray-600"
+            />
+            <Button variant="ghost" size="sm" onClick={handleExport} title="导出数据">
+              <Download className="w-4 h-4" />
+            </Button>
+          </div>
+        </div>
+      </motion.div>
+ 
+      {/* 统计概览 */}
+      <motion.div
+        whileHover={cardHover}
+        transition={defaultTransition}
+        className="bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-100 dark:border-gray-700 p-3"
+      >
+        <h3 className="text-xs font-semibold text-gray-700 dark:text-gray-300 mb-2 flex items-center gap-1.5">
+          <BarChart3 className="w-3.5 h-3.5" />
+          学习统计
+        </h3>
+        <div className="grid grid-cols-4 gap-2">
+          <div className="text-center">
+            <div className="text-lg font-bold text-blue-500">{stats.totalEvents}</div>
+            <div className="text-xs text-gray-500 dark:text-gray-400">事件</div>
+          </div>
+          <div className="text-center">
+            <div className="text-lg font-bold text-green-500">{stats.totalPatterns}</div>
+            <div className="text-xs text-gray-500 dark:text-gray-400">模式</div>
+          </div>
+          <div className="text-center">
+            <div className="text-lg font-bold text-amber-500">{agentSuggestions.length}</div>
+            <div className="text-xs text-gray-500 dark:text-gray-400">建议</div>
+          </div>
+          <div className="text-center">
+            <div className="text-lg font-bold text-purple-500">
+              {(stats.avgConfidence * 100).toFixed(0)}%
+            </div>
+            <div className="text-xs text-gray-500 dark:text-gray-400">置信度</div>
+          </div>
+        </div>
+      </motion.div>
+ 
+      {/* Tab 切换 */}
+      <div className="flex border-b border-gray-200 dark:border-gray-700">
+        {(['suggestions', 'events', 'patterns'] as const).map(tab => (
+          <button
+            key={tab}
+            onClick={() => setActiveTab(tab)}
+            className={`flex-1 py-2 text-sm font-medium transition-colors ${
+              activeTab === tab
+                ? 'text-emerald-600 dark:text-emerald-400 border-b-2 border-emerald-500'
+                : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'
+            }`}
+          >
+            {tab === 'suggestions' && '建议'}
+            {tab === 'events' && '事件'}
+            {tab === 'patterns' && '模式'}
+          </button>
+        ))}
+      </div>
+ 
+      {/* 内容区域 */}
+      <div className="space-y-3">
+        <AnimatePresence mode="wait">
+          {activeTab === 'suggestions' && (
+            <motion.div
+              key="suggestions"
+              initial={{ opacity: 0 }}
+              animate={{ opacity: 1 }}
+              exit={{ opacity: 0 }}
+              className="space-y-3"
+            >
+              {agentSuggestions.length === 0 ? (
+                <EmptyState
+                  icon={<Lightbulb className="w-8 h-8" />}
+                  title="暂无学习建议"
+                  description="系统会根据您的反馈自动生成改进建议"
+                  className="py-4"
+                />
+              ) : (
+                agentSuggestions.map(suggestion => (
+                  <SuggestionCard
+                    key={suggestion.id}
+                    suggestion={suggestion}
+                    onApply={() => handleApplySuggestion(suggestion.id)}
+                    onDismiss={() => handleDismissSuggestion(suggestion.id)}
+                  />
+                ))
+              )}
+            </motion.div>
+          )}
+ 
+          {activeTab === 'events' && (
+            <motion.div
+              key="events"
+              initial={{ opacity: 0 }}
+              animate={{ opacity: 1 }}
+              exit={{ opacity: 0 }}
+              className="space-y-2"
+            >
+              {agentEvents.length === 0 ? (
+                <EmptyState
+                  icon={<Clock className="w-8 h-8" />}
+                  title="暂无学习事件"
+                  description="开始对话后,系统会自动记录学习事件"
+                  className="py-4"
+                />
+              ) : (
+                agentEvents.map(event => (
+                  <EventItem
+                    key={event.id}
+                    event={event}
+                    onAcknowledge={() => handleAcknowledge(event.id)}
+                  />
+                ))
+              )}
+            </motion.div>
+          )}
+ 
+          {activeTab === 'patterns' && (
+            <motion.div
+              key="patterns"
+              initial={{ opacity: 0 }}
+              animate={{ opacity: 1 }}
+              exit={{ opacity: 0 }}
+              className="space-y-2"
+            >
+              {agentPatterns.length === 0 ? (
+                <EmptyState
+                  icon={<TrendingUp className="w-8 h-8" />}
+                  title="暂无学习模式"
+                  description="积累更多反馈后,系统会识别出行为模式"
+                  className="py-4"
+                />
+              ) : (
+                agentPatterns.map(pattern => {
+                  const typeInfo = PATTERN_TYPE_LABELS[pattern.type] || { label: pattern.type, icon: '📊' };
+                  return (
+                    <motion.div
+                      key={`${pattern.agentId}-${pattern.pattern}`}
+                      whileHover={cardHover}
+                      transition={defaultTransition}
+                      className="p-3 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-100 dark:border-gray-700"
+                    >
+                      <div className="flex items-center justify-between mb-2">
+                        <div className="flex items-center gap-2">
+                          <span>{typeInfo.icon}</span>
+                          <span className="text-sm font-medium text-gray-800 dark:text-gray-200">{typeInfo.label}</span>
+                        </div>
+                        <span className="text-xs px-2 py-0.5 rounded bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300">
+                          {(pattern.confidence * 100).toFixed(0)}%
+                        </span>
+                      </div>
+                      <p className="text-sm text-gray-600 dark:text-gray-400">{pattern.description}</p>
+                      <div className="mt-2 text-xs text-gray-500 dark:text-gray-400">
+                        {pattern.examples.length} 个示例
+                      </div>
+                    </motion.div>
+                  );
+                })
+              )}
+            </motion.div>
+          )}
+        </AnimatePresence>
+      </div>
+ 
+      {/* 底部操作栏 */}
+      <div className="flex items-center justify-between pt-2 border-t border-gray-100 dark:border-gray-700">
+        <div className="text-xs text-gray-500 dark:text-gray-400">
+          上次更新: {agentEvents[0] ? getTimeAgo(agentEvents[0].timestamp) : '无'}
+        </div>
+        <Button variant="ghost" size="sm" onClick={handleClear} className="text-red-500 hover:text-red-600">
+          <X className="w-3 h-3 mr-1" />
+          清除
+        </Button>
+      </div>
+    </div>
+  );
+}
+ 
+// === Helpers ===
+ 
+function getTimeAgo(timestamp: number): string {
+  const seconds = Math.floor((Date.now() - timestamp) / 1000);
+ 
+  if (seconds < 60) return '刚刚';
+  if (seconds < 3600) return `${Math.floor(seconds / 60)} 分钟前`;
+  if (seconds < 86400) return `${Math.floor(seconds / 3600)} 小时前`;
+  return `${Math.floor(seconds / 86400)} 天前`;
+}
+ 
+export default ActiveLearningPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/AgentOnboardingWizard.tsx.html b/desktop/coverage/src/components/AgentOnboardingWizard.tsx.html new file mode 100644 index 0000000..a1ff537 --- /dev/null +++ b/desktop/coverage/src/components/AgentOnboardingWizard.tsx.html @@ -0,0 +1,2113 @@ + + + + + + Code coverage report for src/components/AgentOnboardingWizard.tsx + + + + + + + + + +
+
+

All files / src/components AgentOnboardingWizard.tsx

+
+ +
+ 0% + Statements + 0/497 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/497 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AgentOnboardingWizard - Guided Agent creation wizard
+ *
+ * A 5-step wizard for creating new Agents with personality settings.
+ * Inspired by OpenClaw's quick configuration modal.
+ */
+import { useState, useCallback, useEffect } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  X,
+  User,
+  Bot,
+  Sparkles,
+  Briefcase,
+  Folder,
+  ChevronLeft,
+  ChevronRight,
+  Check,
+  Loader2,
+  AlertCircle,
+} from 'lucide-react';
+import { cn } from '../lib/utils';
+import { useAgentStore, type CloneCreateOptions } from '../store/agentStore';
+import { EmojiPicker } from './ui/EmojiPicker';
+import { PersonalitySelector } from './PersonalitySelector';
+import { ScenarioTags } from './ScenarioTags';
+import type { Clone } from '../store/agentStore';
+import { intelligenceClient } from '../lib/intelligence-client';
+import { generateSoulContent, generateUserContent } from '../lib/personality-presets';
+ 
+// === Types ===
+ 
+interface WizardFormData {
+  userName: string;
+  userRole: string;
+  agentName: string;
+  agentRole: string;
+  agentNickname: string;
+  emoji: string;
+  personality: string;
+  scenarios: string[];
+  workspaceDir: string;
+  restrictFiles: boolean;
+  privacyOptIn: boolean;
+  notes: string;
+}
+ 
+interface AgentOnboardingWizardProps {
+  isOpen: boolean;
+  onClose: () => void;
+  onSuccess?: (clone: Clone) => void;
+}
+ 
+const initialFormData: WizardFormData = {
+  userName: '',
+  userRole: '',
+  agentName: '',
+  agentRole: '',
+  agentNickname: '',
+  emoji: '',
+  personality: '',
+  scenarios: [],
+  workspaceDir: '',
+  restrictFiles: true,
+  privacyOptIn: false,
+  notes: '',
+};
+ 
+// === Step Configuration ===
+ 
+const steps = [
+  { id: 1, title: '认识用户', description: '让我们了解一下您', icon: User },
+  { id: 2, title: 'Agent 身份', description: '给助手起个名字', icon: Bot },
+  { id: 3, title: '人格风格', description: '选择沟通风格', icon: Sparkles },
+  { id: 4, title: '使用场景', description: '选择应用场景', icon: Briefcase },
+  { id: 5, title: '工作环境', description: '配置工作目录', icon: Folder },
+];
+ 
+// === Component ===
+ 
+export function AgentOnboardingWizard({ isOpen, onClose, onSuccess }: AgentOnboardingWizardProps) {
+  const { createClone, updateClone, clones, isLoading, error, clearError } = useAgentStore();
+  const [currentStep, setCurrentStep] = useState(1);
+  const [formData, setFormData] = useState<WizardFormData>(initialFormData);
+  const [errors, setErrors] = useState<Record<string, string>>({});
+  const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');
+ 
+  // Reset form when modal opens
+  useEffect(() => {
+    if (isOpen) {
+      setFormData(initialFormData);
+      setCurrentStep(1);
+      setErrors({});
+      setSubmitStatus('idle');
+      clearError();
+    }
+  }, [isOpen, clearError]);
+ 
+  // Update form field
+  const updateField = <K extends keyof WizardFormData>(field: K, value: WizardFormData[K]) => {
+    setFormData((prev) => ({ ...prev, [field]: value }));
+    if (errors[field]) {
+      setErrors((prev) => {
+        const newErrors = { ...prev };
+        delete newErrors[field];
+        return newErrors;
+      });
+    }
+  };
+ 
+  // Validate current step
+  const validateStep = useCallback((step: number): boolean => {
+    const newErrors: Record<string, string> = {};
+ 
+    switch (step) {
+      case 1:
+        if (!formData.userName.trim()) {
+          newErrors.userName = '请输入您的名字';
+        }
+        break;
+      case 2:
+        if (!formData.agentName.trim()) {
+          newErrors.agentName = '请输入 Agent 名称';
+        }
+        break;
+      case 3:
+        if (!formData.emoji) {
+          newErrors.emoji = '请选择一个 Emoji';
+        }
+        if (!formData.personality) {
+          newErrors.personality = '请选择一个人格风格';
+        }
+        break;
+      case 4:
+        if (formData.scenarios.length === 0) {
+          newErrors.scenarios = '请至少选择一个使用场景';
+        }
+        break;
+      case 5:
+        // Optional step, no validation
+        break;
+    }
+ 
+    setErrors(newErrors);
+    return Object.keys(newErrors).length === 0;
+  }, [formData]);
+ 
+  // Navigate to next step
+  const nextStep = () => {
+    if (validateStep(currentStep)) {
+      setCurrentStep((prev) => Math.min(prev + 1, steps.length));
+    }
+  };
+ 
+  // Navigate to previous step
+  const prevStep = () => {
+    setCurrentStep((prev) => Math.max(prev - 1, 1));
+  };
+ 
+  // Handle form submission
+  const handleSubmit = async () => {
+    if (!validateStep(currentStep)) {
+      return;
+    }
+ 
+    setSubmitStatus('idle');
+ 
+    try {
+      const personalityUpdates = {
+        name: formData.agentName,
+        role: formData.agentRole || undefined,
+        nickname: formData.agentNickname || undefined,
+        userName: formData.userName,
+        userRole: formData.userRole || undefined,
+        scenarios: formData.scenarios,
+        workspaceDir: formData.workspaceDir || undefined,
+        restrictFiles: formData.restrictFiles,
+        emoji: formData.emoji,
+        personality: formData.personality,
+        notes: formData.notes || undefined,
+      };
+ 
+      let clone: Clone | undefined;
+ 
+      // If there's an existing clone, update it instead of creating a new one
+      if (clones && clones.length > 0) {
+        clone = await updateClone(clones[0].id, personalityUpdates);
+      } else {
+        const createOptions: CloneCreateOptions = {
+          ...personalityUpdates,
+          privacyOptIn: formData.privacyOptIn,
+        };
+        clone = await createClone(createOptions);
+      }
+ 
+      if (clone) {
+        // Persist SOUL.md and USER.md to the identity system
+        try {
+          const soulContent = generateSoulContent({
+            agentName: formData.agentName,
+            emoji: formData.emoji,
+            personality: formData.personality,
+            scenarios: formData.scenarios,
+          });
+ 
+          const userContent = generateUserContent({
+            userName: formData.userName,
+            userRole: formData.userRole,
+            scenarios: formData.scenarios,
+          });
+ 
+          // Write SOUL.md (agent personality)
+          await intelligenceClient.identity.updateFile(clone.id, 'soul', soulContent);
+ 
+          // Write USER.md (user profile)
+          await intelligenceClient.identity.updateFile(clone.id, 'user_profile', userContent);
+ 
+          console.log('[Onboarding] SOUL.md and USER.md persisted for agent:', clone.id);
+        } catch (err) {
+          console.warn('[Onboarding] Failed to persist identity files:', err);
+          // Don't fail the whole onboarding if identity persistence fails
+        }
+ 
+        setSubmitStatus('success');
+        setTimeout(() => {
+          onSuccess?.(clone);
+          onClose();
+        }, 1500);
+      } else {
+        setSubmitStatus('error');
+      }
+    } catch {
+      setSubmitStatus('error');
+    }
+  };
+ 
+  if (!isOpen) return null;
+ 
+  const CurrentStepIcon = steps[currentStep - 1]?.icon || Bot;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-2xl mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <div className="flex items-center gap-3">
+            <div className="w-10 h-10 bg-primary/10 rounded-lg flex items-center justify-center">
+              <CurrentStepIcon className="w-5 h-5 text-primary" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                创建新 Agent
+              </h2>
+              <p className="text-xs text-gray-500 dark:text-gray-400">
+                步骤 {currentStep}/{steps.length}: {steps[currentStep - 1]?.title}
+              </p>
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
+          >
+            <X className="w-5 h-5" />
+          </button>
+        </div>
+ 
+        {/* Progress Bar */}
+        <div className="px-4 py-2 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <div className="flex items-center gap-1">
+            {steps.map((step, index) => {
+              const StepIcon = step.icon;
+              const isActive = currentStep === step.id;
+              const isCompleted = currentStep > step.id;
+              return (
+                <div key={step.id} className="flex items-center flex-1">
+                  <button
+                    type="button"
+                    onClick={() => currentStep > step.id && setCurrentStep(step.id)}
+                    disabled={currentStep <= step.id}
+                    className={cn(
+                      'flex items-center justify-center w-8 h-8 rounded-full text-xs font-medium transition-all',
+                      isActive && 'bg-primary text-white',
+                      isCompleted && 'bg-primary/20 text-primary cursor-pointer',
+                      !isActive && !isCompleted && 'bg-gray-100 dark:bg-gray-700 text-gray-400'
+                    )}
+                  >
+                    {isCompleted ? <Check className="w-4 h-4" /> : <StepIcon className="w-4 h-4" />}
+                  </button>
+                  {index < steps.length - 1 && (
+                    <div
+                      className={cn(
+                        'flex-1 h-1 rounded-full mx-1',
+                        isCompleted ? 'bg-primary' : 'bg-gray-200 dark:bg-gray-700'
+                      )}
+                    />
+                  )}
+                </div>
+              );
+            })}
+          </div>
+        </div>
+ 
+        {/* Content */}
+        <div className="flex-1 overflow-y-auto p-6">
+          <AnimatePresence mode="wait">
+            <motion.div
+              key={currentStep}
+              initial={{ opacity: 0, x: 20 }}
+              animate={{ opacity: 1, x: 0 }}
+              exit={{ opacity: 0, x: -20 }}
+              transition={{ duration: 0.2 }}
+              className="space-y-4"
+            >
+              {/* Step 1: 认识用户 */}
+              {currentStep === 1 && (
+                <>
+                  <div className="text-center mb-6">
+                    <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-1">
+                      让我们认识一下
+                    </h3>
+                    <p className="text-sm text-gray-500 dark:text-gray-400">
+                      请告诉我们您的名字,让助手更好地为您服务
+                    </p>
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      您的名字 <span className="text-red-500">*</span>
+                    </label>
+                    <input
+                      type="text"
+                      value={formData.userName}
+                      onChange={(e) => updateField('userName', e.target.value)}
+                      placeholder="例如:张三"
+                      className={cn(
+                        'w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary',
+                        errors.userName ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                      )}
+                    />
+                    {errors.userName && (
+                      <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                        <AlertCircle className="w-3 h-3" />
+                        {errors.userName}
+                      </p>
+                    )}
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      您的角色(可选)
+                    </label>
+                    <input
+                      type="text"
+                      value={formData.userRole}
+                      onChange={(e) => updateField('userRole', e.target.value)}
+                      placeholder="例如:产品经理、开发工程师"
+                      className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary"
+                    />
+                  </div>
+                </>
+              )}
+ 
+              {/* Step 2: Agent 身份 */}
+              {currentStep === 2 && (
+                <>
+                  <div className="text-center mb-6">
+                    <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-1">
+                      给您的助手起个名字
+                    </h3>
+                    <p className="text-sm text-gray-500 dark:text-gray-400">
+                      这将是您助手的身份标识
+                    </p>
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      Agent 名称 <span className="text-red-500">*</span>
+                    </label>
+                    <input
+                      type="text"
+                      value={formData.agentName}
+                      onChange={(e) => updateField('agentName', e.target.value)}
+                      placeholder="例如:小龙助手"
+                      className={cn(
+                        'w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary',
+                        errors.agentName ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                      )}
+                    />
+                    {errors.agentName && (
+                      <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                        <AlertCircle className="w-3 h-3" />
+                        {errors.agentName}
+                      </p>
+                    )}
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      Agent 角色(可选)
+                    </label>
+                    <input
+                      type="text"
+                      value={formData.agentRole}
+                      onChange={(e) => updateField('agentRole', e.target.value)}
+                      placeholder="例如:编程助手、写作顾问"
+                      className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary"
+                    />
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      昵称(可选)
+                    </label>
+                    <input
+                      type="text"
+                      value={formData.agentNickname}
+                      onChange={(e) => updateField('agentNickname', e.target.value)}
+                      placeholder="例如:小龙"
+                      className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary"
+                    />
+                  </div>
+                </>
+              )}
+ 
+              {/* Step 3: 人格风格 */}
+              {currentStep === 3 && (
+                <>
+                  <div className="text-center mb-6">
+                    <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-1">
+                      选择人格风格
+                    </h3>
+                    <p className="text-sm text-gray-500 dark:text-gray-400">
+                      这决定了助手的沟通方式和性格特点
+                    </p>
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                      选择一个 Emoji <span className="text-red-500">*</span>
+                    </label>
+                    <EmojiPicker
+                      value={formData.emoji}
+                      onChange={(emoji) => updateField('emoji', emoji)}
+                    />
+                    {errors.emoji && (
+                      <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                        <AlertCircle className="w-3 h-3" />
+                        {errors.emoji}
+                      </p>
+                    )}
+                  </div>
+ 
+                  <div className="mt-6">
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                      选择人格风格 <span className="text-red-500">*</span>
+                    </label>
+                    <PersonalitySelector
+                      value={formData.personality}
+                      onChange={(personality) => updateField('personality', personality)}
+                    />
+                    {errors.personality && (
+                      <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                        <AlertCircle className="w-3 h-3" />
+                        {errors.personality}
+                      </p>
+                    )}
+                  </div>
+                </>
+              )}
+ 
+              {/* Step 4: 使用场景 */}
+              {currentStep === 4 && (
+                <>
+                  <div className="text-center mb-6">
+                    <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-1">
+                      选择使用场景
+                    </h3>
+                    <p className="text-sm text-gray-500 dark:text-gray-400">
+                      选择您希望 Agent 协助的领域(最多5个)
+                    </p>
+                  </div>
+ 
+                  <ScenarioTags
+                    value={formData.scenarios}
+                    onChange={(scenarios) => updateField('scenarios', scenarios)}
+                    maxSelections={5}
+                  />
+                  {errors.scenarios && (
+                    <p className="mt-2 text-xs text-red-500 flex items-center gap-1">
+                      <AlertCircle className="w-3 h-3" />
+                      {errors.scenarios}
+                    </p>
+                  )}
+                </>
+              )}
+ 
+              {/* Step 5: 工作环境 */}
+              {currentStep === 5 && (
+                <>
+                  <div className="text-center mb-6">
+                    <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-1">
+                      配置工作环境
+                    </h3>
+                    <p className="text-sm text-gray-500 dark:text-gray-400">
+                      设置 Agent 的工作目录和权限
+                    </p>
+                  </div>
+ 
+                  <div>
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      工作目录(可选)
+                    </label>
+                    <input
+                      type="text"
+                      value={formData.workspaceDir}
+                      onChange={(e) => updateField('workspaceDir', e.target.value)}
+                      placeholder="例如:/home/user/projects/myproject"
+                      className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary font-mono"
+                    />
+                    <p className="mt-1 text-xs text-gray-400">
+                      Agent 将在此目录下工作,留空则使用默认目录
+                    </p>
+                  </div>
+ 
+                  <div className="space-y-3 mt-4">
+                    <div className="flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg">
+                      <div>
+                        <p className="text-sm font-medium text-gray-900 dark:text-white">
+                          限制文件访问
+                        </p>
+                        <p className="text-xs text-gray-500 dark:text-gray-400">
+                          仅允许访问工作目录内的文件
+                        </p>
+                      </div>
+                      <button
+                        type="button"
+                        onClick={() => updateField('restrictFiles', !formData.restrictFiles)}
+                        className={cn(
+                          'w-11 h-6 rounded-full transition-colors relative',
+                          formData.restrictFiles ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600'
+                        )}
+                      >
+                        <span
+                          className={cn(
+                            'absolute top-0.5 w-5 h-5 bg-white rounded-full shadow transition-transform',
+                          )}
+                          style={{ left: formData.restrictFiles ? '22px' : '2px' }}
+                        />
+                      </button>
+                    </div>
+                  </div>
+ 
+                  <div className="mt-4">
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                      备注(可选)
+                    </label>
+                    <textarea
+                      value={formData.notes}
+                      onChange={(e) => updateField('notes', e.target.value)}
+                      placeholder="关于此 Agent 的备注信息..."
+                      rows={3}
+                      className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary resize-none"
+                    />
+                  </div>
+ 
+                  {/* Summary Preview */}
+                  <div className="p-4 bg-primary/5 rounded-lg mt-4">
+                    <h4 className="text-sm font-medium text-gray-900 dark:text-white mb-3">
+                      配置预览
+                    </h4>
+                    <div className="space-y-2 text-sm">
+                      <div className="flex items-center gap-2">
+                        <span className="text-2xl">{formData.emoji || '🤖'}</span>
+                        <span className="font-medium">{formData.agentName || '未命名'}</span>
+                        {formData.agentNickname && (
+                          <span className="text-gray-500">({formData.agentNickname})</span>
+                        )}
+                      </div>
+                      <div className="text-gray-600 dark:text-gray-400">
+                        用户:{formData.userName}
+                        {formData.userRole && ` (${formData.userRole})`}
+                      </div>
+                      <div className="flex flex-wrap gap-1 mt-2">
+                        {formData.scenarios.map((id) => (
+                          <span
+                            key={id}
+                            className="px-2 py-0.5 bg-primary/10 text-primary rounded text-xs"
+                          >
+                            {id}
+                          </span>
+                        ))}
+                      </div>
+                    </div>
+                  </div>
+ 
+                  {/* Status Messages */}
+                  {submitStatus === 'success' && (
+                    <div className="flex items-center gap-2 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg text-green-700 dark:text-green-400 mt-4">
+                      <Check className="w-5 h-5 flex-shrink-0" />
+                      <span className="text-sm">Agent 创建成功!</span>
+                    </div>
+                  )}
+                  {submitStatus === 'error' && (
+                    <div className="flex items-center gap-2 p-3 bg-red-50 dark:bg-red-900/20 rounded-lg text-red-700 dark:text-red-400 mt-4">
+                      <AlertCircle className="w-5 h-5 flex-shrink-0" />
+                      <span className="text-sm">{error || '创建失败,请重试'}</span>
+                    </div>
+                  )}
+                </>
+              )}
+            </motion.div>
+          </AnimatePresence>
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-between p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <button
+            type="button"
+            onClick={prevStep}
+            disabled={currentStep === 1}
+            className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
+          >
+            <ChevronLeft className="w-4 h-4" />
+            上一步
+          </button>
+ 
+          <div className="flex items-center gap-2">
+            {currentStep < steps.length ? (
+              <button
+                type="button"
+                onClick={nextStep}
+                className="px-4 py-2 text-sm bg-primary/10 text-primary rounded-lg hover:bg-primary/20 transition-colors flex items-center gap-1"
+              >
+                下一步
+                <ChevronRight className="w-4 h-4" />
+              </button>
+            ) : (
+              <button
+                type="button"
+                onClick={handleSubmit}
+                disabled={isLoading || submitStatus === 'success'}
+                className="px-4 py-2 text-sm bg-primary/10 text-primary rounded-lg hover:bg-primary/20 transition-colors disabled:opacity-50 flex items-center gap-2"
+              >
+                {isLoading ? (
+                  <>
+                    <Loader2 className="w-4 h-4 animate-spin" />
+                    创建中...
+                  </>
+                ) : submitStatus === 'success' ? (
+                  <>
+                    <Check className="w-4 h-4" />
+                    已创建
+                  </>
+                ) : (
+                  <>
+                    <Check className="w-4 h-4" />
+                    完成
+                  </>
+                )}
+              </button>
+            )}
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default AgentOnboardingWizard;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ApprovalsPanel.tsx.html b/desktop/coverage/src/components/ApprovalsPanel.tsx.html new file mode 100644 index 0000000..ec439c0 --- /dev/null +++ b/desktop/coverage/src/components/ApprovalsPanel.tsx.html @@ -0,0 +1,1336 @@ + + + + + + Code coverage report for src/components/ApprovalsPanel.tsx + + + + + + + + + +
+
+

All files / src/components ApprovalsPanel.tsx

+
+ +
+ 0% + Statements + 0/304 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/304 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ApprovalsPanel - OpenFang Execution Approvals UI
+ *
+ * Displays pending, approved, and rejected approval requests
+ * for Hand executions that require human approval.
+ *
+ * Design based on OpenFang Dashboard v0.4.0
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore } from '../store/handStore';
+import type { Approval, ApprovalStatus } from '../store/handStore';
+import {
+  CheckCircle,
+  XCircle,
+  Clock,
+  RefreshCw,
+  AlertCircle,
+  Loader2,
+} from 'lucide-react';
+ 
+// === Status Badge Component ===
+ 
+type FilterStatus = 'all' | ApprovalStatus;
+ 
+interface StatusFilterConfig {
+  label: string;
+  className: string;
+}
+ 
+const STATUS_FILTER_CONFIG: Record<FilterStatus, StatusFilterConfig> = {
+  all: {
+    label: '全部',
+    className:
+      'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300',
+  },
+  pending: {
+    label: '待审批',
+    className:
+      'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
+  },
+  approved: {
+    label: '已批准',
+    className:
+      'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+  },
+  rejected: {
+    label: '已拒绝',
+    className:
+      'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+  },
+  expired: {
+    label: '已过期',
+    className:
+      'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',
+  },
+};
+ 
+function StatusFilterButton({
+  status,
+  isActive,
+  count,
+  onClick,
+}: {
+  status: FilterStatus;
+  isActive: boolean;
+  count?: number;
+  onClick: () => void;
+}) {
+  const config = STATUS_FILTER_CONFIG[status];
+  return (
+    <button
+      onClick={onClick}
+      className={`px-3 py-1.5 rounded-md text-sm font-medium transition-colors ${
+        isActive
+          ? config.className
+          : 'text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'
+      }`}
+    >
+      {config.label}
+      {count !== undefined && count > 0 && (
+        <span className="ml-1.5 text-xs opacity-75">({count})</span>
+      )}
+    </button>
+  );
+}
+ 
+// === Approval Status Icon ===
+ 
+function ApprovalStatusIcon({ status }: { status: ApprovalStatus }) {
+  switch (status) {
+    case 'pending':
+      return <Clock className="w-4 h-4 text-yellow-500" />;
+    case 'approved':
+      return <CheckCircle className="w-4 h-4 text-green-500" />;
+    case 'rejected':
+      return <XCircle className="w-4 h-4 text-red-500" />;
+    case 'expired':
+      return <AlertCircle className="w-4 h-4 text-gray-400" />;
+    default:
+      return null;
+  }
+}
+ 
+// === Approval Card Component ===
+ 
+interface ApprovalCardProps {
+  approval: Approval;
+  onApprove: (id: string) => void;
+  onReject: (id: string, reason: string) => void;
+  isProcessing: boolean;
+}
+ 
+function ApprovalCard({
+  approval,
+  onApprove,
+  onReject,
+  isProcessing,
+}: ApprovalCardProps) {
+  const [showRejectInput, setShowRejectInput] = useState(false);
+  const [rejectReason, setRejectReason] = useState('');
+  const isPending = approval.status === 'pending';
+ 
+  const handleReject = () => {
+    if (showRejectInput && rejectReason.trim()) {
+      onReject(approval.id, rejectReason.trim());
+      setRejectReason('');
+      setShowRejectInput(false);
+    } else {
+      setShowRejectInput(true);
+    }
+  };
+ 
+  const handleCancelReject = () => {
+    setShowRejectInput(false);
+    setRejectReason('');
+  };
+ 
+  return (
+    <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4 shadow-sm">
+      {/* Header */}
+      <div className="flex items-start justify-between gap-3 mb-3">
+        <div className="flex items-center gap-2 min-w-0">
+          <ApprovalStatusIcon status={approval.status} />
+          <div className="min-w-0">
+            <h3 className="font-medium text-gray-900 dark:text-white truncate">
+              {approval.handName}
+            </h3>
+            <p className="text-xs text-gray-500 dark:text-gray-400">
+              {approval.action || '执行'} •{' '}
+              {new Date(approval.requestedAt).toLocaleString()}
+            </p>
+          </div>
+        </div>
+        <span
+          className={`flex-shrink-0 px-2 py-0.5 rounded text-xs font-medium ${
+            STATUS_FILTER_CONFIG[approval.status]?.className ||
+            STATUS_FILTER_CONFIG.pending.className
+          }`}
+        >
+          {approval.status}
+        </span>
+      </div>
+ 
+      {/* Reason */}
+      {approval.reason && (
+        <p className="text-sm text-gray-600 dark:text-gray-400 mb-3">
+          {approval.reason}
+        </p>
+      )}
+ 
+      {/* Params Preview */}
+      {approval.params && Object.keys(approval.params).length > 0 && (
+        <div className="mb-3 p-2 bg-gray-50 dark:bg-gray-900 rounded text-xs font-mono text-gray-600 dark:text-gray-400 overflow-x-auto">
+          <pre>{JSON.stringify(approval.params, null, 2)}</pre>
+        </div>
+      )}
+ 
+      {/* Response Info (if responded) */}
+      {approval.status !== 'pending' && approval.respondedAt && (
+        <div className="mb-3 text-xs text-gray-500 dark:text-gray-400">
+          <p>
+            响应时间: {new Date(approval.respondedAt).toLocaleString()}
+            {approval.respondedBy && ` 由 ${approval.respondedBy}`}
+          </p>
+          {approval.responseReason && (
+            <p className="mt-1 italic">"{approval.responseReason}"</p>
+          )}
+        </div>
+      )}
+ 
+      {/* Reject Input */}
+      {showRejectInput && (
+        <div className="mb-3 space-y-2">
+          <textarea
+            value={rejectReason}
+            onChange={(e) => setRejectReason(e.target.value)}
+            placeholder="请输入拒绝原因..."
+            className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-red-500"
+            rows={2}
+            autoFocus
+          />
+          <div className="flex gap-2">
+            <button
+              onClick={handleCancelReject}
+              className="px-3 py-1 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200"
+            >
+              取消
+            </button>
+            <button
+              onClick={handleReject}
+              disabled={!rejectReason.trim() || isProcessing}
+              className="px-3 py-1 text-sm bg-red-600 text-white rounded-md hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed"
+            >
+              确认拒绝
+            </button>
+          </div>
+        </div>
+      )}
+ 
+      {/* Actions */}
+      {isPending && !showRejectInput && (
+        <div className="flex items-center gap-2">
+          <button
+            onClick={() => onApprove(approval.id)}
+            disabled={isProcessing}
+            className="px-3 py-1.5 text-sm bg-green-600 text-white rounded-md hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
+          >
+            {isProcessing ? (
+              <Loader2 className="w-3.5 h-3.5 animate-spin" />
+            ) : (
+              <CheckCircle className="w-3.5 h-3.5" />
+            )}
+            批准
+          </button>
+          <button
+            onClick={handleReject}
+            disabled={isProcessing}
+            className="px-3 py-1.5 text-sm border border-red-200 dark:border-red-800 text-red-600 dark:text-red-400 rounded-md hover:bg-red-50 dark:hover:bg-red-900/20 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
+          >
+            <XCircle className="w-3.5 h-3.5" />
+            拒绝
+          </button>
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+// === Empty State Component ===
+ 
+function EmptyState({ filter }: { filter: FilterStatus }) {
+  const messages: Record<FilterStatus, { title: string; description: string }> = {
+    all: {
+      title: '暂无审批请求',
+      description:
+        '当代理请求执行敏感操作时,审批请求将显示在这里。',
+    },
+    pending: {
+      title: '暂无待审批请求',
+      description: '所有审批请求已处理完成。',
+    },
+    approved: {
+      title: '暂无已批准请求',
+      description: '还没有批准任何请求。',
+    },
+    rejected: {
+      title: '暂无已拒绝请求',
+      description: '还没有拒绝任何请求。',
+    },
+    expired: {
+      title: '暂无已过期请求',
+      description: '没有过期的审批请求。',
+    },
+  };
+ 
+  const { title, description } = messages[filter];
+ 
+  return (
+    <div className="text-center py-12">
+      <div className="w-16 h-16 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center mx-auto mb-4">
+        <AlertCircle className="w-8 h-8 text-gray-400" />
+      </div>
+      <p className="text-sm font-medium text-gray-900 dark:text-white mb-1">
+        {title}
+      </p>
+      <p className="text-xs text-gray-500 dark:text-gray-400 max-w-sm mx-auto">
+        {description}
+      </p>
+    </div>
+  );
+}
+ 
+// === Main ApprovalsPanel Component ===
+ 
+export function ApprovalsPanel() {
+  const approvals = useHandStore((s) => s.approvals);
+  const loadApprovals = useHandStore((s) => s.loadApprovals);
+  const respondToApproval = useHandStore((s) => s.respondToApproval);
+  const isLoading = useHandStore((s) => s.isLoading);
+  const [filter, setFilter] = useState<FilterStatus>('all');
+  const [processingId, setProcessingId] = useState<string | null>(null);
+ 
+  useEffect(() => {
+    loadApprovals();
+  }, [loadApprovals]);
+ 
+  const handleApprove = useCallback(
+    async (id: string) => {
+      setProcessingId(id);
+      try {
+        await respondToApproval(id, true);
+      } finally {
+        setProcessingId(null);
+      }
+    },
+    [respondToApproval]
+  );
+ 
+  const handleReject = useCallback(
+    async (id: string, reason: string) => {
+      setProcessingId(id);
+      try {
+        await respondToApproval(id, false, reason);
+      } finally {
+        setProcessingId(null);
+      }
+    },
+    [respondToApproval]
+  );
+ 
+  // Filter approvals
+  const filteredApprovals =
+    filter === 'all'
+      ? approvals
+      : approvals.filter((a) => a.status === filter);
+ 
+  // Count by status
+  const counts = {
+    all: approvals.length,
+    pending: approvals.filter((a) => a.status === 'pending').length,
+    approved: approvals.filter((a) => a.status === 'approved').length,
+    rejected: approvals.filter((a) => a.status === 'rejected').length,
+    expired: approvals.filter((a) => a.status === 'expired').length,
+  };
+ 
+  if (isLoading && approvals.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <Loader2 className="w-6 h-6 animate-spin mx-auto text-gray-400 mb-2" />
+        <p className="text-sm text-gray-500 dark:text-gray-400">
+          加载审批列表中...
+        </p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-4">
+      {/* Header */}
+      <div className="flex items-center justify-between">
+        <div>
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            执行审批
+          </h2>
+          <p className="text-xs text-gray-500 dark:text-gray-400">
+            审核并批准 Hand 执行请求
+          </p>
+        </div>
+        <button
+          onClick={() => loadApprovals()}
+          disabled={isLoading}
+          className="text-sm text-blue-600 dark:text-blue-400 hover:underline flex items-center gap-1 disabled:opacity-50"
+        >
+          {isLoading ? (
+            <Loader2 className="w-3.5 h-3.5 animate-spin" />
+          ) : (
+            <RefreshCw className="w-3.5 h-3.5" />
+          )}
+          刷新
+        </button>
+      </div>
+ 
+      {/* Filters */}
+      <div className="flex items-center gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg">
+        {(Object.keys(STATUS_FILTER_CONFIG) as FilterStatus[]).map((status) => (
+          <StatusFilterButton
+            key={status}
+            status={status}
+            isActive={filter === status}
+            count={counts[status]}
+            onClick={() => setFilter(status)}
+          />
+        ))}
+      </div>
+ 
+      {/* Approvals List */}
+      {filteredApprovals.length === 0 ? (
+        <EmptyState filter={filter} />
+      ) : (
+        <div className="space-y-3">
+          {filteredApprovals.map((approval) => (
+            <ApprovalCard
+              key={approval.id}
+              approval={approval}
+              onApprove={handleApprove}
+              onReject={handleReject}
+              isProcessing={processingId === approval.id}
+            />
+          ))}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+export default ApprovalsPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/AuditLogsPanel.tsx.html b/desktop/coverage/src/components/AuditLogsPanel.tsx.html new file mode 100644 index 0000000..31b0027 --- /dev/null +++ b/desktop/coverage/src/components/AuditLogsPanel.tsx.html @@ -0,0 +1,2965 @@ + + + + + + Code coverage report for src/components/AuditLogsPanel.tsx + + + + + + + + + +
+
+

All files / src/components AuditLogsPanel.tsx

+
+ +
+ 0% + Statements + 0/688 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/688 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AuditLogsPanel - OpenFang Audit Logs UI with Merkle Hash Chain Verification
+ *
+ * Phase 3.4 Enhancement: Full-featured audit log viewer with:
+ * - Complete log entry display
+ * - Merkle hash chain verification
+ * - Export functionality (JSON/CSV)
+ * - Search and filter capabilities
+ * - Real-time log streaming
+ */
+ 
+import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
+import {
+  Search,
+  Filter,
+  FileJson,
+  FileSpreadsheet,
+  ChevronDown,
+  ChevronUp,
+  Hash,
+  Link,
+  CheckCircle2,
+  XCircle,
+  AlertCircle,
+  RefreshCw,
+  Pause,
+  Play,
+  X,
+  Loader2
+} from 'lucide-react';
+import { useSecurityStore, AuditLogEntry } from '../store/securityStore';
+import { getClient } from '../store/connectionStore';
+ 
+// === Types ===
+ 
+export interface MerkleVerificationResult {
+  valid: boolean;
+  chainDepth: number;
+  rootHash: string;
+  previousHash: string;
+  currentHash: string;
+  brokenAtIndex?: number;
+}
+ 
+export interface AuditLogFilter {
+  timeRange?: { start: Date; end: Date };
+  eventTypes?: string[];
+  actors?: string[];
+  searchTerm?: string;
+  result?: 'success' | 'failure' | 'all';
+}
+ 
+interface EnhancedAuditLogEntry extends AuditLogEntry {
+  // Extended fields from OpenFang
+  targetResource?: string;
+  operationDetails?: Record<string, unknown>;
+  ipAddress?: string;
+  sessionId?: string;
+  // Merkle chain fields
+  hash?: string;
+  previousHash?: string;
+  chainIndex?: number;
+}
+ 
+// === Helper Functions ===
+ 
+function formatTimestamp(timestamp: string): string {
+  try {
+    const date = new Date(timestamp);
+    return date.toLocaleString('zh-CN', {
+      year: 'numeric',
+      month: '2-digit',
+      day: '2-digit',
+      hour: '2-digit',
+      minute: '2-digit',
+      second: '2-digit',
+    });
+  } catch {
+    return timestamp;
+  }
+}
+ 
+function formatHash(hash: string | undefined): string {
+  if (!hash) return '-';
+  if (hash.length <= 16) return hash;
+  return `${hash.slice(0, 8)}...${hash.slice(-8)}`;
+}
+ 
+function truncateText(text: string | undefined, maxLength: number = 30): string {
+  if (!text) return '-';
+  if (text.length <= maxLength) return text;
+  return `${text.slice(0, maxLength)}...`;
+}
+ 
+// === Export Functions ===
+ 
+function exportToJSON(logs: EnhancedAuditLogEntry[]): string {
+  const exportData = logs.map(log => ({
+    id: log.id,
+    timestamp: log.timestamp,
+    action: log.action,
+    actor: log.actor || null,
+    result: log.result || null,
+    targetResource: log.targetResource || null,
+    details: log.details || null,
+    ipAddress: log.ipAddress || null,
+    sessionId: log.sessionId || null,
+    hash: log.hash || null,
+    previousHash: log.previousHash || null,
+  }));
+  return JSON.stringify(exportData, null, 2);
+}
+ 
+function exportToCSV(logs: EnhancedAuditLogEntry[]): string {
+  const headers = [
+    'ID',
+    'Timestamp',
+    'Action',
+    'Actor',
+    'Result',
+    'Target Resource',
+    'IP Address',
+    'Session ID',
+    'Hash',
+    'Previous Hash'
+  ];
+ 
+  const rows = logs.map(log => [
+    log.id,
+    log.timestamp,
+    `"${(log.action || '').replace(/"/g, '""')}"`,
+    `"${(log.actor || '').replace(/"/g, '""')}"`,
+    log.result || '',
+    `"${(log.targetResource || '').replace(/"/g, '""')}"`,
+    log.ipAddress || '',
+    log.sessionId || '',
+    log.hash || '',
+    log.previousHash || '',
+  ].join(','));
+ 
+  return [headers.join(','), ...rows].join('\n');
+}
+ 
+function downloadFile(content: string, filename: string, mimeType: string): void {
+  const blob = new Blob([content], { type: mimeType });
+  const url = URL.createObjectURL(blob);
+  const a = document.createElement('a');
+  a.href = url;
+  a.download = filename;
+  document.body.appendChild(a);
+  a.click();
+  document.body.removeChild(a);
+  URL.revokeObjectURL(url);
+}
+ 
+// === Sub-Components ===
+ 
+interface FilterPanelProps {
+  filter: AuditLogFilter;
+  onFilterChange: (filter: AuditLogFilter) => void;
+  eventTypes: string[];
+  actors: string[];
+  onReset: () => void;
+}
+ 
+function FilterPanel({ filter, onFilterChange, eventTypes, actors, onReset }: FilterPanelProps) {
+  // Helper to safely create time range with proper null handling
+  const handleStartTimeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const newStart = e.target.value ? new Date(e.target.value) : undefined;
+    const currentEnd = filter.timeRange?.end;
+    onFilterChange({
+      ...filter,
+      timeRange: (newStart || currentEnd) ? { start: newStart!, end: currentEnd! } : undefined,
+    });
+  };
+ 
+  const handleEndTimeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const newEnd = e.target.value ? new Date(e.target.value) : undefined;
+    const currentStart = filter.timeRange?.start;
+    onFilterChange({
+      ...filter,
+      timeRange: (currentStart || newEnd) ? { start: currentStart!, end: newEnd! } : undefined,
+    });
+  };
+ 
+  return (
+    <div className="space-y-3 p-4 bg-gray-50 dark:bg-gray-800/50 rounded-lg">
+      {/* Time Range */}
+      <div>
+        <label className="block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">
+          Time Range
+        </label>
+        <div className="flex gap-2">
+          <input
+            type="datetime-local"
+            value={filter.timeRange?.start?.toISOString().slice(0, 16) || ''}
+            onChange={handleStartTimeChange}
+            className="flex-1 text-xs px-2 py-1 border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"
+            placeholder="Start"
+          />
+          <input
+            type="datetime-local"
+            value={filter.timeRange?.end?.toISOString().slice(0, 16) || ''}
+            onChange={handleEndTimeChange}
+            className="flex-1 text-xs px-2 py-1 border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"
+            placeholder="End"
+          />
+        </div>
+      </div>
+ 
+      {/* Event Type */}
+      <div>
+        <label className="block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">
+          Event Type
+        </label>
+        <select
+          multiple
+          value={filter.eventTypes || []}
+          onChange={(e) => onFilterChange({
+            ...filter,
+            eventTypes: Array.from(e.target.selectedOptions, (opt) => opt.value),
+          })}
+          className="w-full text-xs px-2 py-1 border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"
+          size={3}
+        >
+          {eventTypes.map((type) => (
+            <option key={type} value={type}>
+              {type}
+            </option>
+          ))}
+        </select>
+      </div>
+ 
+      {/* Actor */}
+      <div>
+        <label className="block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">
+          Actor
+        </label>
+        <select
+          multiple
+          value={filter.actors || []}
+          onChange={(e) => onFilterChange({
+            ...filter,
+            actors: Array.from(e.target.selectedOptions, (opt) => opt.value),
+          })}
+          className="w-full text-xs px-2 py-1 border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"
+          size={3}
+        >
+          {actors.map((actor) => (
+            <option key={actor} value={actor}>
+              {actor}
+            </option>
+          ))}
+        </select>
+      </div>
+ 
+      {/* Result */}
+      <div>
+        <label className="block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">
+          Result
+        </label>
+        <select
+          value={filter.result || 'all'}
+          onChange={(e) => onFilterChange({
+            ...filter,
+            result: e.target.value === 'all' ? undefined : e.target.value as 'success' | 'failure',
+          })}
+          className="w-full text-xs px-2 py-1 border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"
+        >
+          <option value="all">All</option>
+          <option value="success">Success</option>
+          <option value="failure">Failure</option>
+        </select>
+      </div>
+ 
+      {/* Reset Button */}
+      <button
+        onClick={onReset}
+        className="w-full text-xs px-3 py-1.5 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded hover:bg-gray-300 dark:hover:bg-gray-600 transition-colors"
+      >
+        Reset Filters
+      </button>
+    </div>
+  );
+}
+ 
+interface LogDetailSidebarProps {
+  log: EnhancedAuditLogEntry | null;
+  onClose: () => void;
+  onVerify: (log: EnhancedAuditLogEntry) => void;
+  verificationResult: MerkleVerificationResult | null;
+  isVerifying: boolean;
+}
+ 
+function LogDetailSidebar({
+  log,
+  onClose,
+  onVerify,
+  verificationResult,
+  isVerifying,
+}: LogDetailSidebarProps) {
+  if (!log) return null;
+ 
+  return (
+    <div className="w-80 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4 overflow-y-auto">
+      <div className="flex items-center justify-between mb-4">
+        <h3 className="text-sm font-semibold text-gray-900 dark:text-white">Log Details</h3>
+        <button
+          onClick={onClose}
+          className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+        >
+          <X className="w-4 h-4" />
+        </button>
+      </div>
+ 
+      <div className="space-y-3">
+        {/* Timestamp */}
+        <div>
+          <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Timestamp</span>
+          <span className="text-sm text-gray-900 dark:text-white">{formatTimestamp(log.timestamp)}</span>
+        </div>
+ 
+        {/* Action */}
+        <div>
+          <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Action</span>
+          <span className="text-sm text-gray-900 dark:text-white">{log.action}</span>
+        </div>
+ 
+        {/* Actor */}
+        <div>
+          <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Actor</span>
+          <span className="text-sm text-gray-900 dark:text-white">{log.actor || '-'}</span>
+        </div>
+ 
+        {/* Result */}
+        <div>
+          <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Result</span>
+          <span className={`inline-flex items-center gap-1 text-sm ${
+            log.result === 'success' ? 'text-green-600' : log.result === 'failure' ? 'text-red-600' : 'text-gray-600'
+          }`}>
+            {log.result === 'success' ? (
+              <CheckCircle2 className="w-4 h-4" />
+            ) : log.result === 'failure' ? (
+              <XCircle className="w-4 h-4" />
+            ) : null}
+            {log.result || '-'}
+          </span>
+        </div>
+ 
+        {/* Target Resource */}
+        {log.targetResource && (
+          <div>
+            <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Target Resource</span>
+            <span className="text-sm text-gray-900 dark:text-white break-all">{log.targetResource}</span>
+          </div>
+        )}
+ 
+        {/* IP Address */}
+        {log.ipAddress && (
+          <div>
+            <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">IP Address</span>
+            <span className="text-sm text-gray-900 dark:text-white font-mono">{log.ipAddress}</span>
+          </div>
+        )}
+ 
+        {/* Session ID */}
+        {log.sessionId && (
+          <div>
+            <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Session ID</span>
+            <span className="text-sm text-gray-900 dark:text-white font-mono truncate">{log.sessionId}</span>
+          </div>
+        )}
+ 
+        {/* Details */}
+        {log.details && Object.keys(log.details).length > 0 && (
+          <div>
+            <span className="block text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">Details</span>
+            <pre className="text-xs bg-gray-100 dark:bg-gray-900 p-2 rounded overflow-x-auto">
+              {JSON.stringify(log.details, null, 2)}
+            </pre>
+          </div>
+        )}
+ 
+        {/* Merkle Hash Section */}
+        <div className="border-t border-gray-200 dark:border-gray-700 pt-3 mt-3">
+          <h4 className="text-xs font-semibold text-gray-700 dark:text-gray-300 mb-2 flex items-center gap-1">
+            <Hash className="w-3.5 h-3.5" />
+            Merkle Hash Chain
+          </h4>
+ 
+          {/* Current Hash */}
+          <div className="mb-2">
+            <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Current Hash</span>
+            <span className="text-xs text-gray-700 dark:text-gray-300 font-mono break-all">
+              {log.hash || 'Not available'}
+            </span>
+          </div>
+ 
+          {/* Previous Hash */}
+          <div className="mb-2">
+            <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Previous Hash</span>
+            <span className="text-xs text-gray-700 dark:text-gray-300 font-mono break-all">
+              {log.previousHash || 'Not available'}
+            </span>
+          </div>
+ 
+          {/* Chain Index */}
+          {log.chainIndex !== undefined && (
+            <div className="mb-3">
+              <span className="block text-xs font-medium text-gray-500 dark:text-gray-400">Chain Index</span>
+              <span className="text-xs text-gray-700 dark:text-gray-300">{log.chainIndex}</span>
+            </div>
+          )}
+ 
+          {/* Verify Button */}
+          <button
+            onClick={() => onVerify(log)}
+            disabled={isVerifying || !log.hash}
+            className="w-full flex items-center justify-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
+          >
+            {isVerifying ? (
+              <Loader2 className="w-3.5 h-3.5 animate-spin" />
+            ) : (
+              <Link className="w-3.5 h-3.5" />
+            )}
+            {isVerifying ? 'Verifying...' : 'Verify Chain'}
+          </button>
+ 
+          {/* Verification Result */}
+          {verificationResult && (
+            <div className={`mt-2 p-2 rounded text-xs ${
+              verificationResult.valid
+                ? 'bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400'
+                : 'bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-400'
+            }`}>
+              <div className="flex items-center gap-1.5 mb-1">
+                {verificationResult.valid ? (
+                  <CheckCircle2 className="w-3.5 h-3.5" />
+                ) : (
+                  <XCircle className="w-3.5 h-3.5" />
+                )}
+                <span className="font-medium">
+                  {verificationResult.valid ? 'Chain Valid' : 'Chain Broken'}
+                </span>
+              </div>
+              {!verificationResult.valid && verificationResult.brokenAtIndex !== undefined && (
+                <p>Broken at index: {verificationResult.brokenAtIndex}</p>
+              )}
+              <p className="text-gray-500 dark:text-gray-400">Depth: {verificationResult.chainDepth}</p>
+            </div>
+          )}
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+interface HashChainVisualizationProps {
+  logs: EnhancedAuditLogEntry[];
+  selectedIndex: number | null;
+  onSelect: (index: number) => void;
+  brokenAtIndex?: number;
+}
+ 
+function HashChainVisualization({ logs, selectedIndex, onSelect, brokenAtIndex }: HashChainVisualizationProps) {
+  const visibleLogs = logs.slice(0, 10); // Show last 10 for visualization
+ 
+  return (
+    <div className="p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg">
+      <h4 className="text-xs font-semibold text-gray-700 dark:text-gray-300 mb-2 flex items-center gap-1">
+        <Link className="w-3.5 h-3.5" />
+        Hash Chain (Last {visibleLogs.length} entries)
+      </h4>
+      <div className="flex items-center gap-1 overflow-x-auto pb-1">
+        {visibleLogs.map((log, idx) => (
+          <div key={log.id} className="flex items-center">
+            <button
+              onClick={() => onSelect(logs.length - visibleLogs.length + idx)}
+              className={`flex-shrink-0 w-6 h-6 rounded flex items-center justify-center text-xs font-mono transition-colors ${
+                selectedIndex === logs.length - visibleLogs.length + idx
+                  ? 'bg-blue-600 text-white'
+                  : brokenAtIndex === logs.length - visibleLogs.length + idx
+                  ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400'
+                  : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-300 dark:hover:bg-gray-600'
+              }`}
+              title={formatTimestamp(log.timestamp)}
+            >
+              {String(logs.length - visibleLogs.length + idx).padStart(2, '0')}
+            </button>
+            {idx < visibleLogs.length - 1 && (
+              <div className={`w-3 h-0.5 ${
+                brokenAtIndex === logs.length - visibleLogs.length + idx
+                  ? 'bg-red-400'
+                  : 'bg-gray-300 dark:bg-gray-600'
+              }`} />
+            )}
+          </div>
+        ))}
+      </div>
+      {brokenAtIndex !== undefined && (
+        <p className="text-xs text-red-600 dark:text-red-400 mt-1">
+          <AlertCircle className="w-3.5 h-3.5 inline mr-1" />
+          Chain broken at index {brokenAtIndex}
+        </p>
+      )}
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function AuditLogsPanel() {
+  const auditLogs = useSecurityStore((s) => s.auditLogs);
+  const loadAuditLogs = useSecurityStore((s) => s.loadAuditLogs);
+  const isLoading = useSecurityStore((s) => s.auditLogsLoading);
+  const client = getClient();
+ 
+  // State
+  const [limit, setLimit] = useState(50);
+  const [searchTerm, setSearchTerm] = useState('');
+  const [showFilters, setShowFilters] = useState(false);
+  const [filter, setFilter] = useState<AuditLogFilter>({});
+  const [selectedLog, setSelectedLog] = useState<EnhancedAuditLogEntry | null>(null);
+  const [verificationResult, setVerificationResult] = useState<MerkleVerificationResult | null>(null);
+  const [isVerifying, setIsVerifying] = useState(false);
+  const [isStreaming, setIsStreaming] = useState(false);
+  const [isPaused, setIsPaused] = useState(false);
+  const [chainBrokenAt, setChainBrokenAt] = useState<number | undefined>(undefined);
+ 
+  const logsEndRef = useRef<HTMLDivElement>(null);
+  const streamingRef = useRef<(() => void) | null>(null);
+ 
+  // Load logs on mount and when limit changes
+  useEffect(() => {
+    loadAuditLogs({ limit });
+  }, [loadAuditLogs, limit]);
+ 
+  // Auto-scroll to latest when streaming
+  useEffect(() => {
+    if (isStreaming && !isPaused && logsEndRef.current) {
+      logsEndRef.current.scrollIntoView({ behavior: 'smooth' });
+    }
+  }, [auditLogs, isStreaming, isPaused]);
+ 
+  // Extract unique event types and actors for filters
+  const { eventTypes, actors } = useMemo(() => {
+    const types = new Set<string>();
+    const actorSet = new Set<string>();
+ 
+    auditLogs.forEach((log) => {
+      if (log.action) types.add(log.action);
+      if (log.actor) actorSet.add(log.actor);
+    });
+ 
+    return {
+      eventTypes: Array.from(types).sort(),
+      actors: Array.from(actorSet).sort(),
+    };
+  }, [auditLogs]);
+ 
+  // Filter logs
+  const filteredLogs = useMemo(() => {
+    let logs = auditLogs as EnhancedAuditLogEntry[];
+ 
+    // Time range filter
+    if (filter.timeRange?.start) {
+      const startTime = filter.timeRange.start.getTime();
+      logs = logs.filter((log) => new Date(log.timestamp).getTime() >= startTime);
+    }
+    if (filter.timeRange?.end) {
+      const endTime = filter.timeRange.end.getTime();
+      logs = logs.filter((log) => new Date(log.timestamp).getTime() <= endTime);
+    }
+ 
+    // Event type filter
+    if (filter.eventTypes?.length) {
+      logs = logs.filter((log) => filter.eventTypes!.includes(log.action));
+    }
+ 
+    // Actor filter
+    if (filter.actors?.length) {
+      logs = logs.filter((log) => log.actor && filter.actors!.includes(log.actor));
+    }
+ 
+    // Result filter
+    if (filter.result) {
+      logs = logs.filter((log) => log.result === filter.result);
+    }
+ 
+    // Search term
+    if (searchTerm.trim()) {
+      const term = searchTerm.toLowerCase();
+      logs = logs.filter((log) =>
+        log.action.toLowerCase().includes(term) ||
+        (log.actor?.toLowerCase().includes(term)) ||
+        (log.details && JSON.stringify(log.details).toLowerCase().includes(term))
+      );
+    }
+ 
+    return logs;
+  }, [auditLogs, filter, searchTerm]);
+ 
+  // Real-time streaming setup
+  const startStreaming = useCallback(() => {
+    if (streamingRef.current) return;
+ 
+    const unsubscribe = client.on('audit_log', () => {
+      if (!isPaused) {
+        // Reload logs when new audit log event arrives
+        loadAuditLogs({ limit });
+      }
+    });
+ 
+    streamingRef.current = unsubscribe;
+    setIsStreaming(true);
+  }, [client, isPaused, loadAuditLogs, limit]);
+ 
+  const stopStreaming = useCallback(() => {
+    if (streamingRef.current) {
+      streamingRef.current();
+      streamingRef.current = null;
+    }
+    setIsStreaming(false);
+  }, []);
+ 
+  const togglePause = useCallback(() => {
+    setIsPaused((prev) => !prev);
+  }, []);
+ 
+  // Verify Merkle chain
+  const verifyChain = useCallback(async (log: EnhancedAuditLogEntry) => {
+    setIsVerifying(true);
+    setVerificationResult(null);
+ 
+    try {
+      // Call OpenFang API to verify the chain
+      const result = await client.verifyAuditLogChain(log.id);
+ 
+      const verification: MerkleVerificationResult = {
+        valid: result.valid ?? true,
+        chainDepth: result.chain_depth ?? 0,
+        rootHash: result.root_hash ?? '',
+        previousHash: log.previousHash ?? '',
+        currentHash: log.hash ?? '',
+        brokenAtIndex: result.broken_at_index,
+      };
+ 
+      setVerificationResult(verification);
+ 
+      if (!verification.valid && verification.brokenAtIndex !== undefined) {
+        setChainBrokenAt(verification.brokenAtIndex);
+      }
+    } catch {
+      // If API not available, do client-side verification
+      const logIndex = auditLogs.findIndex((l) => l.id === log.id);
+      const previousLog = logIndex > 0 ? (auditLogs[logIndex - 1] as EnhancedAuditLogEntry) : null;
+ 
+      // Simple verification: check if previous hash matches
+      const isValid = !previousLog || log.previousHash === previousLog.hash;
+ 
+      setVerificationResult({
+        valid: isValid,
+        chainDepth: logIndex + 1,
+        rootHash: (auditLogs[0] as EnhancedAuditLogEntry)?.hash ?? '',
+        previousHash: log.previousHash ?? '',
+        currentHash: log.hash ?? '',
+        brokenAtIndex: isValid ? undefined : logIndex,
+      });
+ 
+      if (!isValid) {
+        setChainBrokenAt(logIndex);
+      }
+    } finally {
+      setIsVerifying(false);
+    }
+  }, [client, auditLogs]);
+ 
+  // Export handlers
+  const handleExportJSON = useCallback(() => {
+    const content = exportToJSON(filteredLogs);
+    downloadFile(
+      content,
+      `audit-logs-${new Date().toISOString().slice(0, 10)}.json`,
+      'application/json'
+    );
+  }, [filteredLogs]);
+ 
+  const handleExportCSV = useCallback(() => {
+    const content = exportToCSV(filteredLogs);
+    downloadFile(
+      content,
+      `audit-logs-${new Date().toISOString().slice(0, 10)}.csv`,
+      'text/csv'
+    );
+  }, [filteredLogs]);
+ 
+  const handleResetFilters = useCallback(() => {
+    setFilter({});
+    setSearchTerm('');
+  }, []);
+ 
+  const resultColor = {
+    success: 'text-green-600 dark:text-green-400',
+    failure: 'text-red-600 dark:text-red-400',
+  };
+ 
+  if (isLoading && auditLogs.length === 0) {
+    return (
+      <div className="flex items-center justify-center h-64">
+        <Loader2 className="w-6 h-6 animate-spin text-gray-400" />
+        <span className="ml-2 text-gray-500 dark:text-gray-400">Loading...</span>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="flex h-full">
+      {/* Main Content */}
+      <div className="flex-1 flex flex-col min-w-0">
+        {/* Header */}
+        <div className="flex items-center justify-between mb-4">
+          <div className="flex items-center gap-3">
+            <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+              Audit Logs
+            </h2>
+            {/* Real-time streaming controls */}
+            <div className="flex items-center gap-1">
+              {isStreaming ? (
+                <>
+                  <button
+                    onClick={togglePause}
+                    className={`p-1.5 rounded transition-colors ${
+                      isPaused
+                        ? 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600'
+                        : 'bg-green-100 dark:bg-green-900/30 text-green-600'
+                    }`}
+                    title={isPaused ? 'Resume' : 'Pause'}
+                  >
+                    {isPaused ? <Play className="w-4 h-4" /> : <Pause className="w-4 h-4" />}
+                  </button>
+                  <button
+                    onClick={stopStreaming}
+                    className="p-1.5 rounded bg-red-100 dark:bg-red-900/30 text-red-600 hover:bg-red-200 dark:hover:bg-red-900/50 transition-colors"
+                    title="Stop streaming"
+                  >
+                    <X className="w-4 h-4" />
+                  </button>
+                  <span className="text-xs text-green-600 dark:text-green-400 flex items-center gap-1">
+                    <span className="w-1.5 h-1.5 bg-green-500 rounded-full animate-pulse" />
+                    {isPaused ? 'Paused' : 'Live'}
+                  </span>
+                </>
+              ) : (
+                <button
+                  onClick={startStreaming}
+                  className="flex items-center gap-1 px-2 py-1 text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 rounded hover:bg-blue-200 dark:hover:bg-blue-900/50 transition-colors"
+                >
+                  <Play className="w-3.5 h-3.5" />
+                  Live Stream
+                </button>
+              )}
+            </div>
+          </div>
+          <div className="flex items-center gap-2">
+            {/* Search */}
+            <div className="relative">
+              <Search className="w-4 h-4 absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-400" />
+              <input
+                type="text"
+                value={searchTerm}
+                onChange={(e) => setSearchTerm(e.target.value)}
+                placeholder="Search..."
+                className="pl-8 pr-3 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300 w-48"
+              />
+            </div>
+ 
+            {/* Filter Toggle */}
+            <button
+              onClick={() => setShowFilters(!showFilters)}
+              className={`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${
+                showFilters
+                  ? 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400'
+                  : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600'
+              }`}
+            >
+              <Filter className="w-4 h-4" />
+              Filter
+              {showFilters ? <ChevronUp className="w-4 h-4" /> : <ChevronDown className="w-4 h-4" />}
+            </button>
+ 
+            {/* Export */}
+            <div className="flex items-center gap-1">
+              <button
+                onClick={handleExportJSON}
+                className="flex items-center gap-1 px-2 py-1.5 text-sm bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 rounded-md hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors"
+                title="Export as JSON"
+              >
+                <FileJson className="w-4 h-4" />
+              </button>
+              <button
+                onClick={handleExportCSV}
+                className="flex items-center gap-1 px-2 py-1.5 text-sm bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 rounded-md hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors"
+                title="Export as CSV"
+              >
+                <FileSpreadsheet className="w-4 h-4" />
+              </button>
+            </div>
+ 
+            {/* Limit selector */}
+            <select
+              value={limit}
+              onChange={(e) => setLimit(Number(e.target.value))}
+              className="text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300 px-2 py-1"
+            >
+              <option value={25}>25</option>
+              <option value={50}>50</option>
+              <option value={100}>100</option>
+              <option value={200}>200</option>
+              <option value={500}>500</option>
+            </select>
+ 
+            {/* Refresh */}
+            <button
+              onClick={() => loadAuditLogs({ limit })}
+              disabled={isLoading}
+              className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-50"
+              title="Refresh"
+            >
+              <RefreshCw className={`w-4 h-4 ${isLoading ? 'animate-spin' : ''}`} />
+            </button>
+          </div>
+        </div>
+ 
+        {/* Filter Panel */}
+        {showFilters && (
+          <div className="mb-4">
+            <FilterPanel
+              filter={filter}
+              onFilterChange={setFilter}
+              eventTypes={eventTypes}
+              actors={actors}
+              onReset={handleResetFilters}
+            />
+          </div>
+        )}
+ 
+        {/* Hash Chain Visualization */}
+        {filteredLogs.length > 0 && (
+          <div className="mb-4">
+            <HashChainVisualization
+              logs={filteredLogs}
+              selectedIndex={selectedLog ? filteredLogs.findIndex((l) => l.id === selectedLog.id) : null}
+              onSelect={(idx) => setSelectedLog(filteredLogs[idx])}
+              brokenAtIndex={chainBrokenAt}
+            />
+          </div>
+        )}
+ 
+        {/* Log Table */}
+        <div className="flex-1 overflow-auto">
+          {filteredLogs.length === 0 ? (
+            <div className="flex flex-col items-center justify-center h-full text-gray-500 dark:text-gray-400">
+              <AlertCircle className="w-8 h-8 mb-2" />
+              <p>No audit logs found</p>
+              {(searchTerm || Object.keys(filter).length > 0) && (
+                <button
+                  onClick={handleResetFilters}
+                  className="mt-2 text-sm text-blue-600 dark:text-blue-400 hover:underline"
+                >
+                  Clear filters
+                </button>
+              )}
+            </div>
+          ) : (
+            <table className="w-full text-sm">
+              <thead className="sticky top-0 bg-white dark:bg-gray-800 z-10">
+                <tr className="border-b border-gray-200 dark:border-gray-700">
+                  <th className="text-left py-2 px-3 font-medium text-gray-700 dark:text-gray-300 w-40">Time</th>
+                  <th className="text-left py-2 px-3 font-medium text-gray-700 dark:text-gray-300">Action</th>
+                  <th className="text-left py-2 px-3 font-medium text-gray-700 dark:text-gray-300 w-32">Actor</th>
+                  <th className="text-left py-2 px-3 font-medium text-gray-700 dark:text-gray-300 w-20">Result</th>
+                  <th className="text-left py-2 px-3 font-medium text-gray-700 dark:text-gray-300 w-24">Hash</th>
+                </tr>
+              </thead>
+              <tbody>
+                {filteredLogs.map((log, index) => (
+                  <tr
+                    key={log.id || index}
+                    onClick={() => setSelectedLog(log)}
+                    className={`border-b border-gray-100 dark:border-gray-800 cursor-pointer transition-colors ${
+                      selectedLog?.id === log.id
+                        ? 'bg-blue-50 dark:bg-blue-900/20'
+                        : chainBrokenAt === index
+                        ? 'bg-red-50 dark:bg-red-900/10 hover:bg-red-100 dark:hover:bg-red-900/20'
+                        : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'
+                    }`}
+                  >
+                    <td className="py-2 px-3 text-gray-600 dark:text-gray-400">
+                      {formatTimestamp(log.timestamp)}
+                    </td>
+                    <td className="py-2 px-3 text-gray-900 dark:text-white">
+                      {truncateText(log.action, 40)}
+                    </td>
+                    <td className="py-2 px-3 text-gray-600 dark:text-gray-400">
+                      {truncateText(log.actor, 20)}
+                    </td>
+                    <td className={`py-2 px-3 ${log.result ? resultColor[log.result] : 'text-gray-600 dark:text-gray-400'}`}>
+                      <span className="flex items-center gap-1">
+                        {log.result === 'success' ? (
+                          <CheckCircle2 className="w-3.5 h-3.5" />
+                        ) : log.result === 'failure' ? (
+                          <XCircle className="w-3.5 h-3.5" />
+                        ) : null}
+                        {log.result === 'success' ? 'OK' : log.result === 'failure' ? 'Fail' : '-'}
+                      </span>
+                    </td>
+                    <td className="py-2 px-3 text-gray-500 dark:text-gray-400 font-mono text-xs">
+                      {formatHash(log.hash)}
+                    </td>
+                  </tr>
+                ))}
+              </tbody>
+            </table>
+          )}
+          <div ref={logsEndRef} />
+        </div>
+ 
+        {/* Stats Footer */}
+        <div className="flex items-center justify-between py-2 px-3 border-t border-gray-200 dark:border-gray-700 text-xs text-gray-500 dark:text-gray-400">
+          <span>
+            Showing {filteredLogs.length} of {auditLogs.length} logs
+          </span>
+          <span>
+            {chainBrokenAt !== undefined && (
+              <span className="text-red-600 dark:text-red-400">
+                Chain integrity: BROKEN at index {chainBrokenAt}
+              </span>
+            )}
+          </span>
+        </div>
+      </div>
+ 
+      {/* Detail Sidebar */}
+      {selectedLog && (
+        <LogDetailSidebar
+          log={selectedLog}
+          onClose={() => {
+            setSelectedLog(null);
+            setVerificationResult(null);
+          }}
+          onVerify={verifyChain}
+          verificationResult={verificationResult}
+          isVerifying={isVerifying}
+        />
+      )}
+    </div>
+  );
+}
+ 
+export default AuditLogsPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/ApprovalQueue.tsx.html b/desktop/coverage/src/components/Automation/ApprovalQueue.tsx.html new file mode 100644 index 0000000..1b0cb0b --- /dev/null +++ b/desktop/coverage/src/components/Automation/ApprovalQueue.tsx.html @@ -0,0 +1,1141 @@ + + + + + + Code coverage report for src/components/Automation/ApprovalQueue.tsx + + + + + + + + + +
+
+

All files / src/components/Automation ApprovalQueue.tsx

+
+ +
+ 0% + Statements + 0/248 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/248 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ApprovalQueue - Approval Management Component
+ *
+ * Displays pending approvals for hand executions that require
+ * human approval, with approve/reject actions.
+ *
+ * @module components/Automation/ApprovalQueue
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore } from '../../store/handStore';
+import type { Approval, ApprovalStatus } from '../../store/handStore';
+import {
+  Clock,
+  CheckCircle,
+  XCircle,
+  AlertTriangle,
+  RefreshCw,
+} from 'lucide-react';
+import { useToast } from '../ui/Toast';
+ 
+// === Status Config ===
+ 
+const STATUS_CONFIG: Record<ApprovalStatus, {
+  label: string;
+  className: string;
+  icon: typeof CheckCircle;
+}> = {
+  pending: {
+    label: '待处理',
+    className: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
+    icon: Clock,
+  },
+  approved: {
+    label: '已批准',
+    className: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+    icon: CheckCircle,
+  },
+  rejected: {
+    label: '已拒绝',
+    className: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+    icon: XCircle,
+  },
+  expired: {
+    label: '已过期',
+    className: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',
+    icon: AlertTriangle,
+  },
+};
+ 
+// === Component Props ===
+ 
+interface ApprovalQueueProps {
+  showFilters?: boolean;
+  maxHeight?: string;
+  onApprove?: (approval: Approval) => void;
+  onReject?: (approval: Approval) => void;
+}
+ 
+// === Approval Card Component ===
+ 
+interface ApprovalCardProps {
+  approval: Approval;
+  onApprove: () => Promise<void>;
+  onReject: (reason: string) => Promise<void>;
+  isProcessing: boolean;
+}
+ 
+function ApprovalCard({ approval, onApprove, onReject, isProcessing }: ApprovalCardProps) {
+  const [showRejectInput, setShowRejectInput] = useState(false);
+  const [rejectReason, setRejectReason] = useState('');
+  const StatusIcon = STATUS_CONFIG[approval.status].icon;
+ 
+  const handleReject = useCallback(async () => {
+    if (!rejectReason.trim()) {
+      setShowRejectInput(true);
+      return;
+    }
+    await onReject(rejectReason);
+    setShowRejectInput(false);
+    setRejectReason('');
+  }, [rejectReason, onReject]);
+ 
+  const timeAgo = useCallback((dateStr: string) => {
+    const date = new Date(dateStr);
+    const now = new Date();
+    const diffMs = now.getTime() - date.getTime();
+    const diffMins = Math.floor(diffMs / 60000);
+    const diffHours = Math.floor(diffMins / 60);
+    const diffDays = Math.floor(diffHours / 24);
+ 
+    if (diffMins < 1) return '刚刚';
+    if (diffMins < 60) return `${diffMins} 分钟前`;
+    if (diffHours < 24) return `${diffHours} 小时前`;
+    return `${diffDays} 天前`;
+  }, []);
+ 
+  return (
+    <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+      {/* Header */}
+      <div className="flex items-start justify-between gap-3 mb-3">
+        <div className="flex items-center gap-2">
+          <span className={`px-2 py-0.5 rounded text-xs ${STATUS_CONFIG[approval.status].className}`}>
+            <StatusIcon className="w-3 h-3 inline mr-1" />
+            {STATUS_CONFIG[approval.status].label}
+          </span>
+          <span className="text-xs text-gray-500 dark:text-gray-400">
+            {timeAgo(approval.requestedAt)}
+          </span>
+        </div>
+      </div>
+ 
+      {/* Content */}
+      <div className="mb-3">
+        <h4 className="font-medium text-gray-900 dark:text-white mb-1">
+          {approval.handName}
+        </h4>
+        {approval.reason && (
+          <p className="text-sm text-gray-600 dark:text-gray-400">{approval.reason}</p>
+        )}
+        {approval.action && (
+          <p className="text-xs text-gray-500 dark:text-gray-500 mt-1">
+            操作: {approval.action}
+          </p>
+        )}
+      </div>
+ 
+      {/* Params Preview */}
+      {approval.params && Object.keys(approval.params).length > 0 && (
+        <div className="mb-3 p-2 bg-gray-50 dark:bg-gray-900 rounded text-xs">
+          <p className="text-gray-500 dark:text-gray-400 mb-1">参数:</p>
+          <pre className="text-gray-700 dark:text-gray-300 overflow-x-auto">
+            {JSON.stringify(approval.params, null, 2)}
+          </pre>
+        </div>
+      )}
+ 
+      {/* Reject Input */}
+      {showRejectInput && (
+        <div className="mb-3">
+          <textarea
+            value={rejectReason}
+            onChange={(e) => setRejectReason(e.target.value)}
+            placeholder="请输入拒绝原因..."
+            className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white resize-none"
+            rows={2}
+          />
+        </div>
+      )}
+ 
+      {/* Actions */}
+      {approval.status === 'pending' && (
+        <div className="flex items-center gap-2">
+          <button
+            onClick={onApprove}
+            disabled={isProcessing}
+            className="flex-1 px-3 py-1.5 text-sm bg-green-500 text-white rounded-md hover:bg-green-600 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-1"
+          >
+            {isProcessing ? (
+              <RefreshCw className="w-3.5 h-3.5 animate-spin" />
+            ) : (
+              <CheckCircle className="w-3.5 h-3.5" />
+            )}
+            批准
+          </button>
+          <button
+            onClick={handleReject}
+            disabled={isProcessing}
+            className="flex-1 px-3 py-1.5 text-sm bg-red-500 text-white rounded-md hover:bg-red-600 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-1"
+          >
+            {isProcessing ? (
+              <RefreshCw className="w-3.5 h-3.5 animate-spin" />
+            ) : (
+              <XCircle className="w-3.5 h-3.5" />
+            )}
+            拒绝
+          </button>
+        </div>
+      )}
+ 
+      {/* Response Info */}
+      {approval.status !== 'pending' && approval.respondedAt && (
+        <div className="text-xs text-gray-500 dark:text-gray-400">
+          {approval.respondedBy && `由 ${approval.respondedBy} `}
+          {STATUS_CONFIG[approval.status].label}
+          {approval.responseReason && ` - ${approval.responseReason}`}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function ApprovalQueue({
+  showFilters = true,
+  maxHeight = '400px',
+  onApprove,
+  onReject,
+}: ApprovalQueueProps) {
+  const { toast } = useToast();
+ 
+  // Store state
+  const approvals = useHandStore(s => s.approvals);
+  const loadApprovals = useHandStore(s => s.loadApprovals);
+  const respondToApproval = useHandStore(s => s.respondToApproval);
+  const isLoading = useHandStore(s => s.isLoading);
+ 
+  // Local state
+  const [statusFilter, setStatusFilter] = useState<ApprovalStatus | 'all'>('pending');
+  const [processingIds, setProcessingIds] = useState<Set<string>>(new Set());
+ 
+  // Load approvals on mount
+  useEffect(() => {
+    loadApprovals(statusFilter === 'all' ? undefined : statusFilter);
+  }, [loadApprovals, statusFilter]);
+ 
+  // Handle approve
+  const handleApprove = useCallback(async (approval: Approval) => {
+    setProcessingIds(prev => new Set(prev).add(approval.id));
+    try {
+      await respondToApproval(approval.id, true);
+      toast(`已批准: ${approval.handName}`, 'success');
+      onApprove?.(approval);
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      toast(`批准失败: ${errorMsg}`, 'error');
+    } finally {
+      setProcessingIds(prev => {
+        const next = new Set(prev);
+        next.delete(approval.id);
+        return next;
+      });
+    }
+  }, [respondToApproval, toast, onApprove]);
+ 
+  // Handle reject
+  const handleReject = useCallback(async (approval: Approval, reason: string) => {
+    setProcessingIds(prev => new Set(prev).add(approval.id));
+    try {
+      await respondToApproval(approval.id, false, reason);
+      toast(`已拒绝: ${approval.handName}`, 'success');
+      onReject?.(approval);
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      toast(`拒绝失败: ${errorMsg}`, 'error');
+    } finally {
+      setProcessingIds(prev => {
+        const next = new Set(prev);
+        next.delete(approval.id);
+        return next;
+      });
+    }
+  }, [respondToApproval, toast, onReject]);
+ 
+  // Filter approvals
+  const filteredApprovals = statusFilter === 'all'
+    ? approvals
+    : approvals.filter(a => a.status === statusFilter);
+ 
+  // Stats
+  const stats = {
+    pending: approvals.filter(a => a.status === 'pending').length,
+    approved: approvals.filter(a => a.status === 'approved').length,
+    rejected: approvals.filter(a => a.status === 'rejected').length,
+    expired: approvals.filter(a => a.status === 'expired').length,
+  };
+ 
+  return (
+    <div className="flex flex-col h-full">
+      {/* Header */}
+      <div className="flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Clock className="w-5 h-5 text-orange-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            审批队列
+          </h2>
+          {stats.pending > 0 && (
+            <span className="px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400 rounded-full">
+              {stats.pending} 待处理
+            </span>
+          )}
+        </div>
+        <button
+          onClick={() => loadApprovals(statusFilter === 'all' ? undefined : statusFilter)}
+          disabled={isLoading}
+          className="p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300 disabled:opacity-50"
+          title="刷新"
+        >
+          <RefreshCw className={`w-4 h-4 ${isLoading ? 'animate-spin' : ''}`} />
+        </button>
+      </div>
+ 
+      {/* Filters */}
+      {showFilters && (
+        <div className="flex items-center gap-2 px-4 py-2 border-b border-gray-200 dark:border-gray-700 overflow-x-auto">
+          {[
+            { value: 'pending', label: '待处理', count: stats.pending },
+            { value: 'approved', label: '已批准', count: stats.approved },
+            { value: 'rejected', label: '已拒绝', count: stats.rejected },
+            { value: 'all', label: '全部', count: approvals.length },
+          ].map(option => (
+            <button
+              key={option.value}
+              onClick={() => setStatusFilter(option.value as ApprovalStatus | 'all')}
+              className={`flex items-center gap-1 px-3 py-1 text-sm rounded-full whitespace-nowrap transition-colors ${
+                statusFilter === option.value
+                  ? 'bg-orange-500 text-white'
+                  : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700'
+              }`}
+            >
+              {option.label}
+              <span className={`text-xs ${statusFilter === option.value ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'}`}>
+                ({option.count})
+              </span>
+            </button>
+          ))}
+        </div>
+      )}
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4" style={{ maxHeight }}>
+        {isLoading && approvals.length === 0 ? (
+          <div className="flex items-center justify-center h-32">
+            <RefreshCw className="w-6 h-6 animate-spin text-gray-400" />
+          </div>
+        ) : filteredApprovals.length === 0 ? (
+          <div className="flex flex-col items-center justify-center h-32 text-center">
+            <Clock className="w-8 h-8 text-gray-400 mb-2" />
+            <p className="text-sm text-gray-500 dark:text-gray-400">
+              {statusFilter === 'pending' ? '暂无待处理的审批' : '暂无审批记录'}
+            </p>
+          </div>
+        ) : (
+          <div className="space-y-3">
+            {filteredApprovals.map(approval => (
+              <ApprovalCard
+                key={approval.id}
+                approval={approval}
+                onApprove={() => handleApprove(approval)}
+                onReject={(reason) => handleReject(approval, reason)}
+                isProcessing={processingIds.has(approval.id)}
+              />
+            ))}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default ApprovalQueue;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/AutomationCard.tsx.html b/desktop/coverage/src/components/Automation/AutomationCard.tsx.html new file mode 100644 index 0000000..617735b --- /dev/null +++ b/desktop/coverage/src/components/Automation/AutomationCard.tsx.html @@ -0,0 +1,1291 @@ + + + + + + Code coverage report for src/components/Automation/AutomationCard.tsx + + + + + + + + + +
+
+

All files / src/components/Automation AutomationCard.tsx

+
+ +
+ 0% + Statements + 0/278 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/278 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AutomationCard - Unified Card for Hands and Workflows
+ *
+ * Displays automation items with status, parameters, and actions.
+ * Supports both grid and list view modes.
+ *
+ * @module components/Automation/AutomationCard
+ */
+ 
+import { useState, useCallback } from 'react';
+import type { AutomationItem, AutomationStatus } from '../../types/automation';
+import { CATEGORY_CONFIGS } from '../../types/automation';
+import type { HandParameter } from '../../types/hands';
+import { HandParamsForm } from '../HandParamsForm';
+import {
+  Zap,
+  Clock,
+  CheckCircle,
+  XCircle,
+  AlertTriangle,
+  Loader2,
+  Settings,
+  Play,
+  MoreVertical,
+} from 'lucide-react';
+ 
+// === Status Config ===
+ 
+const STATUS_CONFIG: Record<AutomationStatus, {
+  label: string;
+  className: string;
+  dotClass: string;
+  icon?: typeof CheckCircle;
+}> = {
+  idle: {
+    label: '就绪',
+    className: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+    dotClass: 'bg-green-500',
+  },
+  running: {
+    label: '运行中',
+    className: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',
+    dotClass: 'bg-blue-500 animate-pulse',
+    icon: Loader2,
+  },
+  needs_approval: {
+    label: '待审批',
+    className: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
+    dotClass: 'bg-yellow-500',
+    icon: AlertTriangle,
+  },
+  error: {
+    label: '错误',
+    className: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+    dotClass: 'bg-red-500',
+    icon: XCircle,
+  },
+  unavailable: {
+    label: '不可用',
+    className: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',
+    dotClass: 'bg-gray-400',
+  },
+  setup_needed: {
+    label: '需配置',
+    className: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400',
+    dotClass: 'bg-orange-500',
+    icon: Settings,
+  },
+  completed: {
+    label: '已完成',
+    className: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+    dotClass: 'bg-green-500',
+    icon: CheckCircle,
+  },
+  paused: {
+    label: '已暂停',
+    className: 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400',
+    dotClass: 'bg-gray-400',
+  },
+};
+ 
+// === Component Props ===
+ 
+interface AutomationCardProps {
+  item: AutomationItem;
+  viewMode?: 'grid' | 'list';
+  isSelected?: boolean;
+  isExecuting?: boolean;
+  onSelect?: (selected: boolean) => void;
+  onExecute?: (params?: Record<string, unknown>) => void;
+  onClick?: () => void;
+}
+ 
+// === Status Badge Component ===
+ 
+function StatusBadge({ status }: { status: AutomationStatus }) {
+  const config = STATUS_CONFIG[status] || STATUS_CONFIG.unavailable;
+  const Icon = config.icon;
+ 
+  return (
+    <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium ${config.className}`}>
+      {Icon ? (
+        <Icon className={`w-3 h-3 ${status === 'running' ? 'animate-spin' : ''}`} />
+      ) : (
+        <span className={`w-1.5 h-1.5 rounded-full ${config.dotClass}`} />
+      )}
+      {config.label}
+    </span>
+  );
+}
+ 
+// === Type Badge Component ===
+ 
+function TypeBadge({ type }: { type: 'hand' | 'workflow' }) {
+  const isHand = type === 'hand';
+  return (
+    <span className={`px-2 py-0.5 rounded text-xs ${
+      isHand
+        ? 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400'
+        : 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400'
+    }`}>
+      {isHand ? '自主能力' : '工作流'}
+    </span>
+  );
+}
+ 
+// === Category Badge Component ===
+ 
+function CategoryBadge({ category }: { category: string }) {
+  const config = CATEGORY_CONFIGS[category as keyof typeof CATEGORY_CONFIGS];
+  if (!config) return null;
+ 
+  return (
+    <span className="px-2 py-0.5 rounded text-xs bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400">
+      {config.label}
+    </span>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function AutomationCard({
+  item,
+  viewMode = 'grid',
+  isSelected = false,
+  isExecuting = false,
+  onSelect,
+  onExecute,
+  onClick,
+}: AutomationCardProps) {
+  const [showParams, setShowParams] = useState(false);
+  const [paramValues, setParamValues] = useState<Record<string, unknown>>({});
+  const [paramErrors, setParamErrors] = useState<Record<string, string>>({});
+ 
+  const hasParameters = item.parameters && item.parameters.length > 0;
+  const canActivate = item.status === 'idle' || item.status === 'setup_needed';
+ 
+  // Initialize default parameter values
+  const initializeDefaults = useCallback(() => {
+    if (item.parameters) {
+      const defaults: Record<string, unknown> = {};
+      item.parameters.forEach(p => {
+        if (p.defaultValue !== undefined) {
+          defaults[p.name] = p.defaultValue;
+        }
+      });
+      setParamValues(defaults);
+    }
+  }, [item.parameters]);
+ 
+  // Handle execute click
+  const handleExecuteClick = useCallback(() => {
+    if (hasParameters && !showParams) {
+      initializeDefaults();
+      setShowParams(true);
+      return;
+    }
+ 
+    // Validate parameters
+    if (showParams && item.parameters) {
+      const errors: Record<string, string> = {};
+      item.parameters.forEach(param => {
+        if (param.required) {
+          const value = paramValues[param.name];
+          if (value === undefined || value === null || value === '') {
+            errors[param.name] = `${param.label} is required`;
+          }
+        }
+      });
+ 
+      if (Object.keys(errors).length > 0) {
+        setParamErrors(errors);
+        return;
+      }
+    }
+ 
+    onExecute?.(showParams ? paramValues : undefined);
+    setShowParams(false);
+    setParamErrors({});
+  }, [hasParameters, showParams, initializeDefaults, item.parameters, paramValues, onExecute]);
+ 
+  // Handle checkbox change
+  const handleCheckboxChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    e.stopPropagation();
+    onSelect?.(e.target.checked);
+  }, [onSelect]);
+ 
+  // Get icon for item
+  const getItemIcon = () => {
+    if (item.icon) {
+      // Map string icon names to components
+      const iconMap: Record<string, string> = {
+        Video: '🎬',
+        UserPlus: '👤',
+        Database: '🗄️',
+        TrendingUp: '📈',
+        Search: '🔍',
+        Twitter: '🐦',
+        Globe: '🌐',
+        Zap: '⚡',
+      };
+      return iconMap[item.icon] || '🤖';
+    }
+    return item.type === 'hand' ? '🤖' : '📋';
+  };
+ 
+  if (viewMode === 'list') {
+    return (
+      <div
+        className={`flex items-center gap-3 p-3 bg-white dark:bg-gray-800 rounded-lg border transition-all cursor-pointer ${
+          isSelected
+            ? 'border-orange-500 ring-1 ring-orange-500'
+            : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+        }`}
+        onClick={onClick}
+      >
+        {/* Checkbox */}
+        <input
+          type="checkbox"
+          checked={isSelected}
+          onChange={handleCheckboxChange}
+          className="w-4 h-4 rounded border-gray-300 text-orange-500 focus:ring-orange-500"
+          onClick={e => e.stopPropagation()}
+        />
+ 
+        {/* Icon */}
+        <span className="text-xl flex-shrink-0">{getItemIcon()}</span>
+ 
+        {/* Info */}
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2">
+            <h3 className="font-medium text-gray-900 dark:text-white truncate">{item.name}</h3>
+            <TypeBadge type={item.type} />
+          </div>
+          <p className="text-sm text-gray-500 dark:text-gray-400 truncate">{item.description}</p>
+        </div>
+ 
+        {/* Status */}
+        <StatusBadge status={item.status} />
+ 
+        {/* Actions */}
+        <div className="flex items-center gap-1">
+          <button
+            onClick={(e) => {
+              e.stopPropagation();
+              handleExecuteClick();
+            }}
+            disabled={!canActivate || isExecuting}
+            className="px-3 py-1.5 text-sm bg-orange-500 text-white rounded-md hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
+          >
+            {isExecuting ? (
+              <>
+                <Loader2 className="w-3.5 h-3.5 animate-spin" />
+                执行中
+              </>
+            ) : (
+              <>
+                <Play className="w-3.5 h-3.5" />
+                执行
+              </>
+            )}
+          </button>
+          <button
+            onClick={e => e.stopPropagation()}
+            className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+          >
+            <MoreVertical className="w-4 h-4" />
+          </button>
+        </div>
+      </div>
+    );
+  }
+ 
+  // Grid view
+  return (
+    <div
+      className={`relative bg-white dark:bg-gray-800 rounded-lg border transition-all ${
+        isSelected
+          ? 'border-orange-500 ring-1 ring-orange-500'
+          : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+      }`}
+      onClick={onClick}
+    >
+      {/* Selection checkbox */}
+      <div className="absolute top-2 left-2">
+        <input
+          type="checkbox"
+          checked={isSelected}
+          onChange={handleCheckboxChange}
+          className="w-4 h-4 rounded border-gray-300 text-orange-500 focus:ring-orange-500"
+          onClick={e => e.stopPropagation()}
+        />
+      </div>
+ 
+      {/* Content */}
+      <div className="p-4 pt-8">
+        {/* Header */}
+        <div className="flex items-start justify-between gap-3 mb-2">
+          <div className="flex items-center gap-2 min-w-0">
+            <span className="text-xl flex-shrink-0">{getItemIcon()}</span>
+            <h3 className="font-medium text-gray-900 dark:text-white truncate">{item.name}</h3>
+          </div>
+          <StatusBadge status={item.status} />
+        </div>
+ 
+        {/* Description */}
+        <p className="text-sm text-gray-600 dark:text-gray-400 mb-3 line-clamp-2">{item.description}</p>
+ 
+        {/* Meta */}
+        <div className="flex items-center gap-2 mb-3">
+          <TypeBadge type={item.type} />
+          <CategoryBadge category={item.category} />
+          {item.schedule?.enabled && (
+            <span className="flex items-center gap-1 text-xs text-gray-500 dark:text-gray-400">
+              <Clock className="w-3 h-3" />
+              已调度
+            </span>
+          )}
+        </div>
+ 
+        {/* Parameters Form (shown when activating) */}
+        {showParams && item.parameters && item.parameters.length > 0 && (
+          <div className="mb-3 p-3 bg-gray-50 dark:bg-gray-900 rounded-lg">
+            <HandParamsForm
+              parameters={item.parameters as HandParameter[]}
+              values={paramValues}
+              onChange={setParamValues}
+              errors={paramErrors}
+              disabled={isExecuting}
+              presetKey={`${item.type}-${item.id}`}
+            />
+          </div>
+        )}
+ 
+        {/* Actions */}
+        <div className="flex items-center gap-2">
+          <button
+            onClick={(e) => {
+              e.stopPropagation();
+              handleExecuteClick();
+            }}
+            disabled={!canActivate || isExecuting}
+            className="flex-1 px-3 py-1.5 text-sm bg-orange-500 text-white rounded-md hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-1"
+          >
+            {isExecuting ? (
+              <>
+                <Loader2 className="w-3.5 h-3.5 animate-spin" />
+                执行中...
+              </>
+            ) : showParams ? (
+              <>
+                <Play className="w-3.5 h-3.5" />
+                确认执行
+              </>
+            ) : (
+              <>
+                <Zap className="w-3.5 h-3.5" />
+                执行
+              </>
+            )}
+          </button>
+          <button
+            onClick={e => e.stopPropagation()}
+            className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+            title="更多选项"
+          >
+            <MoreVertical className="w-4 h-4" />
+          </button>
+        </div>
+ 
+        {/* Schedule indicator */}
+        {item.schedule?.nextRun && (
+          <div className="mt-2 text-xs text-gray-500 dark:text-gray-400">
+            下次运行: {new Date(item.schedule.nextRun).toLocaleString('zh-CN')}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default AutomationCard;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/AutomationFilters.tsx.html b/desktop/coverage/src/components/Automation/AutomationFilters.tsx.html new file mode 100644 index 0000000..ef197bd --- /dev/null +++ b/desktop/coverage/src/components/Automation/AutomationFilters.tsx.html @@ -0,0 +1,697 @@ + + + + + + Code coverage report for src/components/Automation/AutomationFilters.tsx + + + + + + + + + +
+
+

All files / src/components/Automation AutomationFilters.tsx

+
+ +
+ 0% + Statements + 0/132 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/132 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AutomationFilters - Category and Search Filters
+ *
+ * Provides category tabs, search input, and view mode toggle
+ * for the automation panel.
+ *
+ * @module components/Automation/AutomationFilters
+ */
+ 
+import { useState, useCallback } from 'react';
+import type { CategoryType, CategoryStats } from '../../types/automation';
+import { CATEGORY_CONFIGS } from '../../types/automation';
+import {
+  Search,
+  Grid,
+  List,
+  Layers,
+  Database,
+  MessageSquare,
+  Video,
+  TrendingUp,
+  Zap,
+  ChevronDown,
+} from 'lucide-react';
+ 
+// === Icon Map ===
+ 
+const CATEGORY_ICONS: Record<CategoryType, typeof Layers> = {
+  all: Layers,
+  research: Search,
+  data: Database,
+  automation: Zap,
+  communication: MessageSquare,
+  content: Video,
+  productivity: TrendingUp,
+};
+ 
+// === Component Props ===
+ 
+interface AutomationFiltersProps {
+  selectedCategory: CategoryType;
+  onCategoryChange: (category: CategoryType) => void;
+  searchQuery: string;
+  onSearchChange: (query: string) => void;
+  viewMode: 'grid' | 'list';
+  onViewModeChange: (mode: 'grid' | 'list') => void;
+  categoryStats: CategoryStats;
+}
+ 
+// === Main Component ===
+ 
+export function AutomationFilters({
+  selectedCategory,
+  onCategoryChange,
+  searchQuery,
+  onSearchChange,
+  viewMode,
+  onViewModeChange,
+  categoryStats,
+}: AutomationFiltersProps) {
+  const [showCategoryDropdown, setShowCategoryDropdown] = useState(false);
+ 
+  // Handle search input
+  const handleSearchChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    onSearchChange(e.target.value);
+  }, [onSearchChange]);
+ 
+  // Handle category click
+  const handleCategoryClick = useCallback((category: CategoryType) => {
+    onCategoryChange(category);
+    setShowCategoryDropdown(false);
+  }, [onCategoryChange]);
+ 
+  // Get categories with counts
+  const categories = Object.entries(CATEGORY_CONFIGS).map(([key, config]) => ({
+    ...config,
+    count: categoryStats[key as CategoryType] || 0,
+  }));
+ 
+  // Selected category config
+  const selectedConfig = CATEGORY_CONFIGS[selectedCategory];
+ 
+  return (
+    <div className="px-4 py-3 border-b border-gray-200 dark:border-gray-700 space-y-3">
+      {/* Search and View Mode Row */}
+      <div className="flex items-center gap-3">
+        {/* Search Input */}
+        <div className="flex-1 relative">
+          <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
+          <input
+            type="text"
+            placeholder="搜索 Hands 或工作流..."
+            value={searchQuery}
+            onChange={handleSearchChange}
+            className="w-full pl-10 pr-4 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent"
+          />
+        </div>
+ 
+        {/* View Mode Toggle */}
+        <div className="flex items-center border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden">
+          <button
+            onClick={() => onViewModeChange('grid')}
+            className={`p-2 ${
+              viewMode === 'grid'
+                ? 'bg-orange-500 text-white'
+                : 'bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700'
+            }`}
+            title="网格视图"
+          >
+            <Grid className="w-4 h-4" />
+          </button>
+          <button
+            onClick={() => onViewModeChange('list')}
+            className={`p-2 ${
+              viewMode === 'list'
+                ? 'bg-orange-500 text-white'
+                : 'bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700'
+            }`}
+            title="列表视图"
+          >
+            <List className="w-4 h-4" />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Category Tabs (Desktop) */}
+      <div className="hidden md:flex items-center gap-1 overflow-x-auto pb-1">
+        {categories.map(({ id, label, count }) => {
+          const Icon = CATEGORY_ICONS[id];
+          const isSelected = selectedCategory === id;
+ 
+          return (
+            <button
+              key={id}
+              onClick={() => onCategoryChange(id)}
+              className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-full whitespace-nowrap transition-colors ${
+                isSelected
+                  ? 'bg-orange-500 text-white'
+                  : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700'
+              }`}
+            >
+              <Icon className="w-3.5 h-3.5" />
+              {label}
+              {count > 0 && (
+                <span className={`text-xs ${isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'}`}>
+                  ({count})
+                </span>
+              )}
+            </button>
+          );
+        })}
+      </div>
+ 
+      {/* Category Dropdown (Mobile) */}
+      <div className="md:hidden relative">
+        <button
+          onClick={() => setShowCategoryDropdown(!showCategoryDropdown)}
+          className="w-full flex items-center justify-between px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white"
+        >
+          <div className="flex items-center gap-2">
+            {(() => {
+              const Icon = CATEGORY_ICONS[selectedCategory];
+              return <Icon className="w-4 h-4" />;
+            })()}
+            <span>{selectedConfig.label}</span>
+            <span className="text-gray-500 dark:text-gray-400">
+              ({categoryStats[selectedCategory] || 0})
+            </span>
+          </div>
+          <ChevronDown className={`w-4 h-4 transition-transform ${showCategoryDropdown ? 'rotate-180' : ''}`} />
+        </button>
+ 
+        {showCategoryDropdown && (
+          <div className="absolute top-full left-0 right-0 mt-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-10 max-h-64 overflow-y-auto">
+            {categories.map(({ id, label, count }) => {
+              const Icon = CATEGORY_ICONS[id];
+              const isSelected = selectedCategory === id;
+ 
+              return (
+                <button
+                  key={id}
+                  onClick={() => handleCategoryClick(id)}
+                  className={`w-full flex items-center justify-between px-3 py-2 text-sm ${
+                    isSelected
+                      ? 'bg-orange-50 dark:bg-orange-900/20 text-orange-600 dark:text-orange-400'
+                      : 'text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700'
+                  }`}
+                >
+                  <div className="flex items-center gap-2">
+                    <Icon className="w-4 h-4" />
+                    <span>{label}</span>
+                  </div>
+                  <span className="text-gray-500 dark:text-gray-400">{count}</span>
+                </button>
+              );
+            })}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default AutomationFilters;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/AutomationPanel.tsx.html b/desktop/coverage/src/components/Automation/AutomationPanel.tsx.html new file mode 100644 index 0000000..2eee732 --- /dev/null +++ b/desktop/coverage/src/components/Automation/AutomationPanel.tsx.html @@ -0,0 +1,1474 @@ + + + + + + Code coverage report for src/components/Automation/AutomationPanel.tsx + + + + + + + + + +
+
+

All files / src/components/Automation AutomationPanel.tsx

+
+ +
+ 0% + Statements + 0/331 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/331 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AutomationPanel - Unified Automation Entry Point
+ *
+ * Combines Pipelines, Hands and Workflows into a single unified view,
+ * with category filtering, batch operations, and scheduling.
+ *
+ * @module components/Automation/AutomationPanel
+ */
+ 
+import { useState, useEffect, useCallback, useMemo } from 'react';
+import { useHandStore } from '../../store/handStore';
+import { useWorkflowStore } from '../../store/workflowStore';
+import {
+  type AutomationItem,
+  type CategoryType,
+  type CategoryStats,
+  adaptToAutomationItems,
+  calculateCategoryStats,
+  filterByCategory,
+  searchAutomationItems,
+} from '../../types/automation';
+import { AutomationCard } from './AutomationCard';
+import { AutomationFilters } from './AutomationFilters';
+import { BatchActionBar } from './BatchActionBar';
+import { PipelinesPanel } from '../PipelinesPanel';
+import {
+  Zap,
+  RefreshCw,
+  Plus,
+  Calendar,
+  Search,
+  X,
+  Package,
+  Bot,
+  Workflow,
+} from 'lucide-react';
+import { useToast } from '../ui/Toast';
+ 
+// === View Mode ===
+ 
+type ViewMode = 'grid' | 'list';
+ 
+// === Tab Type ===
+ 
+type AutomationTab = 'pipelines' | 'hands' | 'workflows';
+ 
+// === Component Props ===
+ 
+interface AutomationPanelProps {
+  initialCategory?: CategoryType;
+  initialTab?: AutomationTab;
+  onSelect?: (item: AutomationItem) => void;
+  showBatchActions?: boolean;
+}
+ 
+// === Tab Configuration ===
+ 
+const TAB_CONFIG: { key: AutomationTab; label: string; icon: React.ComponentType<{ className?: string }> }[] = [
+  { key: 'pipelines', label: 'Pipelines', icon: Package },
+  { key: 'hands', label: 'Hands', icon: Bot },
+  { key: 'workflows', label: 'Workflows', icon: Workflow },
+];
+ 
+// === Main Component ===
+ 
+export function AutomationPanel({
+  initialCategory = 'all',
+  initialTab = 'pipelines',
+  onSelect,
+  showBatchActions = true,
+}: AutomationPanelProps) {
+  // Store state - use domain stores
+  const hands = useHandStore((s) => s.hands);
+  const workflows = useWorkflowStore((s) => s.workflows);
+  const handLoading = useHandStore((s) => s.isLoading);
+  const workflowLoading = useWorkflowStore((s) => s.isLoading);
+  const isLoading = handLoading || workflowLoading;
+  const loadHands = useHandStore((s) => s.loadHands);
+  const loadWorkflows = useWorkflowStore((s) => s.loadWorkflows);
+  const triggerHand = useHandStore((s) => s.triggerHand);
+  const triggerWorkflow = useWorkflowStore((s) => s.triggerWorkflow);
+ 
+  // UI state
+  const [activeTab, setActiveTab] = useState<AutomationTab>(initialTab);
+  const [selectedCategory, setSelectedCategory] = useState<CategoryType>(initialCategory);
+  const [searchQuery, setSearchQuery] = useState('');
+  const [viewMode, setViewMode] = useState<ViewMode>('grid');
+  const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());
+  const [executingIds, setExecutingIds] = useState<Set<string>>(new Set());
+  const [showWorkflowDialog, setShowWorkflowDialog] = useState(false);
+  const [showSchedulerDialog, setShowSchedulerDialog] = useState(false);
+ 
+  const { toast } = useToast();
+ 
+  // Load data on mount
+  useEffect(() => {
+    loadHands();
+    loadWorkflows();
+  }, [loadHands, loadWorkflows]);
+ 
+  // Adapt hands and workflows to automation items
+  const automationItems = useMemo<AutomationItem[]>(() => {
+    return adaptToAutomationItems(hands, workflows);
+  }, [hands, workflows]);
+ 
+  // Calculate category stats
+  const categoryStats = useMemo<CategoryStats>(() => {
+    return calculateCategoryStats(automationItems);
+  }, [automationItems]);
+ 
+  // Filter and search items
+  const filteredItems = useMemo<AutomationItem[]>(() => {
+    let items = filterByCategory(automationItems, selectedCategory);
+    if (searchQuery.trim()) {
+      items = searchAutomationItems(items, searchQuery);
+    }
+    // Filter by tab
+    if (activeTab === 'hands') {
+      items = items.filter(item => item.type === 'hand');
+    } else if (activeTab === 'workflows') {
+      items = items.filter(item => item.type === 'workflow');
+    }
+    return items;
+  }, [automationItems, selectedCategory, searchQuery, activeTab]);
+ 
+  // Selection handlers
+  const handleSelect = useCallback((id: string, selected: boolean) => {
+    setSelectedIds(prev => {
+      const next = new Set(prev);
+      if (selected) {
+        next.add(id);
+      } else {
+        next.delete(id);
+      }
+      return next;
+    });
+  }, []);
+ 
+  const handleSelectAll = useCallback(() => {
+    setSelectedIds(new Set(filteredItems.map(item => item.id)));
+  }, [filteredItems]);
+ 
+  const handleDeselectAll = useCallback(() => {
+    setSelectedIds(new Set());
+  }, []);
+ 
+  // Workflow dialog handlers
+  const handleCreateWorkflow = useCallback(() => {
+    setShowWorkflowDialog(true);
+  }, []);
+ 
+  const handleSchedulerManage = useCallback(() => {
+    setShowSchedulerDialog(true);
+  }, []);
+ 
+  // Execute handler
+  const handleExecute = useCallback(async (item: AutomationItem, params?: Record<string, unknown>) => {
+    setExecutingIds(prev => new Set(prev).add(item.id));
+ 
+    try {
+      if (item.type === 'hand') {
+        await triggerHand(item.id, params);
+      } else {
+        await triggerWorkflow(item.id, params);
+      }
+      toast(`${item.name} 执行成功`, 'success');
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      toast(`${item.name} 执行失败: ${errorMsg}`, 'error');
+    } finally {
+      setExecutingIds(prev => {
+        const next = new Set(prev);
+        next.delete(item.id);
+        return next;
+      });
+    }
+  }, [triggerHand, triggerWorkflow, toast]);
+ 
+  // Batch execute
+  const handleBatchExecute = useCallback(async () => {
+    const itemsToExecute = filteredItems.filter(item => selectedIds.has(item.id));
+    let successCount = 0;
+    let failCount = 0;
+ 
+    for (const item of itemsToExecute) {
+      try {
+        if (item.type === 'hand') {
+          await triggerHand(item.id);
+        } else {
+          await triggerWorkflow(item.id);
+        }
+        successCount++;
+      } catch {
+        failCount++;
+      }
+    }
+ 
+    if (successCount > 0) {
+      toast(`成功执行 ${successCount} 个项目`, 'success');
+    }
+    if (failCount > 0) {
+      toast(`${failCount} 个项目执行失败`, 'error');
+    }
+ 
+    setSelectedIds(new Set());
+  }, [filteredItems, selectedIds, triggerHand, triggerWorkflow, toast]);
+ 
+  // Refresh handler
+  const handleRefresh = useCallback(async () => {
+    await Promise.all([loadHands(), loadWorkflows()]);
+    toast('数据已刷新', 'success');
+  }, [loadHands, loadWorkflows, toast]);
+ 
+  // If Pipelines tab is active, show PipelinesPanel directly
+  if (activeTab === 'pipelines') {
+    return (
+      <div className="flex flex-col h-full">
+        {/* Header with Tabs */}
+        <div className="flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700">
+          <div className="flex items-center gap-2">
+            <Package className="w-5 h-5 text-blue-500" />
+            <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+              自动化
+            </h2>
+          </div>
+          {/* Tab Switcher */}
+          <div className="flex items-center bg-gray-100 dark:bg-gray-800 rounded-lg p-1">
+            {TAB_CONFIG.map(({ key, label, icon: Icon }) => (
+              <button
+                key={key}
+                onClick={() => setActiveTab(key)}
+                className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${
+                  activeTab === key
+                    ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
+                    : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'
+                }`}
+              >
+                <Icon className="w-4 h-4" />
+                {label}
+              </button>
+            ))}
+          </div>
+        </div>
+ 
+        {/* Pipelines Panel */}
+        <div className="flex-1 overflow-hidden">
+          <PipelinesPanel />
+        </div>
+      </div>
+    );
+  }
+ 
+  // Hands and Workflows tabs
+  return (
+    <div className="flex flex-col h-full">
+      {/* Header */}
+      <div className="flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Zap className="w-5 h-5 text-orange-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            自动化
+          </h2>
+          <span className="text-sm text-gray-500 dark:text-gray-400">
+            ({automationItems.length})
+          </span>
+        </div>
+        <div className="flex items-center gap-2">
+          {/* Tab Switcher */}
+          <div className="flex items-center bg-gray-100 dark:bg-gray-800 rounded-lg p-1 mr-2">
+            {TAB_CONFIG.map(({ key, label, icon: Icon }) => (
+              <button
+                key={key}
+                onClick={() => setActiveTab(key)}
+                className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${
+                  activeTab === key
+                    ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
+                    : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'
+                }`}
+              >
+                <Icon className="w-4 h-4" />
+                {label}
+              </button>
+            ))}
+          </div>
+          <button
+            onClick={handleRefresh}
+            disabled={isLoading}
+            className="p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300 disabled:opacity-50"
+            title="刷新"
+          >
+            <RefreshCw className={`w-4 h-4 ${isLoading ? 'animate-spin' : ''}`} />
+          </button>
+          <button
+            onClick={handleCreateWorkflow}
+            className="p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
+            title="新建工作流"
+          >
+            <Plus className="w-4 h-4" />
+          </button>
+          <button
+            onClick={handleSchedulerManage}
+            className="p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
+            title="调度管理"
+          >
+            <Calendar className="w-4 h-4" />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Filters */}
+      <AutomationFilters
+        selectedCategory={selectedCategory}
+        onCategoryChange={setSelectedCategory}
+        searchQuery={searchQuery}
+        onSearchChange={setSearchQuery}
+        viewMode={viewMode}
+        onViewModeChange={setViewMode}
+        categoryStats={categoryStats}
+      />
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4">
+        {isLoading && automationItems.length === 0 ? (
+          <div className="flex items-center justify-center h-32">
+            <RefreshCw className="w-6 h-6 animate-spin text-gray-400" />
+          </div>
+        ) : filteredItems.length === 0 ? (
+          <div className="flex flex-col items-center justify-center h-32 text-center">
+            <Search className="w-8 h-8 text-gray-400 mb-2" />
+            <p className="text-sm text-gray-500 dark:text-gray-400">
+              {searchQuery ? '没有找到匹配的项目' : '暂无自动化项目'}
+            </p>
+          </div>
+        ) : (
+          <div className={
+            viewMode === 'grid'
+              ? 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4'
+              : 'flex flex-col gap-2'
+          }>
+            {filteredItems.map(item => (
+              <AutomationCard
+                key={item.id}
+                item={item}
+                viewMode={viewMode}
+                isSelected={selectedIds.has(item.id)}
+                isExecuting={executingIds.has(item.id)}
+                onSelect={(selected) => handleSelect(item.id, selected)}
+                onExecute={(params) => handleExecute(item, params)}
+                onClick={() => onSelect?.(item)}
+              />
+            ))}
+          </div>
+        )}
+      </div>
+ 
+      {/* Batch Actions */}
+      {showBatchActions && selectedIds.size > 0 && (
+        <BatchActionBar
+          selectedCount={selectedIds.size}
+          totalCount={filteredItems.length}
+          onSelectAll={handleSelectAll}
+          onDeselectAll={handleDeselectAll}
+          onBatchExecute={handleBatchExecute}
+          onBatchSchedule={() => {
+            toast('批量调度功能开发中', 'info');
+          }}
+        />
+      )}
+ 
+      {/* Create Workflow Dialog */}
+      {showWorkflowDialog && (
+        <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
+          <div className="bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-md mx-4">
+            <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+              <h3 className="text-lg font-semibold text-gray-900 dark:text-white">新建工作流</h3>
+              <button
+                onClick={() => setShowWorkflowDialog(false)}
+                className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+              >
+                <X className="w-5 h-5" />
+              </button>
+            </div>
+            <div className="p-4">
+              <div className="space-y-4">
+                <div>
+                  <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                    工作流名称
+                  </label>
+                  <input
+                    type="text"
+                    placeholder="输入工作流名称..."
+                    className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-gray-400"
+                  />
+                </div>
+                <div>
+                  <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                    描述
+                  </label>
+                  <textarea
+                    placeholder="描述这个工作流的用途..."
+                    rows={3}
+                    className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-gray-400 resize-none"
+                  />
+                </div>
+              </div>
+            </div>
+            <div className="flex justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700">
+              <button
+                onClick={() => setShowWorkflowDialog(false)}
+                className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg"
+              >
+                取消
+              </button>
+              <button
+                onClick={() => {
+                  toast('工作流创建功能开发中', 'info');
+                  setShowWorkflowDialog(false);
+                }}
+                className="px-4 py-2 text-sm bg-gray-700 dark:bg-gray-600 text-white rounded-lg hover:bg-gray-800 dark:hover:bg-gray-500"
+              >
+                创建
+              </button>
+            </div>
+          </div>
+        </div>
+      )}
+ 
+      {/* Scheduler Dialog */}
+      {showSchedulerDialog && (
+        <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
+          <div className="bg-white dark:bg-gray-800 rounded-lg shadow-xl w-full max-w-lg mx-4">
+            <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+              <h3 className="text-lg font-semibold text-gray-900 dark:text-white">调度管理</h3>
+              <button
+                onClick={() => setShowSchedulerDialog(false)}
+                className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+              >
+                <X className="w-5 h-5" />
+              </button>
+            </div>
+            <div className="p-4">
+              <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+                <Calendar className="w-12 h-12 mx-auto mb-3 opacity-50" />
+                <p>调度管理功能开发中</p>
+                <p className="text-sm mt-1">将支持定时执行、Cron 表达式配置等</p>
+              </div>
+            </div>
+            <div className="flex justify-end p-4 border-t border-gray-200 dark:border-gray-700">
+              <button
+                onClick={() => setShowSchedulerDialog(false)}
+                className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg"
+              >
+                关闭
+              </button>
+            </div>
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+export default AutomationPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/BatchActionBar.tsx.html b/desktop/coverage/src/components/Automation/BatchActionBar.tsx.html new file mode 100644 index 0000000..732fdbc --- /dev/null +++ b/desktop/coverage/src/components/Automation/BatchActionBar.tsx.html @@ -0,0 +1,733 @@ + + + + + + Code coverage report for src/components/Automation/BatchActionBar.tsx + + + + + + + + + +
+
+

All files / src/components/Automation BatchActionBar.tsx

+
+ +
+ 0% + Statements + 0/132 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/132 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * BatchActionBar - Batch Operations Action Bar
+ *
+ * Provides batch action buttons for selected automation items.
+ * Supports batch execute, approve, reject, and schedule.
+ *
+ * @module components/Automation/BatchActionBar
+ */
+ 
+import { useState, useCallback } from 'react';
+import {
+  Play,
+  Check,
+  X,
+  Clock,
+  XCircle,
+  MoreHorizontal,
+  Trash2,
+  Copy,
+} from 'lucide-react';
+ 
+// === Component Props ===
+ 
+interface BatchActionBarProps {
+  selectedCount: number;
+  totalCount?: number; // Optional - for "select all X items" display
+  onSelectAll: () => void;
+  onDeselectAll: () => void;
+  onBatchExecute: () => Promise<void>;
+  onBatchApprove?: () => Promise<void>;
+  onBatchReject?: () => Promise<void>;
+  onBatchSchedule?: () => void;
+  onBatchDelete?: () => Promise<void>;
+  onBatchDuplicate?: () => Promise<void>;
+}
+ 
+// === Main Component ===
+ 
+export function BatchActionBar({
+  selectedCount,
+  totalCount: _totalCount, // Used for future "select all X items" display
+  onSelectAll,
+  onDeselectAll,
+  onBatchExecute,
+  onBatchApprove,
+  onBatchReject,
+  onBatchSchedule,
+  onBatchDelete,
+  onBatchDuplicate,
+}: BatchActionBarProps) {
+  const [isExecuting, setIsExecuting] = useState(false);
+  const [showMoreMenu, setShowMoreMenu] = useState(false);
+ 
+  // Handle batch execute
+  const handleExecute = useCallback(async () => {
+    setIsExecuting(true);
+    try {
+      await onBatchExecute();
+    } finally {
+      setIsExecuting(false);
+    }
+  }, [onBatchExecute]);
+ 
+  // Handle batch approve
+  const handleApprove = useCallback(async () => {
+    if (onBatchApprove) {
+      setIsExecuting(true);
+      try {
+        await onBatchApprove();
+      } finally {
+        setIsExecuting(false);
+      }
+    }
+  }, [onBatchApprove]);
+ 
+  // Handle batch reject
+  const handleReject = useCallback(async () => {
+    if (onBatchReject) {
+      setIsExecuting(true);
+      try {
+        await onBatchReject();
+      } finally {
+        setIsExecuting(false);
+      }
+    }
+  }, [onBatchReject]);
+ 
+  return (
+    <div className="sticky bottom-0 left-0 right-0 bg-orange-50 dark:bg-orange-900/20 border-t border-orange-200 dark:border-orange-800 px-4 py-3">
+      <div className="flex items-center justify-between gap-4">
+        {/* Selection Info */}
+        <div className="flex items-center gap-3">
+          <span className="text-sm text-orange-700 dark:text-orange-300">
+            已选择 <span className="font-medium">{selectedCount}</span> 项
+          </span>
+          <div className="flex items-center gap-1">
+            <button
+              onClick={onSelectAll}
+              className="text-xs text-orange-600 dark:text-orange-400 hover:underline"
+            >
+              全选
+            </button>
+            <span className="text-orange-400 dark:text-orange-600">|</span>
+            <button
+              onClick={onDeselectAll}
+              className="text-xs text-orange-600 dark:text-orange-400 hover:underline"
+            >
+              取消选择
+            </button>
+          </div>
+        </div>
+ 
+        {/* Action Buttons */}
+        <div className="flex items-center gap-2">
+          {/* Execute */}
+          <button
+            onClick={handleExecute}
+            disabled={isExecuting}
+            className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm bg-orange-500 text-white rounded-md hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed"
+          >
+            <Play className="w-3.5 h-3.5" />
+            批量执行
+          </button>
+ 
+          {/* Approve (if handler provided) */}
+          {onBatchApprove && (
+            <button
+              onClick={handleApprove}
+              disabled={isExecuting}
+              className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm bg-green-500 text-white rounded-md hover:bg-green-600 disabled:opacity-50 disabled:cursor-not-allowed"
+            >
+              <Check className="w-3.5 h-3.5" />
+              批量审批
+            </button>
+          )}
+ 
+          {/* Reject (if handler provided) */}
+          {onBatchReject && (
+            <button
+              onClick={handleReject}
+              disabled={isExecuting}
+              className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm bg-red-500 text-white rounded-md hover:bg-red-600 disabled:opacity-50 disabled:cursor-not-allowed"
+            >
+              <X className="w-3.5 h-3.5" />
+              批量拒绝
+            </button>
+          )}
+ 
+          {/* Schedule */}
+          {onBatchSchedule && (
+            <button
+              onClick={onBatchSchedule}
+              disabled={isExecuting}
+              className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border border-orange-300 dark:border-orange-700 text-orange-600 dark:text-orange-400 rounded-md hover:bg-orange-100 dark:hover:bg-orange-900/30 disabled:opacity-50 disabled:cursor-not-allowed"
+            >
+              <Clock className="w-3.5 h-3.5" />
+              批量调度
+            </button>
+          )}
+ 
+          {/* More Actions */}
+          {(onBatchDelete || onBatchDuplicate) && (
+            <div className="relative">
+              <button
+                onClick={() => setShowMoreMenu(!showMoreMenu)}
+                className="p-1.5 text-orange-600 dark:text-orange-400 hover:bg-orange-100 dark:hover:bg-orange-900/30 rounded-md"
+              >
+                <MoreHorizontal className="w-4 h-4" />
+              </button>
+ 
+              {showMoreMenu && (
+                <div className="absolute bottom-full right-0 mb-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 min-w-[150px] z-10">
+                  {onBatchDuplicate && (
+                    <button
+                      onClick={() => {
+                        onBatchDuplicate();
+                        setShowMoreMenu(false);
+                      }}
+                      className="w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"
+                    >
+                      <Copy className="w-4 h-4" />
+                      复制
+                    </button>
+                  )}
+                  {onBatchDelete && (
+                    <button
+                      onClick={() => {
+                        onBatchDelete();
+                        setShowMoreMenu(false);
+                      }}
+                      className="w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20"
+                    >
+                      <Trash2 className="w-4 h-4" />
+                      删除
+                    </button>
+                  )}
+                </div>
+              )}
+            </div>
+          )}
+ 
+          {/* Close */}
+          <button
+            onClick={onDeselectAll}
+            className="p-1.5 text-orange-600 dark:text-orange-400 hover:bg-orange-100 dark:hover:bg-orange-900/30 rounded-md"
+            title="取消选择"
+          >
+            <XCircle className="w-4 h-4" />
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default BatchActionBar;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/ExecutionResult.tsx.html b/desktop/coverage/src/components/Automation/ExecutionResult.tsx.html new file mode 100644 index 0000000..fd53b1b --- /dev/null +++ b/desktop/coverage/src/components/Automation/ExecutionResult.tsx.html @@ -0,0 +1,1270 @@ + + + + + + Code coverage report for src/components/Automation/ExecutionResult.tsx + + + + + + + + + +
+
+

All files / src/components/Automation ExecutionResult.tsx

+
+ +
+ 0% + Statements + 0/277 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/277 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ExecutionResult - Execution Result Display Component
+ *
+ * Displays the result of hand or workflow executions with
+ * status, output, and error information.
+ *
+ * @module components/Automation/ExecutionResult
+ */
+ 
+import { useState, useCallback, useMemo } from 'react';
+import type { RunInfo } from '../../types/automation';
+import {
+  CheckCircle,
+  XCircle,
+  Clock,
+  AlertTriangle,
+  ChevronDown,
+  ChevronUp,
+  Copy,
+  Download,
+  RefreshCw,
+  ExternalLink,
+  FileText,
+  Code,
+  Image,
+  FileSpreadsheet,
+} from 'lucide-react';
+import { useToast } from '../ui/Toast';
+ 
+// === Status Config ===
+ 
+const STATUS_CONFIG = {
+  completed: {
+    label: '完成',
+    icon: CheckCircle,
+    className: 'text-green-500',
+    bgClass: 'bg-green-50 dark:bg-green-900/20',
+  },
+  failed: {
+    label: '失败',
+    icon: XCircle,
+    className: 'text-red-500',
+    bgClass: 'bg-red-50 dark:bg-red-900/20',
+  },
+  running: {
+    label: '运行中',
+    icon: RefreshCw,
+    className: 'text-blue-500 animate-spin',
+    bgClass: 'bg-blue-50 dark:bg-blue-900/20',
+  },
+  needs_approval: {
+    label: '待审批',
+    icon: AlertTriangle,
+    className: 'text-yellow-500',
+    bgClass: 'bg-yellow-50 dark:bg-yellow-900/20',
+  },
+  cancelled: {
+    label: '已取消',
+    icon: XCircle,
+    className: 'text-gray-500',
+    bgClass: 'bg-gray-50 dark:bg-gray-900/20',
+  },
+};
+ 
+// === Component Props ===
+ 
+interface ExecutionResultProps {
+  run: RunInfo;
+  itemType: 'hand' | 'workflow';
+  itemName: string;
+  onRerun?: () => void;
+  onViewDetails?: () => void;
+  compact?: boolean;
+}
+ 
+// === Helper Functions ===
+ 
+function formatDuration(startedAt: string, completedAt?: string): string {
+  const start = new Date(startedAt).getTime();
+  const end = completedAt ? new Date(completedAt).getTime() : Date.now();
+  const diffMs = end - start;
+ 
+  const seconds = Math.floor(diffMs / 1000);
+  const minutes = Math.floor(seconds / 60);
+  const hours = Math.floor(minutes / 60);
+ 
+  if (hours > 0) {
+    return `${hours}h ${minutes % 60}m`;
+  }
+  if (minutes > 0) {
+    return `${minutes}m ${seconds % 60}s`;
+  }
+  return `${seconds}s`;
+}
+ 
+function detectOutputType(output: unknown): 'text' | 'json' | 'markdown' | 'code' | 'image' | 'data' {
+  if (!output) return 'text';
+ 
+  if (typeof output === 'string') {
+    // Check for image URL
+    if (output.match(/\.(png|jpg|jpeg|gif|webp|svg)$/i)) {
+      return 'image';
+    }
+    // Check for markdown
+    if (output.includes('#') || output.includes('**') || output.includes('```')) {
+      return 'markdown';
+    }
+    // Check for code
+    if (output.includes('function ') || output.includes('import ') || output.includes('class ')) {
+      return 'code';
+    }
+    // Try to parse as JSON
+    try {
+      JSON.parse(output);
+      return 'json';
+    } catch {
+      return 'text';
+    }
+  }
+ 
+  // Object/array types
+  if (typeof output === 'object') {
+    return 'json';
+  }
+ 
+  return 'text';
+}
+ 
+function formatOutput(output: unknown, type: string): string {
+  if (!output) return '无输出';
+ 
+  if (type === 'json') {
+    try {
+      return JSON.stringify(output, null, 2);
+    } catch {
+      return String(output);
+    }
+  }
+ 
+  return String(output);
+}
+ 
+// === Output Viewer Component ===
+ 
+interface OutputViewerProps {
+  output: unknown;
+  type: string;
+}
+ 
+function OutputViewer({ output, type }: OutputViewerProps) {
+  const [copied, setCopied] = useState(false);
+  const { toast } = useToast();
+ 
+  const handleCopy = useCallback(async () => {
+    const text = formatOutput(output, type);
+    await navigator.clipboard.writeText(text);
+    setCopied(true);
+    toast('已复制到剪贴板', 'success');
+    setTimeout(() => setCopied(false), 2000);
+  }, [output, type, toast]);
+ 
+  const handleDownload = useCallback(() => {
+    const text = formatOutput(output, type);
+    const blob = new Blob([text], { type: 'text/plain' });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = url;
+    a.download = `output-${Date.now()}.${type === 'json' ? 'json' : 'txt'}`;
+    a.click();
+    URL.revokeObjectURL(url);
+  }, [output, type]);
+ 
+  // Image preview
+  if (type === 'image' && typeof output === 'string') {
+    return (
+      <div className="relative">
+        <img
+          src={output}
+          alt="Output"
+          className="max-w-full rounded-lg"
+        />
+        <div className="absolute top-2 right-2 flex gap-1">
+          <button
+            onClick={() => window.open(output, '_blank')}
+            className="p-1.5 bg-black/50 rounded hover:bg-black/70 text-white"
+          >
+            <ExternalLink className="w-4 h-4" />
+          </button>
+        </div>
+      </div>
+    );
+  }
+ 
+  // Text/JSON/Code output
+  const content = formatOutput(output, type);
+ 
+  return (
+    <div className="relative">
+      <pre className="p-3 bg-gray-900 dark:bg-gray-950 rounded-lg text-sm text-gray-100 overflow-x-auto max-h-64 overflow-y-auto">
+        {content}
+      </pre>
+      <div className="absolute top-2 right-2 flex gap-1">
+        <button
+          onClick={handleCopy}
+          className="p-1.5 bg-gray-700 rounded hover:bg-gray-600 text-gray-300"
+          title="复制"
+        >
+          {copied ? <CheckCircle className="w-4 h-4 text-green-400" /> : <Copy className="w-4 h-4" />}
+        </button>
+        <button
+          onClick={handleDownload}
+          className="p-1.5 bg-gray-700 rounded hover:bg-gray-600 text-gray-300"
+          title="下载"
+        >
+          <Download className="w-4 h-4" />
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function ExecutionResult({
+  run,
+  itemType,
+  itemName,
+  onRerun,
+  onViewDetails,
+  compact = false,
+}: ExecutionResultProps) {
+  const [expanded, setExpanded] = useState(!compact);
+ 
+  const statusConfig = STATUS_CONFIG[run.status as keyof typeof STATUS_CONFIG] || STATUS_CONFIG.completed;
+  const StatusIcon = statusConfig.icon;
+ 
+  // Safely extract error message as string
+  const getErrorMessage = (): string | null => {
+    if (typeof run.error === 'string' && run.error.length > 0) {
+      return run.error;
+    }
+    return null;
+  };
+  const errorMessage = getErrorMessage();
+ 
+  const outputType = useMemo(() => detectOutputType(run.output), [run.output]);
+  const duration = useMemo(() => {
+    if (run.duration) return `${run.duration}s`;
+    if (run.completedAt && run.startedAt) {
+      return formatDuration(run.startedAt, run.completedAt);
+    }
+    return null;
+  }, [run.duration, run.startedAt, run.completedAt]);
+ 
+  // Compact mode
+  if (compact && !expanded) {
+    return (
+      <div
+        className={`flex items-center gap-3 p-3 rounded-lg ${statusConfig.bgClass} cursor-pointer`}
+        onClick={() => setExpanded(true)}
+      >
+        <StatusIcon className={`w-5 h-5 ${statusConfig.className}`} />
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2">
+            <span className="font-medium text-gray-900 dark:text-white truncate">
+              {itemName}
+            </span>
+            <span className={`text-xs ${statusConfig.className}`}>
+              {statusConfig.label}
+            </span>
+          </div>
+          {duration && (
+            <span className="text-xs text-gray-500 dark:text-gray-400">
+              耗时: {duration}
+            </span>
+          )}
+        </div>
+        <ChevronDown className="w-4 h-4 text-gray-400" />
+      </div>
+    );
+  }
+ 
+  return (
+    <div className={`rounded-lg border ${statusConfig.bgClass} border-gray-200 dark:border-gray-700 overflow-hidden`}>
+      {/* Header */}
+      <div
+        className="flex items-center justify-between px-4 py-3 cursor-pointer"
+        onClick={compact ? () => setExpanded(false) : undefined}
+      >
+        <div className="flex items-center gap-3">
+          <StatusIcon className={`w-5 h-5 ${statusConfig.className}`} />
+          <div>
+            <div className="flex items-center gap-2">
+              <span className="font-medium text-gray-900 dark:text-white">
+                {itemName}
+              </span>
+              <span className={`text-xs px-2 py-0.5 rounded-full ${statusConfig.className} ${statusConfig.bgClass}`}>
+                {statusConfig.label}
+              </span>
+              <span className="text-xs text-gray-500 dark:text-gray-400">
+                {itemType === 'hand' ? '自主能力' : '工作流'}
+              </span>
+            </div>
+            {run.runId && (
+              <span className="text-xs text-gray-400 dark:text-gray-500">
+                执行ID: {run.runId}
+              </span>
+            )}
+          </div>
+        </div>
+ 
+        <div className="flex items-center gap-2">
+          {duration && (
+            <span className="text-xs text-gray-500 dark:text-gray-400">
+              耗时: {duration}
+            </span>
+          )}
+          {compact && (
+            <ChevronUp className="w-4 h-4 text-gray-400" />
+          )}
+        </div>
+      </div>
+ 
+      {/* Body */}
+      {expanded && (
+        <div className="px-4 pb-4 space-y-3">
+          {/* Error */}
+          {(() => {
+            if (!errorMessage) return null;
+            return (
+              <div className="p-3 bg-red-50 dark:bg-red-900/20 rounded-lg">
+                <p className="text-sm font-medium text-red-700 dark:text-red-400 mb-1">错误信息</p>
+                <p className="text-sm text-red-600 dark:text-red-300">{errorMessage}</p>
+              </div>
+            );
+          })()}
+ 
+          {/* Output */}
+          {run.output !== undefined && run.output !== null && (
+            <div>
+              <div className="flex items-center justify-between mb-2">
+                <p className="text-sm font-medium text-gray-700 dark:text-gray-300">输出结果</p>
+                <span className="text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+                  {outputType === 'json' && <Code className="w-3 h-3" />}
+                  {outputType === 'markdown' && <FileText className="w-3 h-3" />}
+                  {outputType === 'image' && <Image className="w-3 h-3" />}
+                  {outputType === 'data' && <FileSpreadsheet className="w-3 h-3" />}
+                  {outputType.toUpperCase()}
+                </span>
+              </div>
+              <OutputViewer output={run.output} type={outputType} />
+            </div>
+          )}
+ 
+          {/* Timestamps */}
+          <div className="flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400">
+            <span className="flex items-center gap-1">
+              <Clock className="w-3 h-3" />
+              开始: {new Date(run.startedAt).toLocaleString('zh-CN')}
+            </span>
+            {run.completedAt && (
+              <span>
+                完成: {new Date(run.completedAt).toLocaleString('zh-CN')}
+              </span>
+            )}
+          </div>
+ 
+          {/* Actions */}
+          <div className="flex items-center gap-2 pt-2">
+            {onRerun && (
+              <button
+                onClick={onRerun}
+                className="px-3 py-1.5 text-sm bg-orange-500 text-white rounded-md hover:bg-orange-600 flex items-center gap-1"
+              >
+                <RefreshCw className="w-3.5 h-3.5" />
+                重新执行
+              </button>
+            )}
+            {onViewDetails && (
+              <button
+                onClick={onViewDetails}
+                className="px-3 py-1.5 text-sm border border-gray-200 dark:border-gray-700 rounded-md hover:bg-gray-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300 flex items-center gap-1"
+              >
+                <ExternalLink className="w-3.5 h-3.5" />
+                查看详情
+              </button>
+            )}
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+export default ExecutionResult;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/ScheduleEditor.tsx.html b/desktop/coverage/src/components/Automation/ScheduleEditor.tsx.html new file mode 100644 index 0000000..ecbcadb --- /dev/null +++ b/desktop/coverage/src/components/Automation/ScheduleEditor.tsx.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/components/Automation/ScheduleEditor.tsx + + + + + + + + + +
+
+

All files / src/components/Automation ScheduleEditor.tsx

+
+ +
+ 0% + Statements + 0/273 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/273 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ScheduleEditor - Visual Schedule Configuration
+ *
+ * Provides a visual interface for configuring schedules
+ * without requiring knowledge of cron syntax.
+ *
+ * @module components/Automation/ScheduleEditor
+ */
+ 
+import { useState, useCallback, useMemo } from 'react';
+import type { ScheduleInfo } from '../../types/automation';
+import {
+  Calendar,
+  Info,
+} from 'lucide-react';
+import { useToast } from '../ui/Toast';
+ 
+// === Frequency Types ===
+ 
+type Frequency = 'once' | 'daily' | 'weekly' | 'monthly' | 'custom';
+ 
+// === Timezones ===
+ 
+const COMMON_TIMEZONES = [
+  { value: 'Asia/Shanghai', label: '北京时间 (UTC+8)' },
+  { value: 'Asia/Tokyo', label: '东京时间 (UTC+9)' },
+  { value: 'Asia/Singapore', label: '新加坡时间 (UTC+8)' },
+  { value: 'America/New_York', label: '纽约时间 (UTC-5)' },
+  { value: 'America/Los_Angeles', label: '洛杉矶时间 (UTC-8)' },
+  { value: 'Europe/London', label: '伦敦时间 (UTC+0)' },
+  { value: 'UTC', label: '协调世界时 (UTC)' },
+];
+ 
+// === Day Names ===
+ 
+const DAY_NAMES = ['日', '一', '二', '三', '四', '五', '六'];
+const DAY_NAMES_FULL = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+ 
+// === Component Props ===
+ 
+interface ScheduleEditorProps {
+  schedule?: ScheduleInfo;
+  onSave: (schedule: ScheduleInfo) => void;
+  onCancel: () => void;
+  itemName?: string;
+}
+ 
+// === Helper Functions ===
+ 
+function formatSchedulePreview(schedule: ScheduleInfo): string {
+  const { frequency, time, daysOfWeek, dayOfMonth, timezone } = schedule;
+  const timeStr = `${time.hour.toString().padStart(2, '0')}:${time.minute.toString().padStart(2, '0')}`;
+  const tzLabel = COMMON_TIMEZONES.find(tz => tz.value === timezone)?.label || timezone;
+ 
+  switch (frequency) {
+    case 'once':
+      return `一次性执行于 ${timeStr} (${tzLabel})`;
+    case 'daily':
+      return `每天 ${timeStr} (${tzLabel})`;
+    case 'weekly':
+      const days = (daysOfWeek || []).map(d => DAY_NAMES_FULL[d]).join('、');
+      return `每${days} ${timeStr} (${tzLabel})`;
+    case 'monthly':
+      return `每月${dayOfMonth || 1}日 ${timeStr} (${tzLabel})`;
+    case 'custom':
+      return schedule.customCron || '自定义调度';
+    default:
+      return '未设置';
+  }
+}
+ 
+// === Main Component ===
+ 
+export function ScheduleEditor({
+  schedule,
+  onSave,
+  onCancel,
+  itemName = '自动化项目',
+}: ScheduleEditorProps) {
+  const { toast } = useToast();
+ 
+  // Initialize state from existing schedule
+  const [frequency, setFrequency] = useState<Frequency>(schedule?.frequency || 'daily');
+  const [time, setTime] = useState(schedule?.time || { hour: 9, minute: 0 });
+  const [daysOfWeek, setDaysOfWeek] = useState<number[]>(schedule?.daysOfWeek || [1, 2, 3, 4, 5]);
+  const [dayOfMonth, setDayOfMonth] = useState(schedule?.dayOfMonth || 1);
+  const [timezone, setTimezone] = useState(schedule?.timezone || 'Asia/Shanghai');
+  const [endDate, setEndDate] = useState(schedule?.endDate || '');
+  const [customCron, setCustomCron] = useState(schedule?.customCron || '');
+  const [enabled, setEnabled] = useState(schedule?.enabled ?? true);
+ 
+  // Toggle day of week
+  const toggleDayOfWeek = useCallback((day: number) => {
+    setDaysOfWeek(prev =>
+      prev.includes(day)
+        ? prev.filter(d => d !== day)
+        : [...prev, day].sort()
+    );
+  }, []);
+ 
+  // Handle save
+  const handleSave = useCallback(() => {
+    // Validate
+    if (frequency === 'weekly' && daysOfWeek.length === 0) {
+      toast('请选择至少一个重复日期', 'error');
+      return;
+    }
+ 
+    if (frequency === 'custom' && !customCron) {
+      toast('请输入自定义 cron 表达式', 'error');
+      return;
+    }
+ 
+    const newSchedule: ScheduleInfo = {
+      enabled,
+      frequency,
+      time,
+      daysOfWeek: frequency === 'weekly' ? daysOfWeek : undefined,
+      dayOfMonth: frequency === 'monthly' ? dayOfMonth : undefined,
+      customCron: frequency === 'custom' ? customCron : undefined,
+      timezone,
+      endDate: endDate || undefined,
+    };
+ 
+    onSave(newSchedule);
+    toast('调度设置已保存', 'success');
+  }, [frequency, daysOfWeek, customCron, enabled, time, dayOfMonth, timezone, endDate, onSave, toast]);
+ 
+  // Generate preview
+  const preview = useMemo(() => {
+    return formatSchedulePreview({
+      enabled,
+      frequency,
+      time,
+      daysOfWeek,
+      dayOfMonth,
+      customCron,
+      timezone,
+    });
+  }, [enabled, frequency, time, daysOfWeek, dayOfMonth, customCron, timezone]);
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onCancel}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-start justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+          <div className="flex items-center gap-3">
+            <div className="p-2 bg-orange-100 dark:bg-orange-900/30 rounded-lg">
+              <Calendar className="w-5 h-5 text-orange-600 dark:text-orange-400" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                调度设置
+              </h2>
+              {itemName && (
+                <p className="text-sm text-gray-500 dark:text-gray-400">{itemName}</p>
+              )}
+            </div>
+          </div>
+          <button
+            onClick={onCancel}
+            className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"
+          >
+            <span className="text-xl">&times;</span>
+          </button>
+        </div>
+ 
+        {/* Body */}
+        <div className="flex-1 overflow-y-auto p-4 space-y-6">
+          {/* Enable Toggle */}
+          <div className="flex items-center justify-between">
+            <div>
+              <p className="text-sm font-medium text-gray-900 dark:text-white">
+                启用调度
+              </p>
+              <p className="text-xs text-gray-500 dark:text-gray-400">
+                开启后,此项目将按照设定的时间自动执行
+              </p>
+            </div>
+            <button
+              onClick={() => setEnabled(!enabled)}
+              className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${
+                enabled ? 'bg-orange-500' : 'bg-gray-200 dark:bg-gray-700'
+              }`}
+            >
+              <span
+                className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
+                  enabled ? 'translate-x-6' : 'translate-x-1'
+                }`}
+              />
+            </button>
+          </div>
+ 
+          {/* Frequency Selection */}
+          <div>
+            <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+              频率
+            </label>
+            <div className="grid grid-cols-5 gap-2">
+              {[
+                { value: 'once', label: '一次' },
+                { value: 'daily', label: '每天' },
+                { value: 'weekly', label: '每周' },
+                { value: 'monthly', label: '每月' },
+                { value: 'custom', label: '自定义' },
+              ].map(option => (
+                <button
+                  key={option.value}
+                  onClick={() => setFrequency(option.value as Frequency)}
+                  className={`px-3 py-2 text-sm font-medium rounded-lg border transition-colors ${
+                    frequency === option.value
+                      ? 'bg-orange-500 text-white border-orange-500'
+                      : 'bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-700 hover:border-orange-300 dark:hover:border-orange-700'
+                  }`}
+                >
+                  {option.label}
+                </button>
+              ))}
+            </div>
+          </div>
+ 
+          {/* Time Selection */}
+          {frequency !== 'custom' && (
+            <div className="flex items-center gap-4">
+              <div className="flex-1">
+                <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+                  时间
+                </label>
+                <div className="flex items-center gap-2">
+                  <input
+                    type="number"
+                    min="0"
+                    max="23"
+                    value={time.hour}
+                    onChange={(e) => setTime(prev => ({ ...prev, hour: parseInt(e.target.value) || 0 }))}
+                    className="w-16 px-3 py-2 text-center border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white"
+                  />
+                  <span className="text-gray-500 dark:text-gray-400">:</span>
+                  <input
+                    type="number"
+                    min="0"
+                    max="59"
+                    value={time.minute}
+                    onChange={(e) => setTime(prev => ({ ...prev, minute: parseInt(e.target.value) || 0 }))}
+                    className="w-16 px-3 py-2 text-center border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white"
+                  />
+                </div>
+              </div>
+ 
+              <div className="flex-1">
+                <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+                  时区
+                </label>
+                <select
+                  value={timezone}
+                  onChange={(e) => setTimezone(e.target.value)}
+                  className="w-full px-3 py-2 border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white"
+                >
+                  {COMMON_TIMEZONES.map(tz => (
+                    <option key={tz.value} value={tz.value}>{tz.label}</option>
+                  ))}
+                </select>
+              </div>
+            </div>
+          )}
+ 
+          {/* Weekly Days Selection */}
+          {frequency === 'weekly' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+                重复日期
+              </label>
+              <div className="flex items-center gap-1">
+                {DAY_NAMES.map((day, index) => (
+                  <button
+                    key={index}
+                    onClick={() => toggleDayOfWeek(index)}
+                    className={`w-10 h-10 rounded-full text-sm font-medium transition-colors ${
+                      daysOfWeek.includes(index)
+                        ? 'bg-orange-500 text-white'
+                        : 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700'
+                    }`}
+                  >
+                    {day}
+                  </button>
+                ))}
+              </div>
+            </div>
+          )}
+ 
+          {/* Monthly Day Selection */}
+          {frequency === 'monthly' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+                每月日期
+              </label>
+              <select
+                value={dayOfMonth}
+                onChange={(e) => setDayOfMonth(parseInt(e.target.value))}
+                className="w-full px-3 py-2 border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white"
+              >
+                {Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
+                  <option key={day} value={day}>每月 {day} 日</option>
+                ))}
+              </select>
+            </div>
+          )}
+ 
+          {/* Custom Cron Input */}
+          {frequency === 'custom' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+                Cron 表达式
+              </label>
+              <input
+                type="text"
+                value={customCron}
+                onChange={(e) => setCustomCron(e.target.value)}
+                placeholder="* * * * * (分 时 日 月 周)"
+                className="w-full px-3 py-2 border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white font-mono text-sm"
+              />
+              <p className="mt-1 text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+                <Info className="w-3 h-3" />
+                示例: "0 9 * * *" 表示每天 9:00 执行
+              </p>
+            </div>
+          )}
+ 
+          {/* End Date */}
+          {frequency !== 'once' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-900 dark:text-white mb-2">
+                结束日期 (可选)
+              </label>
+              <input
+                type="date"
+                value={endDate}
+                onChange={(e) => setEndDate(e.target.value)}
+                className="w-full px-3 py-2 border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white"
+              />
+            </div>
+          )}
+ 
+          {/* Preview */}
+          <div className="p-3 bg-gray-50 dark:bg-gray-900 rounded-lg">
+            <p className="text-xs text-gray-500 dark:text-gray-400 mb-1">预览</p>
+            <p className="text-sm font-medium text-gray-900 dark:text-white">{preview}</p>
+          </div>
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700">
+          <button
+            onClick={onCancel}
+            className="px-4 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
+          >
+            取消
+          </button>
+          <button
+            onClick={handleSave}
+            className="px-4 py-2 text-sm bg-orange-500 text-white rounded-lg hover:bg-orange-600"
+          >
+            保存
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default ScheduleEditor;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/index.html b/desktop/coverage/src/components/Automation/index.html new file mode 100644 index 0000000..c7baef5 --- /dev/null +++ b/desktop/coverage/src/components/Automation/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/components/Automation + + + + + + + + + +
+
+

All files src/components/Automation

+
+ +
+ 0% + Statements + 0/1672 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 0% + Lines + 0/1672 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ApprovalQueue.tsx +
+
0%0/2480%0/10%0/10%0/248
AutomationCard.tsx +
+
0%0/2780%0/10%0/10%0/278
AutomationFilters.tsx +
+
0%0/1320%0/10%0/10%0/132
AutomationPanel.tsx +
+
0%0/3310%0/10%0/10%0/331
BatchActionBar.tsx +
+
0%0/1320%0/10%0/10%0/132
ExecutionResult.tsx +
+
0%0/2770%0/10%0/10%0/277
ScheduleEditor.tsx +
+
0%0/2730%0/10%0/10%0/273
index.ts +
+
0%0/10%0/10%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Automation/index.ts.html b/desktop/coverage/src/components/Automation/index.ts.html new file mode 100644 index 0000000..23d3651 --- /dev/null +++ b/desktop/coverage/src/components/Automation/index.ts.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for src/components/Automation/index.ts + + + + + + + + + +
+
+

All files / src/components/Automation index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Automation Components
+ *
+ * Unified automation system components for Hands and Workflows.
+ *
+ * @module components/Automation
+ */
+ 
+export { AutomationPanel, default as AutomationPanelDefault } from './AutomationPanel';
+export { AutomationCard } from './AutomationCard';
+export { AutomationFilters } from './AutomationFilters';
+export { BatchActionBar } from './BatchActionBar';
+export { ScheduleEditor } from './ScheduleEditor';
+export { ApprovalQueue } from './ApprovalQueue';
+export { ExecutionResult } from './ExecutionResult';
+ 
+// Re-export types
+export type {
+  AutomationItem,
+  AutomationStatus,
+  AutomationType,
+  CategoryType,
+  CategoryStats,
+  RunInfo,
+  ScheduleInfo,
+} from '../../types/automation';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/AutonomyConfig.tsx.html b/desktop/coverage/src/components/AutonomyConfig.tsx.html new file mode 100644 index 0000000..b73a492 --- /dev/null +++ b/desktop/coverage/src/components/AutonomyConfig.tsx.html @@ -0,0 +1,1570 @@ + + + + + + Code coverage report for src/components/AutonomyConfig.tsx + + + + + + + + + +
+
+

All files / src/components AutonomyConfig.tsx

+
+ +
+ 0% + Statements + 0/362 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/362 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AutonomyConfig - Configuration UI for L4 self-evolution authorization
+ *
+ * Allows users to configure:
+ * - Autonomy level (supervised/assisted/autonomous)
+ * - Individual action permissions
+ * - Approval thresholds
+ * - Audit log viewing
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { useState, useCallback, useEffect } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Shield,
+  ShieldAlert,
+  ShieldCheck,
+  ShieldQuestion,
+  Settings,
+  AlertTriangle,
+  CheckCircle,
+  Clock,
+  RotateCcw,
+  Info,
+  ChevronDown,
+  ChevronRight,
+  Trash2,
+} from 'lucide-react';
+import {
+  getAutonomyManager,
+  DEFAULT_AUTONOMY_CONFIGS,
+  type AutonomyConfig,
+  type AutonomyLevel,
+  type AuditLogEntry,
+  type ActionType,
+} from '../lib/autonomy-manager';
+ 
+// === Types ===
+ 
+interface AutonomyConfigProps {
+  className?: string;
+  onConfigChange?: (config: AutonomyConfig) => void;
+}
+ 
+// === Autonomy Level Config ===
+ 
+const LEVEL_CONFIG: Record<AutonomyLevel, {
+  label: string;
+  description: string;
+  icon: typeof Shield;
+  color: string;
+}> = {
+  supervised: {
+    label: '监督模式',
+    description: '所有操作都需要用户确认',
+    icon: ShieldQuestion,
+    color: 'text-yellow-500',
+  },
+  assisted: {
+    label: '辅助模式',
+    description: '低风险操作自动执行,高风险需确认',
+    icon: ShieldAlert,
+    color: 'text-blue-500',
+  },
+  autonomous: {
+    label: '自主模式',
+    description: 'Agent 自主决策,仅高影响操作通知',
+    icon: ShieldCheck,
+    color: 'text-green-500',
+  },
+};
+ 
+const ACTION_LABELS: Record<ActionType, string> = {
+  memory_save: '自动保存记忆',
+  memory_delete: '删除记忆',
+  identity_update: '更新身份文件',
+  identity_rollback: '回滚身份',
+  skill_install: '安装技能',
+  skill_uninstall: '卸载技能',
+  config_change: '修改配置',
+  workflow_trigger: '触发工作流',
+  hand_trigger: '触发 Hand',
+  llm_call: '调用 LLM',
+  reflection_run: '运行反思',
+  compaction_run: '运行压缩',
+};
+ 
+// === Components ===
+ 
+function LevelSelector({
+  value,
+  onChange,
+}: {
+  value: AutonomyLevel;
+  onChange: (level: AutonomyLevel) => void;
+}) {
+  return (
+    <div className="space-y-2">
+      {(Object.keys(LEVEL_CONFIG) as AutonomyLevel[]).map((level) => {
+        const config = LEVEL_CONFIG[level];
+        const Icon = config.icon;
+        const isSelected = value === level;
+ 
+        return (
+          <button
+            key={level}
+            onClick={() => onChange(level)}
+            className={`w-full flex items-start gap-3 p-3 rounded-lg border transition-all text-left ${
+              isSelected
+                ? 'border-purple-500 bg-purple-50 dark:bg-purple-900/30'
+                : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+            }`}
+          >
+            <Icon className={`w-5 h-5 mt-0.5 flex-shrink-0 ${config.color}`} />
+            <div className="flex-1 min-w-0">
+              <div className={`text-sm font-medium ${
+                isSelected ? 'text-purple-700 dark:text-purple-400' : 'text-gray-700 dark:text-gray-300'
+              }`}>
+                {config.label}
+              </div>
+              <div className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+                {config.description}
+              </div>
+            </div>
+            {isSelected && (
+              <CheckCircle className="w-4 h-4 text-purple-500 flex-shrink-0" />
+            )}
+          </button>
+        );
+      })}
+    </div>
+  );
+}
+ 
+function ActionToggle({
+  label,
+  enabled,
+  onChange,
+  disabled,
+}: {
+  label: string;
+  enabled: boolean;
+  onChange: (enabled: boolean) => void;
+  disabled?: boolean;
+}) {
+  return (
+    <div className={`flex items-center justify-between py-2 ${disabled ? 'opacity-50' : ''}`}>
+      <span className="text-sm text-gray-700 dark:text-gray-300">{label}</span>
+      <button
+        onClick={() => !disabled && onChange(!enabled)}
+        disabled={disabled}
+        className={`relative w-9 h-5 rounded-full transition-colors ${
+          enabled ? 'bg-green-500' : 'bg-gray-300 dark:bg-gray-600'
+        } ${disabled ? 'cursor-not-allowed' : ''}`}
+      >
+        <motion.div
+          animate={{ x: enabled ? 18 : 0 }}
+          className="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow"
+        />
+      </button>
+    </div>
+  );
+}
+ 
+function AuditLogEntryItem({
+  entry,
+  onRollback,
+}: {
+  entry: AuditLogEntry;
+  onRollback?: (id: string) => void;
+}) {
+  const [expanded, setExpanded] = useState(false);
+ 
+  const outcomeColors = {
+    success: 'text-green-500',
+    failed: 'text-red-500',
+    rolled_back: 'text-yellow-500',
+  };
+ 
+  const outcomeLabels = {
+    success: '成功',
+    failed: '失败',
+    rolled_back: '已回滚',
+  };
+ 
+  const time = new Date(entry.timestamp).toLocaleString('zh-CN', {
+    hour: '2-digit',
+    minute: '2-digit',
+    second: '2-digit',
+  });
+ 
+  return (
+    <div className="border-b border-gray-100 dark:border-gray-800 last:border-b-0">
+      <button
+        onClick={() => setExpanded(!expanded)}
+        className="w-full flex items-center gap-2 py-2 px-1 hover:bg-gray-50 dark:hover:bg-gray-800/30 transition-colors"
+      >
+        {expanded ? (
+          <ChevronDown className="w-3 h-3 text-gray-400" />
+        ) : (
+          <ChevronRight className="w-3 h-3 text-gray-400" />
+        )}
+        <span className="text-xs text-gray-400">{time}</span>
+        <span className="text-sm text-gray-700 dark:text-gray-300 flex-1 text-left truncate">
+          {ACTION_LABELS[entry.action] || entry.action}
+        </span>
+        <span className={`text-xs ${outcomeColors[entry.outcome]}`}>
+          {outcomeLabels[entry.outcome]}
+        </span>
+      </button>
+ 
+      <AnimatePresence>
+        {expanded && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="px-6 pb-2 space-y-1"
+          >
+            <div className="text-xs text-gray-500 dark:text-gray-400">
+              风险: {entry.decision.riskLevel} · 重要性: {entry.decision.importance}
+            </div>
+            <div className="text-xs text-gray-500 dark:text-gray-400">
+              原因: {entry.decision.reason}
+            </div>
+            {entry.outcome !== 'rolled_back' && entry.decision.riskLevel !== 'low' && (
+              <button
+                onClick={() => onRollback?.(entry.id)}
+                className="flex items-center gap-1 text-xs text-yellow-600 dark:text-yellow-400 hover:underline mt-1"
+              >
+                <RotateCcw className="w-3 h-3" />
+                回滚此操作
+              </button>
+            )}
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function AutonomyConfig({ className = '', onConfigChange }: AutonomyConfigProps) {
+  const [manager] = useState(() => getAutonomyManager());
+  const [config, setConfig] = useState<AutonomyConfig>(manager.getConfig());
+  const [auditLog, setAuditLog] = useState<AuditLogEntry[]>([]);
+  const [hasChanges, setHasChanges] = useState(false);
+ 
+  // Load audit log
+  useEffect(() => {
+    setAuditLog(manager.getAuditLog(50));
+  }, [manager]);
+ 
+  const updateConfig = useCallback(
+    (updates: Partial<AutonomyConfig>) => {
+      setConfig((prev) => {
+        const next = { ...prev, ...updates };
+        setHasChanges(true);
+        onConfigChange?.(next);
+        return next;
+      });
+    },
+    [onConfigChange]
+  );
+ 
+  const handleLevelChange = useCallback((level: AutonomyLevel) => {
+    const newConfig = DEFAULT_AUTONOMY_CONFIGS[level];
+    setConfig(newConfig);
+    setHasChanges(true);
+    onConfigChange?.(newConfig);
+  }, [onConfigChange]);
+ 
+  const handleSave = useCallback(() => {
+    manager.updateConfig(config);
+    setHasChanges(false);
+  }, [manager, config]);
+ 
+  const handleRollback = useCallback((auditId: string) => {
+    if (manager.rollback(auditId)) {
+      setAuditLog(manager.getAuditLog(50));
+    }
+  }, [manager]);
+ 
+  const handleClearLog = useCallback(() => {
+    manager.clearAuditLog();
+    setAuditLog([]);
+  }, [manager]);
+ 
+  return (
+    <div className={`flex flex-col h-full ${className}`}>
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Shield className="w-5 h-5 text-purple-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-gray-100">自主授权</h2>
+        </div>
+        <button
+          onClick={handleSave}
+          disabled={!hasChanges}
+          className="px-3 py-1.5 text-sm bg-purple-500 hover:bg-purple-600 disabled:bg-gray-300 disabled:cursor-not-allowed text-white rounded-lg transition-colors"
+        >
+          保存
+        </button>
+      </div>
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-6">
+        {/* Autonomy Level */}
+        <div className="space-y-2">
+          <div className="flex items-center gap-2">
+            <ShieldAlert className="w-4 h-4 text-gray-500" />
+            <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+              自主级别
+            </span>
+          </div>
+          <LevelSelector value={config.level} onChange={handleLevelChange} />
+        </div>
+ 
+        {/* Allowed Actions */}
+        <div className="space-y-2">
+          <div className="flex items-center gap-2">
+            <Settings className="w-4 h-4 text-gray-500" />
+            <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+              允许的操作
+            </span>
+          </div>
+          <div className="pl-6 space-y-1 border-l-2 border-gray-200 dark:border-gray-700">
+            <ActionToggle
+              label="自动保存记忆"
+              enabled={config.allowedActions.memoryAutoSave}
+              onChange={(enabled) =>
+                updateConfig({
+                  allowedActions: { ...config.allowedActions, memoryAutoSave: enabled },
+                })
+              }
+            />
+            <ActionToggle
+              label="自动更新身份文件"
+              enabled={config.allowedActions.identityAutoUpdate}
+              onChange={(enabled) =>
+                updateConfig({
+                  allowedActions: { ...config.allowedActions, identityAutoUpdate: enabled },
+                })
+              }
+            />
+            <ActionToggle
+              label="自动安装技能"
+              enabled={config.allowedActions.skillAutoInstall}
+              onChange={(enabled) =>
+                updateConfig({
+                  allowedActions: { ...config.allowedActions, skillAutoInstall: enabled },
+                })
+              }
+            />
+            <ActionToggle
+              label="自我修改行为"
+              enabled={config.allowedActions.selfModification}
+              onChange={(enabled) =>
+                updateConfig({
+                  allowedActions: { ...config.allowedActions, selfModification: enabled },
+                })
+              }
+            />
+            <ActionToggle
+              label="自动上下文压缩"
+              enabled={config.allowedActions.autoCompaction}
+              onChange={(enabled) =>
+                updateConfig({
+                  allowedActions: { ...config.allowedActions, autoCompaction: enabled },
+                })
+              }
+            />
+            <ActionToggle
+              label="自动反思"
+              enabled={config.allowedActions.autoReflection}
+              onChange={(enabled) =>
+                updateConfig({
+                  allowedActions: { ...config.allowedActions, autoReflection: enabled },
+                })
+              }
+            />
+          </div>
+        </div>
+ 
+        {/* Approval Thresholds */}
+        <div className="space-y-2">
+          <div className="flex items-center gap-2">
+            <AlertTriangle className="w-4 h-4 text-gray-500" />
+            <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+              审批阈值
+            </span>
+          </div>
+          <div className="pl-6 space-y-3">
+            <div className="flex items-center justify-between">
+              <span className="text-sm text-gray-600 dark:text-gray-400">
+                重要性上限
+              </span>
+              <input
+                type="range"
+                min="0"
+                max="10"
+                value={config.approvalThreshold.importanceMax}
+                onChange={(e) =>
+                  updateConfig({
+                    approvalThreshold: {
+                      ...config.approvalThreshold,
+                      importanceMax: parseInt(e.target.value),
+                    },
+                  })
+                }
+                className="w-24 h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer accent-purple-500"
+              />
+              <span className="text-sm font-medium text-gray-900 dark:text-gray-100 w-6 text-right">
+                {config.approvalThreshold.importanceMax}
+              </span>
+            </div>
+            <div className="flex items-center justify-between">
+              <span className="text-sm text-gray-600 dark:text-gray-400">
+                风险等级上限
+              </span>
+              <select
+                value={config.approvalThreshold.riskMax}
+                onChange={(e) =>
+                  updateConfig({
+                    approvalThreshold: {
+                      ...config.approvalThreshold,
+                      riskMax: e.target.value as 'low' | 'medium' | 'high',
+                    },
+                  })
+                }
+                className="px-2 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100"
+              >
+                <option value="low">低风险</option>
+                <option value="medium">中风险</option>
+                <option value="high">高风险</option>
+              </select>
+            </div>
+          </div>
+        </div>
+ 
+        {/* Audit Log */}
+        <div className="space-y-2">
+          <div className="flex items-center justify-between">
+            <div className="flex items-center gap-2">
+              <Clock className="w-4 h-4 text-gray-500" />
+              <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+                审计日志
+              </span>
+              <span className="text-xs text-gray-400">({auditLog.length} 条)</span>
+            </div>
+            <button
+              onClick={handleClearLog}
+              className="p-1 text-gray-400 hover:text-red-500 transition-colors"
+              title="清除日志"
+            >
+              <Trash2 className="w-4 h-4" />
+            </button>
+          </div>
+ 
+          {auditLog.length > 0 ? (
+            <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden max-h-64 overflow-y-auto">
+              {auditLog
+                .slice()
+                .reverse()
+                .map((entry) => (
+                  <AuditLogEntryItem
+                    key={entry.id}
+                    entry={entry}
+                    onRollback={handleRollback}
+                  />
+                ))}
+            </div>
+          ) : (
+            <div className="text-center py-8 text-gray-400 dark:text-gray-500 text-sm">
+              暂无审计日志
+            </div>
+          )}
+        </div>
+ 
+        {/* Info */}
+        <div className="flex items-start gap-2 p-3 bg-yellow-50 dark:bg-yellow-900/20 rounded-lg text-xs text-yellow-600 dark:text-yellow-400">
+          <Info className="w-4 h-4 flex-shrink-0 mt-0.5" />
+          <p>
+            高风险操作(删除记忆、修改身份文件)始终需要用户确认,无论自主级别如何设置。
+            所有自主操作都会记录在审计日志中,支持一键回滚。
+          </p>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default AutonomyConfig;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/BrowserHandCard.tsx.html b/desktop/coverage/src/components/BrowserHand/BrowserHandCard.tsx.html new file mode 100644 index 0000000..bbf1929 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/BrowserHandCard.tsx.html @@ -0,0 +1,787 @@ + + + + + + Code coverage report for src/components/BrowserHand/BrowserHandCard.tsx + + + + + + + + + +
+
+

All files / src/components/BrowserHand BrowserHandCard.tsx

+
+ +
+ 0% + Statements + 0/170 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/170 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * BrowserHandCard Component
+ *
+ * Main card for Browser Hand with real-time status and screenshot preview.
+ */
+ 
+import React from 'react';
+import {
+  Globe,
+  Camera,
+  RefreshCw,
+  Settings,
+  Play,
+  Loader2,
+  CheckCircle,
+  XCircle,
+  AlertCircle,
+  ExternalLink,
+} from 'lucide-react';
+import { cn } from '../../lib/utils';
+import { useBrowserHandStore } from '../../store/browserHandStore';
+import { ScreenshotPreview } from './ScreenshotPreview';
+import { TaskTemplateModal } from './TaskTemplateModal';
+import type { Hand } from '../../types/hands';
+ 
+interface BrowserHandCardProps {
+  hand: Hand;
+  onOpenSettings?: () => void;
+}
+ 
+export function BrowserHandCard({ onOpenSettings }: BrowserHandCardProps) {
+  const {
+    execution,
+    sessions,
+    activeSessionId,
+    isTemplateModalOpen,
+    isLoading,
+    error,
+    openTemplateModal,
+    closeTemplateModal,
+    takeScreenshot,
+    createSession,
+    closeSession,
+    clearError,
+  } = useBrowserHandStore();
+ 
+  const [isStarting, setIsStarting] = React.useState(false);
+ 
+  // Auto-start session if needed
+  React.useEffect(() => {
+    if (sessions.length === 0 && !activeSessionId) {
+      setIsStarting(true);
+      createSession({ headless: true })
+        .then(() => setIsStarting(false))
+        .catch(() => setIsStarting(false));
+    }
+  }, [sessions.length, activeSessionId, createSession]);
+ 
+  // Get status display
+  const getStatusDisplay = () => {
+    if (isStarting || isLoading) {
+      return { text: '连接中...', color: 'text-yellow-500', icon: Loader2 };
+    }
+    if (error) {
+      return { text: '错误', color: 'text-red-500', icon: XCircle };
+    }
+    if (execution.isRunning) {
+      return { text: '运行中', color: 'text-blue-500', icon: Play };
+    }
+    if (activeSessionId) {
+      return { text: '就绪', color: 'text-green-500', icon: CheckCircle };
+    }
+    return { text: '未连接', color: 'text-gray-500', icon: AlertCircle };
+  };
+ 
+  const status = getStatusDisplay();
+  const StatusIcon = status.icon;
+ 
+  return (
+    <div className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden">
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-3">
+          <div className="p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30">
+            <Globe className="h-5 w-5 text-blue-600 dark:text-blue-400" />
+          </div>
+          <div>
+            <h3 className="font-semibold text-gray-900 dark:text-white">
+              Browser Hand
+            </h3>
+            <p className="text-sm text-gray-500 dark:text-gray-400">
+              浏览器自动化能力
+            </p>
+          </div>
+        </div>
+        <div className="flex items-center gap-2">
+          <span className={cn('flex items-center gap-1 text-sm', status.color)}>
+            <StatusIcon className="h-4 w-4" />
+            {status.text}
+          </span>
+        </div>
+      </div>
+ 
+      {/* Screenshot Preview */}
+      <div className="p-4 border-b border-gray-200 dark:border-gray-700">
+        <ScreenshotPreview
+          base64={execution.lastScreenshot}
+          isLoading={isLoading || execution.isRunning}
+          onRefresh={() => {
+            if (activeSessionId) {
+              takeScreenshot();
+            }
+          }}
+          altText={execution.isRunning ? '执行中...' : '等待截图'}
+        />
+      </div>
+ 
+      {/* Status Bar */}
+      {(execution.isRunning || execution.currentUrl) && (
+        <div className="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50">
+          {execution.currentUrl && (
+            <div className="flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 mb-2">
+            <ExternalLink className="h-4 w-4" />
+            <span className="truncate font-mono">{execution.currentUrl}</span>
+          </div>
+          )}
+          {execution.isRunning && (
+            <>
+              <div className="flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 mb-2">
+                <Play className="h-4 w-4" />
+                <span>{execution.currentAction || '处理中...'}</span>
+              </div>
+              <div className="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 overflow-hidden">
+                <div
+                  className="h-full bg-blue-500 transition-all duration-300"
+                  style={{ width: `${execution.progress}%` }}
+                />
+              </div>
+            </>
+          )}
+        </div>
+      )}
+ 
+      {/* Error Display */}
+      {error && (
+        <div className="px-4 py-3 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800">
+          <div className="flex items-center justify-between">
+            <div className="flex items-center gap-2 text-red-600 dark:text-red-400">
+              <AlertCircle className="h-4 w-4" />
+              <span className="text-sm">{error}</span>
+            </div>
+            <button
+              onClick={clearError}
+              className="text-red-600 dark:text-red-400 hover:text-red-700"
+            >
+              <XCircle className="h-4 w-4" />
+            </button>
+          </div>
+        </div>
+      )}
+ 
+      {/* Actions */}
+      <div className="p-4">
+        <div className="flex flex-wrap gap-2">
+          <button
+            onClick={openTemplateModal}
+            disabled={isLoading || execution.isRunning || !activeSessionId}
+            className={cn(
+              'flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg font-medium transition-colors',
+              activeSessionId && !execution.isRunning
+                ? 'bg-gray-700 dark:bg-gray-600 text-white hover:bg-gray-800 dark:hover:bg-gray-500'
+                : 'bg-gray-200 text-gray-400 dark:bg-gray-700 dark:text-gray-500 cursor-not-allowed'
+            )}
+          >
+            <Play className="h-4 w-4" />
+            执行任务
+          </button>
+ 
+          <button
+            onClick={() => activeSessionId && takeScreenshot()}
+            disabled={isLoading || execution.isRunning || !activeSessionId}
+            className={cn(
+              'flex items-center justify-center gap-2 px-3 py-2 rounded-lg border transition-colors',
+              activeSessionId && !execution.isRunning
+                ? 'border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300'
+                : 'border-gray-200 dark:border-gray-700 text-gray-400 dark:text-gray-500 cursor-not-allowed'
+            )}
+            title="截图"
+          >
+            <Camera className="h-4 w-4" />
+          </button>
+ 
+          <button
+            onClick={() => {
+              if (activeSessionId) {
+                closeSession(activeSessionId);
+              }
+            }}
+            disabled={isLoading || execution.isRunning || !activeSessionId}
+            className={cn(
+              'flex items-center justify-center gap-2 px-3 py-2 rounded-lg border transition-colors',
+              activeSessionId && !execution.isRunning
+                ? 'border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300'
+                : 'border-gray-200 dark:border-gray-700 text-gray-400 dark:text-gray-500 cursor-not-allowed'
+            )}
+            title="重置会话"
+          >
+            <RefreshCw className="h-4 w-4" />
+          </button>
+ 
+          {onOpenSettings && (
+            <button
+              onClick={onOpenSettings}
+              className="flex items-center justify-center gap-2 px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300 transition-colors"
+              title="设置"
+            >
+              <Settings className="h-4 w-4" />
+            </button>
+          )}
+        </div>
+      </div>
+ 
+      {/* Template Modal */}
+      <TaskTemplateModal
+        isOpen={isTemplateModalOpen}
+        onClose={closeTemplateModal}
+        onSelect={(template, params) => {
+          const { executeTemplate } = useBrowserHandStore.getState();
+          executeTemplate(template.id, params);
+        }}
+      />
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/ScreenshotPreview.tsx.html b/desktop/coverage/src/components/BrowserHand/ScreenshotPreview.tsx.html new file mode 100644 index 0000000..162887e --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/ScreenshotPreview.tsx.html @@ -0,0 +1,538 @@ + + + + + + Code coverage report for src/components/BrowserHand/ScreenshotPreview.tsx + + + + + + + + + +
+
+

All files / src/components/BrowserHand ScreenshotPreview.tsx

+
+ +
+ 0% + Statements + 0/100 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ScreenshotPreview Component
+ *
+ * Displays browser screenshots with zoom and fullscreen capabilities.
+ */
+ 
+import React from 'react';
+import { Expand, RefreshCw, Loader2, Camera, X } from 'lucide-react';
+ 
+import { cn } from '../../lib/utils';
+ 
+interface ScreenshotPreviewProps {
+  /** Base64 encoded screenshot data */
+  base64: string | null;
+  /** Loading state */
+  isLoading?: boolean;
+  /** Callback when refresh is requested */
+  onRefresh?: () => void;
+  /** Callback when clicked (for fullscreen) */
+  onClick?: () => void;
+  /** Alt text when no screenshot */
+  altText?: string;
+  /** Container class name */
+  className?: string;
+}
+ 
+export function ScreenshotPreview({
+  base64,
+  isLoading = false,
+  onRefresh,
+  onClick,
+  altText = '等待截图',
+  className = '',
+}: ScreenshotPreviewProps) {
+  const [isFullscreen, setIsFullscreen] = React.useState(false);
+ 
+  // Handle keyboard shortcut for fullscreen toggle
+  React.useEffect(() => {
+    const handleKeyDown = (e: KeyboardEvent) => {
+      if (e.key === 'Escape' && isFullscreen) {
+        setIsFullscreen(false);
+      }
+    };
+ 
+    if (isFullscreen) {
+      window.addEventListener('keydown', handleKeyDown);
+      return () => window.removeEventListener('keydown', handleKeyDown);
+    }
+  }, [isFullscreen]);
+ 
+  if (!base64 && !isLoading) {
+    return (
+      <div
+        className={cn(
+          'flex items-center justify-center h-48 bg-gray-100 dark:bg-gray-800 rounded-lg border-2 border-dashed',
+          className
+        )}
+      >
+        <Camera className="h-8 w-8 text-gray-400" />
+        <p className="mt-2 text-sm text-gray-400">{altText}</p>
+      </div>
+    );
+  }
+ 
+  const handleClick = () => {
+    if (onClick) {
+      onClick();
+    }
+    setIsFullscreen(true);
+  };
+ 
+  return (
+    <div
+      className={cn(
+        'relative group',
+        isFullscreen && 'fixed inset-0 z-50 bg-black/90 flex items-center justify-center'
+      )}
+    >
+      {/* Loading overlay */}
+      {isLoading && (
+        <div className="absolute inset-0 bg-black/50 flex items-center justify-center z-20">
+          <Loader2 className="h-8 w-8 text-white animate-spin" />
+        </div>
+      )}
+ 
+      {/* Toolbar */}
+      <div
+        className={cn(
+          'absolute top-2 right-2 flex items-center gap-2 z-10',
+          isFullscreen && 'bg-black/80 rounded-lg p-1'
+        )}
+      >
+        {onRefresh && (
+          <button
+            onClick={onRefresh}
+            className="p-1.5 rounded-md bg-black/60 hover:bg-black/70 transition-colors text-white"
+            title="刷新截图"
+          >
+            <RefreshCw className="h-4 w-4" />
+          </button>
+        )}
+        <button
+          onClick={handleClick}
+          className="p-1.5 rounded-md bg-black/60 hover:bg-black/70 transition-colors text-white"
+          title="全屏查看"
+        >
+          <Expand className="h-4 w-4" />
+        </button>
+      </div>
+ 
+      {/* Screenshot image */}
+      <div
+        className={cn(
+          'w-full h-full overflow-auto bg-gray-900 rounded-lg cursor-pointer'
+        )}
+        onClick={handleClick}
+      >
+        <img
+          src={`data:image/png;base64,${base64}`}
+          alt="Browser screenshot"
+          className={cn(
+            'max-w-full max-h-full object-contain transition-transform duration-200',
+            isFullscreen ? 'scale-150' : 'scale-100'
+          )}
+          draggable={false}
+        />
+      </div>
+ 
+      {/* Fullscreen modal */}
+      {isFullscreen && (
+        <div
+          className="fixed inset-0 z-50 bg-black/95 flex items-center justify-center p-4"
+          onClick={() => setIsFullscreen(false)}
+        >
+          <img
+            src={`data:image/png;base64,${base64}`}
+            alt="Browser screenshot fullscreen"
+            className="max-h-[85vh] max-w-[85vw] object-contain shadow-2xl"
+            onClick={(e) => e.stopPropagation()}
+          />
+          <button
+            onClick={() => setIsFullscreen(false)}
+            className="absolute top-4 right-4 p-2 rounded-full bg-black/60 hover:bg-black/70 transition-colors text-white"
+          >
+            <X className="h-4 w-4" />
+          </button>
+        </div>
+      )}
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/TaskTemplateModal.tsx.html b/desktop/coverage/src/components/BrowserHand/TaskTemplateModal.tsx.html new file mode 100644 index 0000000..ea8b9be --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/TaskTemplateModal.tsx.html @@ -0,0 +1,1336 @@ + + + + + + Code coverage report for src/components/BrowserHand/TaskTemplateModal.tsx + + + + + + + + + +
+
+

All files / src/components/BrowserHand TaskTemplateModal.tsx

+
+ +
+ 0% + Statements + 0/306 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/306 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * TaskTemplateModal Component
+ *
+ * Modal for selecting task templates and configuring parameters.
+ */
+ 
+import React, { useState, useEffect } from 'react';
+import {
+  X,
+  Play,
+  AlertCircle,
+  Camera,
+  FileText,
+  List,
+  MousePointerClick,
+  Code,
+  Image,
+  Link,
+  Table,
+  LogIn,
+  Layers,
+  Activity,
+  ClipboardList,
+  ChevronsRight,
+  Info,
+} from 'lucide-react';
+import { cn } from '../../lib/utils';
+import {
+  validateTemplateParams,
+  mergeParamsWithDefaults,
+  getTemplatesByCategory,
+  type TaskTemplate,
+  type TemplateCategory,
+  type TaskTemplateParam,
+} from './templates';
+ 
+interface TaskTemplateModalProps {
+  isOpen: boolean;
+  onClose: () => void;
+  onSelect: (template: TaskTemplate, params: Record<string, unknown>) => void;
+}
+ 
+const categoryIcons: Record<TemplateCategory, React.FC<{ className?: string }>> = {
+  basic: Camera,
+  scraping: FileText,
+  automation: Layers,
+};
+ 
+const categoryColors: Record<TemplateCategory, string> = {
+  basic: 'bg-blue-500',
+  scraping: 'bg-green-500',
+  automation: 'bg-purple-500',
+};
+ 
+export function TaskTemplateModal({
+  isOpen,
+  onClose,
+  onSelect,
+}: TaskTemplateModalProps) {
+  const [selectedCategory, setSelectedCategory] = useState<TemplateCategory>('basic');
+  const [selectedTemplate, setSelectedTemplate] = useState<TaskTemplate | null>(null);
+  const [params, setParams] = useState<Record<string, unknown>>({});
+  const [validationErrors, setValidationErrors] = useState<string[]>([]);
+ 
+  const basicTemplates = getTemplatesByCategory('basic');
+  const scrapingTemplates = getTemplatesByCategory('scraping');
+  const automationTemplates = getTemplatesByCategory('automation');
+ 
+  // Reset when modal closes
+  useEffect(() => {
+    if (!isOpen) {
+      setSelectedTemplate(null);
+      setParams({});
+      setValidationErrors([]);
+    }
+  }, [isOpen]);
+ 
+  // Handle template selection
+  const handleTemplateSelect = (template: TaskTemplate) => {
+    setSelectedTemplate(template);
+    setParams({});
+    setValidationErrors([]);
+  };
+ 
+  // Handle param change
+  const handleParamChange = (key: string, value: unknown) => {
+    setParams((prev) => ({ ...prev, [key]: value }));
+    setValidationErrors((prev) => prev.filter((e) => e !== key));
+  };
+ 
+  // Handle form submission
+  const handleSubmit = () => {
+    if (!selectedTemplate) return;
+ 
+    // Validate params
+    const validation = validateTemplateParams(selectedTemplate.params, params);
+    if (!validation.valid) {
+      setValidationErrors(validation.errors.map((e) => e.message));
+      return;
+    }
+ 
+    // Merge with defaults and execute
+    const mergedParams = mergeParamsWithDefaults(selectedTemplate.params, params);
+    onSelect(selectedTemplate, mergedParams);
+    onClose();
+  };
+ 
+  // Get icon component
+  const getIconComponent = (iconName: string) => {
+    const icons: Record<string, React.FC<{ className?: string }>> = {
+      Camera,
+      FileText,
+      List,
+      MousePointerClick,
+      Code,
+      Image,
+      Link,
+      Table,
+      LogIn,
+      Layers,
+      Activity,
+      ClipboardList,
+      ChevronsRight,
+      Info,
+    };
+    const IconComponent = icons[iconName] || Info;
+    return <IconComponent className="h-5 w-5" />;
+  };
+ 
+  if (!isOpen) return null;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center p-4">
+      {/* Backdrop */}
+      <div
+        className="fixed inset-0 bg-black/60 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div
+        className="relative bg-white dark:bg-gray-900 rounded-xl shadow-2xl w-full max-w-4xl max-h-[85vh] overflow-hidden"
+        onClick={(e) => e.stopPropagation()}
+      >
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            选择任务模板
+          </h2>
+          <button
+            onClick={onClose}
+            className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
+          >
+            <X className="h-5 w-5" />
+          </button>
+        </div>
+ 
+        {/* Category Tabs */}
+        <div className="flex gap-2 p-4 border-b border-gray-200 dark:border-gray-700">
+          {(['basic', 'scraping', 'automation'] as TemplateCategory[]).map((category) => {
+            const CategoryIcon = categoryIcons[category];
+            return (
+              <button
+                key={category}
+                onClick={() => setSelectedCategory(category)}
+                className={cn(
+                  'px-4 py-2 rounded-lg text-sm font-medium transition-colors',
+                  selectedCategory === category
+                    ? 'bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-100'
+                    : 'hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300'
+                )}
+              >
+                <span className="flex items-center gap-2">
+                  <CategoryIcon className="h-4 w-4" />
+                  {category === 'basic' && '基础操作'}
+                  {category === 'scraping' && '数据采集'}
+                  {category === 'automation' && '自动化流程'}
+                </span>
+              </button>
+            );
+          })}
+        </div>
+ 
+        {/* Content */}
+        <div className="flex flex-1 overflow-hidden">
+          {/* Template List */}
+          <div className="w-1/2 p-4 overflow-y-auto border-r border-gray-200 dark:border-gray-700">
+            <div className="grid grid-cols-1 gap-2">
+              {(selectedCategory === 'basic' ? basicTemplates :
+                selectedCategory === 'scraping' ? scrapingTemplates :
+                automationTemplates
+              ).map((template) => (
+                <button
+                  key={template.id}
+                  onClick={() => handleTemplateSelect(template)}
+                  className={cn(
+                    'p-3 rounded-lg border text-left transition-all',
+                    selectedTemplate?.id === template.id
+                      ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/30'
+                      : 'border-gray-200 hover:border-gray-300 dark:border-gray-700 dark:hover:border-gray-600'
+                  )}
+                >
+                  <div className="flex items-center gap-3">
+                    <div
+                      className={cn(
+                        'p-2 rounded-lg text-white',
+                        categoryColors[template.category]
+                      )}
+                    >
+                      {getIconComponent(template.icon)}
+                    </div>
+                    <div className="flex-1 min-w-0">
+                      <h3 className="font-medium text-gray-900 dark:text-white text-sm">
+                        {template.name}
+                      </h3>
+                      <p className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+                        {template.description}
+                      </p>
+                    </div>
+                  </div>
+                </button>
+              ))}
+            </div>
+          </div>
+ 
+          {/* Parameter Form */}
+          <div className="w-1/2 p-4 overflow-y-auto border-l border-gray-200 dark:border-gray-700">
+            {selectedTemplate ? (
+              <div className="space-y-4">
+                <div className="flex items-center gap-2 mb-4">
+                  <div
+                    className={cn(
+                      'p-2 rounded-lg text-white',
+                      categoryColors[selectedTemplate.category]
+                    )}
+                  >
+                    {getIconComponent(selectedTemplate.icon)}
+                  </div>
+                  <div>
+                    <h3 className="font-medium text-gray-900 dark:text-white">
+                      {selectedTemplate.name}
+                    </h3>
+                    <p className="text-sm text-gray-500 dark:text-gray-400">
+                      {selectedTemplate.description}
+                    </p>
+                  </div>
+                </div>
+ 
+                {selectedTemplate.params.map((param) => (
+                  <div key={param.key} className="space-y-1">
+                    <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+                      {param.label}
+                      {param.required && <span className="text-red-500 ml-1">*</span>}
+                    </label>
+                    {param.description && (
+                      <p className="text-xs text-gray-500 dark:text-gray-400">
+                        {param.description}
+                      </p>
+                    )}
+ 
+                    {renderParamInput(param, params[param.key], handleParamChange)}
+ 
+                    {validationErrors.includes(`${param.label} 是必填项`) && !params[param.key] && (
+                      <p className="text-sm text-red-500">{param.label} 是必填项</p>
+                    )}
+                  </div>
+                ))}
+ 
+                {validationErrors.length > 0 && (
+                  <div className="mt-4 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800">
+                    <div className="flex items-center gap-2 text-red-600 dark:text-red-400">
+                      <AlertCircle className="h-4 w-4" />
+                      <span className="text-sm">请检查以下错误:</span>
+                    </div>
+                    <ul className="mt-2 text-sm text-red-600 dark:text-red-400 list-disc list-inside">
+                      {validationErrors.map((error, i) => (
+                        <li key={i}>{error}</li>
+                      ))}
+                    </ul>
+                  </div>
+                )}
+              </div>
+            ) : (
+              <div className="flex flex-col items-center justify-center h-full text-gray-500 dark:text-gray-400">
+                <Play className="h-12 w-12 mb-4" />
+                <p>选择左侧的模板以配置参数</p>
+              </div>
+            )}
+          </div>
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-3 p-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800">
+          <button
+            onClick={onClose}
+            className="px-4 py-2 rounded-lg text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
+          >
+            取消
+          </button>
+          <button
+            onClick={handleSubmit}
+            disabled={!selectedTemplate}
+            className={cn(
+              'px-4 py-2 rounded-lg font-medium transition-colors flex items-center gap-2',
+              selectedTemplate
+                ? 'bg-blue-600 text-white hover:bg-blue-700'
+                : 'bg-gray-300 text-gray-500 cursor-not-allowed dark:bg-gray-700 dark:text-gray-500'
+            )}
+          >
+            <Play className="h-4 w-4" />
+            执行任务
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// Helper function to render param input
+function renderParamInput(
+  param: TaskTemplateParam,
+  value: unknown,
+  onChange: (key: string, value: unknown) => void
+) {
+  const inputId = `param-${param.key}`;
+ 
+  const baseInputClasses = 'w-full px-3 py-2 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent';
+ 
+  switch (param.type) {
+    case 'text':
+    case 'url':
+      return (
+        <input
+          id={inputId}
+          type={param.type === 'url' ? 'url' : 'text'}
+          value={(value as string) ?? ''}
+          onChange={(e) => onChange(param.key, e.target.value)}
+          placeholder={param.placeholder}
+          className={baseInputClasses}
+        />
+      );
+ 
+    case 'number':
+      return (
+        <input
+          id={inputId}
+          type="number"
+          value={(value as number) ?? param.default ?? ''}
+          onChange={(e) => onChange(param.key, e.target.value ? Number(e.target.value) : undefined)}
+          placeholder={param.placeholder}
+          min={param.min}
+          max={param.max}
+          className={baseInputClasses}
+        />
+      );
+ 
+    case 'boolean':
+      return (
+        <label className="flex items-center gap-2 cursor-pointer">
+          <input
+            id={inputId}
+            type="checkbox"
+            checked={(value as boolean) ?? (param.default as boolean) ?? false}
+            onChange={(e) => onChange(param.key, e.target.checked)}
+            className="w-4 h-4 rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500"
+          />
+          <span className="text-sm text-gray-700 dark:text-gray-300">
+            {param.description || '启用'}
+          </span>
+        </label>
+      );
+ 
+    case 'select':
+      return (
+        <select
+          id={inputId}
+          value={(value as string) ?? ''}
+          onChange={(e) => onChange(param.key, e.target.value)}
+          className={baseInputClasses}
+        >
+          <option value="">请选择...</option>
+          {param.options?.map((option) => (
+            <option key={option.value} value={option.value}>
+              {option.label}
+            </option>
+          ))}
+        </select>
+      );
+ 
+    case 'textarea':
+    case 'json':
+      return (
+        <textarea
+          id={inputId}
+          value={(value as string) ?? ''}
+          onChange={(e) => onChange(param.key, e.target.value)}
+          placeholder={param.placeholder}
+          rows={param.type === 'json' ? 4 : 3}
+          className={`${baseInputClasses} font-mono text-sm`}
+        />
+      );
+ 
+    default:
+      return (
+        <input
+          id={inputId}
+          type="text"
+          value={(value as string) ?? ''}
+          onChange={(e) => onChange(param.key, e.target.value)}
+          placeholder={param.placeholder}
+          className={baseInputClasses}
+        />
+      );
+  }
+}
+ 
+export default TaskTemplateModal;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/index.html b/desktop/coverage/src/components/BrowserHand/index.html new file mode 100644 index 0000000..be49773 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/components/BrowserHand + + + + + + + + + +
+
+

All files src/components/BrowserHand

+
+ +
+ 0% + Statements + 0/577 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/577 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
BrowserHandCard.tsx +
+
0%0/1700%0/10%0/10%0/170
ScreenshotPreview.tsx +
+
0%0/1000%0/10%0/10%0/100
TaskTemplateModal.tsx +
+
0%0/3060%0/10%0/10%0/306
index.ts +
+
0%0/10%0/10%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/index.ts.html b/desktop/coverage/src/components/BrowserHand/index.ts.html new file mode 100644 index 0000000..83b4823 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/index.ts.html @@ -0,0 +1,211 @@ + + + + + + Code coverage report for src/components/BrowserHand/index.ts + + + + + + + + + +
+
+

All files / src/components/BrowserHand index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * BrowserHand Module
+ *
+ * Exports all Browser Hand components and utilities.
+ */
+ 
+// Components
+export { BrowserHandCard } from './BrowserHandCard';
+export { TaskTemplateModal } from './TaskTemplateModal';
+export { ScreenshotPreview } from './ScreenshotPreview';
+ 
+// Templates
+export {
+  BUILTIN_TEMPLATES,
+  templateRegistry,
+  validateTemplateParams,
+  mergeParamsWithDefaults,
+  getTemplate,
+  getTemplatesByCategory,
+  getAllTemplates,
+  registerTemplate,
+} from './templates';
+ 
+// Types
+export type {
+  TaskTemplate,
+  TaskTemplateParam,
+  TemplateCategory,
+  ExecutionContext,
+  ExecutionState,
+  ExecutionStatus,
+  BrowserSession,
+  SessionStatus,
+  BrowserLog,
+  LogLevel,
+  RecentTask,
+  TaskResultStatus,
+  SessionOptions,
+  ValidationError,
+  ValidationResult,
+  TemplateRegistry,
+} from './templates';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/templates/automation.ts.html b/desktop/coverage/src/components/BrowserHand/templates/automation.ts.html new file mode 100644 index 0000000..1b94e70 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/templates/automation.ts.html @@ -0,0 +1,2047 @@ + + + + + + Code coverage report for src/components/BrowserHand/templates/automation.ts + + + + + + + + + +
+
+

All files / src/components/BrowserHand/templates automation.ts

+
+ +
+ 0% + Statements + 0/501 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/501 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Automation Templates for Browser Hand
+ *
+ * Contains complex automation workflow templates.
+ */
+ 
+import type { TaskTemplate, ExecutionContext } from './types';
+ 
+// ============================================================================
+// Template: Login and Action
+// ============================================================================
+ 
+const loginActionTemplate: TaskTemplate = {
+  id: 'auto_login_action',
+  name: '登录并操作',
+  description: '登录网站后执行一系列操作',
+  category: 'automation',
+  icon: 'LogIn',
+  params: [
+    {
+      key: 'loginUrl',
+      label: '登录页面',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/login',
+    },
+    {
+      key: 'credentials',
+      label: '登录凭据',
+      type: 'json',
+      required: true,
+      default: {},
+      description: 'JSON 对象,包含用户名和密码字段选择器',
+      placeholder: '{"usernameSelector": "input[name=\\"username\\"]", "username": "user@example.com", "passwordSelector": "input[name=\\"password\\"]", "password": "pass123", "submitSelector": "button[type=\\"submit\\"]"}',
+    },
+    {
+      key: 'actions',
+      label: '操作序列',
+      type: 'json',
+      required: true,
+      default: [],
+      description: '登录后执行的操作数组',
+      placeholder: '[{"type": "click", "selector": ".button"}, {"type": "wait", "selector": ".result"}]',
+    },
+    {
+      key: 'takeFinalScreenshot',
+      label: '最终截图',
+      type: 'boolean',
+      required: false,
+      default: true,
+      description: '操作完成后是否截图',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const loginUrl = params.loginUrl as string;
+    const credentials = params.credentials as {
+      usernameSelector: string;
+      username: string;
+      passwordSelector: string;
+      password: string;
+      submitSelector: string;
+    };
+    const actions = params.actions as Array<{
+      type: 'click' | 'type' | 'wait' | 'navigate' | 'screenshot';
+      selector?: string;
+      value?: string;
+      url?: string;
+    }>;
+    const takeFinalScreenshot = params.takeFinalScreenshot as boolean;
+ 
+    // Step 1: Navigate to login page
+    onProgress('正在导航到登录页面...', 0);
+    onLog('info', `访问: ${loginUrl}`);
+    await browser.goto(loginUrl);
+ 
+    // Step 2: Fill credentials
+    onProgress('正在填写登录信息...', 15);
+    onLog('action', `填写用户名: ${credentials.usernameSelector}`);
+    await browser.wait(credentials.usernameSelector, 10000);
+    await browser.type(credentials.usernameSelector, credentials.username, true);
+ 
+    onLog('action', `填写密码: ${credentials.passwordSelector}`);
+    await browser.type(credentials.passwordSelector, credentials.password, true);
+ 
+    // Step 3: Submit login
+    onProgress('正在登录...', 25);
+    onLog('action', `点击登录: ${credentials.submitSelector}`);
+    await browser.click(credentials.submitSelector);
+ 
+    // Wait for login to complete
+    onProgress('等待登录完成...', 35);
+    await new Promise((resolve) => setTimeout(resolve, 3000));
+ 
+    onLog('info', `登录完成,当前 URL: ${await browser.url()}`);
+ 
+    // Step 4: Execute actions
+    const actionResults: unknown[] = [];
+ 
+    for (let i = 0; i < actions.length; i++) {
+      const action = actions[i];
+      const progress = 40 + Math.floor((i / actions.length) * 50);
+ 
+      onProgress(`执行操作 ${i + 1}/${actions.length}...`, progress);
+ 
+      try {
+        switch (action.type) {
+          case 'click':
+            if (action.selector) {
+              onLog('action', `点击: ${action.selector}`);
+              await browser.wait(action.selector, 5000);
+              await browser.click(action.selector);
+              await new Promise((resolve) => setTimeout(resolve, 500));
+            }
+            break;
+ 
+          case 'type':
+            if (action.selector && action.value) {
+              onLog('action', `输入: ${action.selector}`);
+              await browser.wait(action.selector, 5000);
+              await browser.type(action.selector, action.value, true);
+            }
+            break;
+ 
+          case 'wait':
+            if (action.selector) {
+              onLog('action', `等待: ${action.selector}`);
+              await browser.wait(action.selector, 10000);
+            }
+            break;
+ 
+          case 'navigate':
+            if (action.url) {
+              onLog('action', `导航到: ${action.url}`);
+              await browser.goto(action.url);
+            }
+            break;
+ 
+          case 'screenshot':
+            onLog('action', '截图');
+            const screenshot = await browser.screenshot();
+            actionResults.push({ type: 'screenshot', base64: screenshot.base64 });
+            break;
+        }
+        actionResults.push({ type: action.type, success: true });
+      } catch (error) {
+        onLog('error', `操作失败: ${action.type}`, { error: String(error) });
+        actionResults.push({ type: action.type, success: false, error: String(error) });
+      }
+    }
+ 
+    // Step 5: Final screenshot
+    const result: Record<string, unknown> = {
+      loginUrl,
+      finalUrl: await browser.url(),
+      actionsCompleted: actions.length,
+      actionResults,
+    };
+ 
+    if (takeFinalScreenshot) {
+      onProgress('正在截取最终快照...', 95);
+      const screenshot = await browser.screenshot();
+      result.screenshot = screenshot.base64;
+    }
+ 
+    onProgress('完成', 100);
+    return result;
+  },
+};
+ 
+// ============================================================================
+// Template: Multi-Page Navigation
+// ============================================================================
+ 
+const multiPageTemplate: TaskTemplate = {
+  id: 'auto_multi_page',
+  name: '多页面导航',
+  description: '遍历多个页面并执行操作',
+  category: 'automation',
+  icon: 'Layers',
+  params: [
+    {
+      key: 'urls',
+      label: 'URL 列表',
+      type: 'textarea',
+      required: true,
+      placeholder: 'https://example.com/page1\nhttps://example.com/page2',
+      description: '每行一个 URL',
+    },
+    {
+      key: 'actions',
+      label: '每页操作',
+      type: 'json',
+      required: true,
+      default: [],
+      description: '在每个页面执行的操作',
+      placeholder: '[{"type": "screenshot"}]',
+    },
+    {
+      key: 'delayBetweenPages',
+      label: '页面间隔 (毫秒)',
+      type: 'number',
+      required: false,
+      default: 1000,
+      min: 0,
+      max: 10000,
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const urlsText = params.urls as string;
+    const urls = urlsText.split('\n').map((s) => s.trim()).filter(Boolean);
+    const actions = params.actions as Array<{
+      type: 'click' | 'type' | 'wait' | 'screenshot' | 'extract';
+      selector?: string;
+      value?: string;
+    }>;
+    const delayBetweenPages = (params.delayBetweenPages as number) ?? 1000;
+ 
+    const results: Array<{
+      url: string;
+      success: boolean;
+      data?: unknown;
+      error?: string;
+    }> = [];
+ 
+    for (let i = 0; i < urls.length; i++) {
+      const url = urls[i];
+      const progress = Math.floor((i / urls.length) * 95);
+ 
+      onProgress(`处理页面 ${i + 1}/${urls.length}...`, progress);
+      onLog('info', `访问: ${url}`);
+ 
+      try {
+        await browser.goto(url);
+        await new Promise((resolve) => setTimeout(resolve, delayBetweenPages));
+ 
+        const pageData: Record<string, unknown> = {};
+ 
+        for (const action of actions) {
+          switch (action.type) {
+            case 'screenshot':
+              const screenshot = await browser.screenshot();
+              pageData.screenshot = screenshot.base64;
+              break;
+ 
+            case 'extract':
+              if (action.selector) {
+                const text = await browser.eval(`
+                  (selector) => document.querySelector(selector)?.textContent?.trim()
+                `, [action.selector]);
+                pageData.extracted = text;
+              }
+              break;
+ 
+            case 'click':
+              if (action.selector) {
+                await browser.click(action.selector);
+              }
+              break;
+ 
+            case 'wait':
+              if (action.selector) {
+                await browser.wait(action.selector, 5000);
+              }
+              break;
+          }
+        }
+ 
+        results.push({ url, success: true, data: pageData });
+        onLog('info', `页面处理完成: ${url}`);
+      } catch (error) {
+        results.push({ url, success: false, error: String(error) });
+        onLog('error', `页面处理失败: ${url}`, { error: String(error) });
+      }
+    }
+ 
+    onProgress('完成', 100);
+    return {
+      total: urls.length,
+      successful: results.filter((r) => r.success).length,
+      failed: results.filter((r) => !r.success).length,
+      results,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Monitor Page Changes
+// ============================================================================
+ 
+const monitorTemplate: TaskTemplate = {
+  id: 'auto_monitor',
+  name: '监控页面变化',
+  description: '定时检查页面内容变化',
+  category: 'automation',
+  icon: 'Activity',
+  params: [
+    {
+      key: 'url',
+      label: '监控页面',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/price',
+    },
+    {
+      key: 'selector',
+      label: '监控元素',
+      type: 'text',
+      required: true,
+      placeholder: '.price',
+      description: '要监控的元素选择器',
+    },
+    {
+      key: 'interval',
+      label: '检查间隔 (秒)',
+      type: 'number',
+      required: false,
+      default: 60,
+      min: 10,
+      max: 3600,
+    },
+    {
+      key: 'iterations',
+      label: '检查次数',
+      type: 'number',
+      required: false,
+      default: 5,
+      min: 1,
+      max: 100,
+    },
+    {
+      key: 'alertOnChange',
+      label: '变化时截图',
+      type: 'boolean',
+      required: false,
+      default: true,
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const selector = params.selector as string;
+    const interval = (params.interval as number) ?? 60;
+    const iterations = (params.iterations as number) ?? 5;
+    const alertOnChange = params.alertOnChange as boolean;
+ 
+    const snapshots: Array<{
+      iteration: number;
+      timestamp: string;
+      value: string | null;
+      changed: boolean;
+      screenshot?: string;
+    }> = [];
+ 
+    let previousValue: string | null = null;
+ 
+    for (let i = 0; i < iterations; i++) {
+      const progress = Math.floor((i / iterations) * 95);
+ 
+      onProgress(`检查 ${i + 1}/${iterations}...`, progress);
+ 
+      try {
+        await browser.goto(url);
+        await browser.wait(selector, 10000);
+ 
+        const currentValue = await browser.eval(`
+          (selector) => document.querySelector(selector)?.textContent?.trim()
+        `, [selector]) as string | null;
+ 
+        const changed = previousValue !== null && currentValue !== previousValue;
+ 
+        const snapshot: typeof snapshots[0] = {
+          iteration: i + 1,
+          timestamp: new Date().toISOString(),
+          value: currentValue,
+          changed,
+        };
+ 
+        if (changed && alertOnChange) {
+          onLog('warn', `检测到变化!`, { from: previousValue, to: currentValue });
+          const screenshot = await browser.screenshot();
+          snapshot.screenshot = screenshot.base64;
+        } else {
+          onLog('info', `值: ${currentValue}`);
+        }
+ 
+        snapshots.push(snapshot);
+        previousValue = currentValue;
+ 
+        // Wait for next interval (except on last iteration)
+        if (i < iterations - 1) {
+          await new Promise((resolve) => setTimeout(resolve, interval * 1000));
+        }
+      } catch (error) {
+        onLog('error', `检查失败: ${error}`);
+        snapshots.push({
+          iteration: i + 1,
+          timestamp: new Date().toISOString(),
+          value: null,
+          changed: false,
+        });
+      }
+    }
+ 
+    onProgress('完成', 100);
+    return {
+      url,
+      selector,
+      totalChecks: iterations,
+      changesDetected: snapshots.filter((s) => s.changed).length,
+      snapshots,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Form Submission Sequence
+// ============================================================================
+ 
+const formSequenceTemplate: TaskTemplate = {
+  id: 'auto_form_sequence',
+  name: '表单提交序列',
+  description: '按顺序填写并提交多个表单',
+  category: 'automation',
+  icon: 'ClipboardList',
+  params: [
+    {
+      key: 'url',
+      label: '起始页面',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/wizard',
+    },
+    {
+      key: 'steps',
+      label: '表单步骤',
+      type: 'json',
+      required: true,
+      default: [],
+      description: '每个步骤的字段和提交按钮',
+      placeholder: '[{"fields": [{"selector": "input", "value": "test"}], "submit": "button"}]',
+    },
+    {
+      key: 'waitForNavigation',
+      label: '等待跳转',
+      type: 'boolean',
+      required: false,
+      default: true,
+      description: '提交后等待页面跳转',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const steps = params.steps as Array<{
+      fields: Array<{ selector: string; value: string; clearFirst?: boolean }>;
+      submit: string;
+    }>;
+    const waitForNavigation = params.waitForNavigation as boolean;
+ 
+    onProgress('正在导航到起始页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    const stepResults: Array<{
+      step: number;
+      success: boolean;
+      url: string;
+      error?: string;
+    }> = [];
+ 
+    for (let i = 0; i < steps.length; i++) {
+      const step = steps[i];
+      const progress = Math.floor(((i + 0.5) / steps.length) * 90);
+ 
+      onProgress(`步骤 ${i + 1}/${steps.length}: 填写字段...`, progress);
+ 
+      try {
+        // Fill fields
+        for (const field of step.fields) {
+          onLog('action', `填写: ${field.selector}`);
+          await browser.wait(field.selector, 5000);
+          await browser.type(field.selector, field.value, field.clearFirst ?? true);
+        }
+ 
+        // Submit
+        onProgress(`步骤 ${i + 1}/${steps.length}: 提交...`, progress + Math.floor(45 / steps.length));
+        onLog('action', `提交: ${step.submit}`);
+        await browser.click(step.submit);
+ 
+        if (waitForNavigation) {
+          await new Promise((resolve) => setTimeout(resolve, 2000));
+        }
+ 
+        stepResults.push({
+          step: i + 1,
+          success: true,
+          url: await browser.url(),
+        });
+      } catch (error) {
+        onLog('error', `步骤 ${i + 1} 失败: ${error}`);
+        stepResults.push({
+          step: i + 1,
+          success: false,
+          url: await browser.url(),
+          error: String(error),
+        });
+        // Continue to next step even if this one failed
+      }
+    }
+ 
+    onProgress('完成', 100);
+    return {
+      startUrl: url,
+      finalUrl: await browser.url(),
+      totalSteps: steps.length,
+      successfulSteps: stepResults.filter((r) => r.success).length,
+      stepResults,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Pagination Scraping
+// ============================================================================
+ 
+const paginationTemplate: TaskTemplate = {
+  id: 'auto_pagination',
+  name: '分页抓取',
+  description: '自动翻页并抓取数据',
+  category: 'automation',
+  icon: 'ChevronsRight',
+  params: [
+    {
+      key: 'url',
+      label: '起始页面',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/list',
+    },
+    {
+      key: 'itemSelector',
+      label: '项目选择器',
+      type: 'text',
+      required: true,
+      placeholder: '.item',
+    },
+    {
+      key: 'extractFields',
+      label: '提取字段',
+      type: 'json',
+      required: true,
+      default: {},
+      placeholder: '{"title": ".title", "price": ".price"}',
+    },
+    {
+      key: 'nextButtonSelector',
+      label: '下一页按钮',
+      type: 'text',
+      required: true,
+      placeholder: '.next-page',
+    },
+    {
+      key: 'maxPages',
+      label: '最大页数',
+      type: 'number',
+      required: false,
+      default: 5,
+      min: 1,
+      max: 100,
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const itemSelector = params.itemSelector as string;
+    const extractFields = params.extractFields as Record<string, string>;
+    const nextButtonSelector = params.nextButtonSelector as string;
+    const maxPages = (params.maxPages as number) ?? 5;
+ 
+    onProgress('正在导航到起始页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    const allItems: Array<Record<string, string>>[] = [];
+    let currentPage = 1;
+ 
+    while (currentPage <= maxPages) {
+      const progress = Math.floor((currentPage / maxPages) * 90);
+      onProgress(`正在抓取第 ${currentPage} 页...`, progress);
+ 
+      // Wait for items to load
+      await browser.wait(itemSelector, 10000);
+ 
+      // Extract items
+      const items = await browser.eval(`
+        ({ itemSelector, extractFields }) => {
+          const elements = document.querySelectorAll(itemSelector);
+          return Array.from(elements).map(el => {
+            const item = {};
+            for (const [field, selector] of Object.entries(extractFields)) {
+              const child = el.querySelector(selector);
+              item[field] = child?.textContent?.trim() || '';
+            }
+            return item;
+          });
+        }
+      `, [{ itemSelector, extractFields }]) as Array<Record<string, string>>;
+ 
+      allItems.push(items);
+      onLog('info', `第 ${currentPage} 页: ${items.length} 条数据`);
+ 
+      // Try to go to next page
+      try {
+        const nextButton = await browser.$(nextButtonSelector);
+        if (!nextButton || !nextButton.is_enabled) {
+          onLog('info', '没有更多页面');
+          break;
+        }
+ 
+        await browser.click(nextButtonSelector);
+        await new Promise((resolve) => setTimeout(resolve, 2000));
+        currentPage++;
+      } catch {
+        onLog('info', '已到达最后一页');
+        break;
+      }
+    }
+ 
+    const flatItems = allItems.flat();
+ 
+    onProgress('完成', 100);
+    return {
+      url,
+      pagesScraped: currentPage,
+      totalItems: flatItems.length,
+      itemsPerPage: allItems.map((p) => p.length),
+      data: flatItems,
+    };
+  },
+};
+ 
+// ============================================================================
+// Export All Automation Templates
+// ============================================================================
+ 
+export const automationTemplates: TaskTemplate[] = [
+  loginActionTemplate,
+  multiPageTemplate,
+  monitorTemplate,
+  formSequenceTemplate,
+  paginationTemplate,
+];
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/templates/basic.ts.html b/desktop/coverage/src/components/BrowserHand/templates/basic.ts.html new file mode 100644 index 0000000..1c86618 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/templates/basic.ts.html @@ -0,0 +1,1318 @@ + + + + + + Code coverage report for src/components/BrowserHand/templates/basic.ts + + + + + + + + + +
+
+

All files / src/components/BrowserHand/templates basic.ts

+
+ +
+ 0% + Statements + 0/335 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/335 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Basic Operation Templates for Browser Hand
+ *
+ * Contains fundamental browser operations: navigate, screenshot, form filling, clicking.
+ */
+ 
+import type { TaskTemplate, ExecutionContext } from './types';
+ 
+// ============================================================================
+// Template: Navigate and Screenshot
+// ============================================================================
+ 
+const navigateScreenshotTemplate: TaskTemplate = {
+  id: 'basic_navigate_screenshot',
+  name: '打开网页并截图',
+  description: '访问指定 URL 并截取页面快照',
+  category: 'basic',
+  icon: 'Camera',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com',
+      description: '要访问的网页 URL',
+    },
+    {
+      key: 'waitTime',
+      label: '等待时间 (毫秒)',
+      type: 'number',
+      required: false,
+      default: 2000,
+      min: 0,
+      max: 30000,
+      description: '页面加载后等待的时间',
+    },
+    {
+      key: 'waitFor',
+      label: '等待元素',
+      type: 'text',
+      required: false,
+      placeholder: '.main-content',
+      description: '等待特定元素出现后再截图(CSS 选择器)',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const waitTime = (params.waitTime as number) ?? 2000;
+    const waitFor = params.waitFor as string | undefined;
+ 
+    onProgress('正在创建浏览器会话...', 0);
+    onLog('info', `准备访问: ${url}`);
+ 
+    // Navigate to URL
+    onProgress('正在导航到页面...', 20);
+    const navResult = await browser.goto(url);
+    onLog('info', `页面标题: ${navResult.title}`);
+ 
+    // Wait for page to load
+    if (waitFor) {
+      onProgress('等待页面元素加载...', 40);
+      onLog('action', `等待元素: ${waitFor}`);
+      await browser.wait(waitFor, 10000);
+    } else if (waitTime > 0) {
+      onProgress('等待页面加载...', 40);
+      await new Promise((resolve) => setTimeout(resolve, waitTime));
+    }
+ 
+    // Take screenshot
+    onProgress('正在截取页面快照...', 80);
+    const screenshot = await browser.screenshot();
+    onLog('action', '截图完成', { size: screenshot.base64.length });
+ 
+    onProgress('完成', 100);
+ 
+    return {
+      url: await browser.url(),
+      title: await browser.title(),
+      screenshot: screenshot.base64,
+      format: screenshot.format,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Fill Form
+// ============================================================================
+ 
+const fillFormTemplate: TaskTemplate = {
+  id: 'basic_fill_form',
+  name: '填写表单',
+  description: '填写网页表单并可选提交',
+  category: 'basic',
+  icon: 'FileText',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/form',
+    },
+    {
+      key: 'fields',
+      label: '表单字段',
+      type: 'json',
+      required: true,
+      default: [],
+      description: 'JSON 数组,每项包含 selector 和 value',
+      placeholder: '[{"selector": "input[name=\\"email\\"]", "value": "test@example.com"}]',
+    },
+    {
+      key: 'submitSelector',
+      label: '提交按钮选择器',
+      type: 'text',
+      required: false,
+      placeholder: 'button[type="submit"]',
+      description: '填写完成后点击此按钮提交',
+    },
+    {
+      key: 'waitForNavigation',
+      label: '等待页面跳转',
+      type: 'boolean',
+      required: false,
+      default: false,
+      description: '提交后等待新页面加载完成',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const fields = params.fields as Array<{ selector: string; value: string }>;
+    const submitSelector = params.submitSelector as string | undefined;
+    const waitForNavigation = params.waitForNavigation as boolean;
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在填写表单...', 30);
+    const totalFields = fields.length;
+ 
+    for (let i = 0; i < fields.length; i++) {
+      const field = fields[i];
+      const progress = 30 + Math.floor((i / totalFields) * 40);
+      onProgress(`正在填写字段 ${i + 1}/${totalFields}...`, progress);
+      onLog('action', `填写: ${field.selector}`, { value: field.value });
+ 
+      try {
+        await browser.wait(field.selector, 5000);
+        await browser.type(field.selector, field.value, true);
+      } catch (error) {
+        onLog('warn', `字段填写失败: ${field.selector}`, {
+          error: String(error),
+        });
+      }
+    }
+ 
+    let result = {
+      url: await browser.url(),
+      fieldsFilled: fields.length,
+      submitted: false,
+    };
+ 
+    if (submitSelector) {
+      onProgress('正在提交表单...', 80);
+      onLog('action', `点击提交: ${submitSelector}`);
+ 
+      try {
+        await browser.click(submitSelector);
+        result.submitted = true;
+ 
+        if (waitForNavigation) {
+          onProgress('等待页面跳转...', 90);
+          await new Promise((resolve) => setTimeout(resolve, 2000));
+        }
+      } catch (error) {
+        onLog('error', `提交失败: ${submitSelector}`, {
+          error: String(error),
+        });
+      }
+    }
+ 
+    onProgress('完成', 100);
+    return result;
+  },
+};
+ 
+// ============================================================================
+// Template: Click and Navigate
+// ============================================================================
+ 
+const clickNavigateTemplate: TaskTemplate = {
+  id: 'basic_click_navigate',
+  name: '点击导航',
+  description: '点击页面元素并等待导航',
+  category: 'basic',
+  icon: 'MousePointerClick',
+  params: [
+    {
+      key: 'url',
+      label: '起始页面',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com',
+    },
+    {
+      key: 'selector',
+      label: '点击目标',
+      type: 'text',
+      required: true,
+      placeholder: 'a.link-to-page',
+      description: '要点击的元素的 CSS 选择器',
+    },
+    {
+      key: 'waitAfter',
+      label: '等待时间 (毫秒)',
+      type: 'number',
+      required: false,
+      default: 2000,
+      description: '点击后等待的时间',
+    },
+    {
+      key: 'takeScreenshot',
+      label: '截图结果',
+      type: 'boolean',
+      required: false,
+      default: true,
+      description: '点击后是否截图',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const selector = params.selector as string;
+    const waitAfter = (params.waitAfter as number) ?? 2000;
+    const takeScreenshot = params.takeScreenshot as boolean;
+ 
+    onProgress('正在导航到起始页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在查找点击目标...', 30);
+    onLog('action', `等待元素: ${selector}`);
+    await browser.wait(selector, 10000);
+ 
+    onProgress('正在点击...', 50);
+    onLog('action', `点击: ${selector}`);
+    await browser.click(selector);
+ 
+    onProgress('等待导航完成...', 70);
+    await new Promise((resolve) => setTimeout(resolve, waitAfter));
+ 
+    const result: Record<string, unknown> = {
+      fromUrl: url,
+      toUrl: await browser.url(),
+      title: await browser.title(),
+    };
+ 
+    if (takeScreenshot) {
+      onProgress('正在截图...', 90);
+      const screenshot = await browser.screenshot();
+      result.screenshot = screenshot.base64;
+      onLog('action', '截图完成');
+    }
+ 
+    onProgress('完成', 100);
+    return result;
+  },
+};
+ 
+// ============================================================================
+// Template: Get Page Info
+// ============================================================================
+ 
+const getPageInfoTemplate: TaskTemplate = {
+  id: 'basic_get_page_info',
+  name: '获取页面信息',
+  description: '获取页面标题、URL 和基本信息',
+  category: 'basic',
+  icon: 'Info',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com',
+    },
+    {
+      key: 'selectors',
+      label: '额外选择器',
+      type: 'textarea',
+      required: false,
+      placeholder: '.title\n.description\n.price',
+      description: '要提取文本的 CSS 选择器(每行一个)',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const selectorsText = params.selectors as string | undefined;
+    const selectors = selectorsText
+      ? selectorsText.split('\n').map((s) => s.trim()).filter(Boolean)
+      : [];
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在获取页面信息...', 50);
+ 
+    const result: Record<string, unknown> = {
+      url: await browser.url(),
+      title: await browser.title(),
+    };
+ 
+    if (selectors.length > 0) {
+      onProgress('正在提取元素文本...', 70);
+      const extracted: Record<string, string> = {};
+ 
+      for (const selector of selectors) {
+        try {
+          const text = await browser.eval(`
+            (selector) => {
+              const el = document.querySelector(selector);
+              return el ? el.textContent?.trim() : null;
+            }
+          `, [selector]);
+          if (text) {
+            extracted[selector] = text as string;
+            onLog('info', `提取: ${selector}`, { text });
+          }
+        } catch (error) {
+          onLog('warn', `提取失败: ${selector}`);
+        }
+      }
+ 
+      result.extracted = extracted;
+    }
+ 
+    onProgress('完成', 100);
+    return result;
+  },
+};
+ 
+// ============================================================================
+// Template: Execute JavaScript
+// ============================================================================
+ 
+const executeJsTemplate: TaskTemplate = {
+  id: 'basic_execute_js',
+  name: '执行 JavaScript',
+  description: '在页面上执行自定义 JavaScript 代码',
+  category: 'basic',
+  icon: 'Code',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com',
+    },
+    {
+      key: 'script',
+      label: 'JavaScript 代码',
+      type: 'textarea',
+      required: true,
+      placeholder: 'return document.title;',
+      description: '要执行的 JavaScript 代码',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const script = params.script as string;
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在执行 JavaScript...', 50);
+    onLog('action', '执行脚本', { script: script.substring(0, 100) });
+ 
+    try {
+      const result = await browser.eval(script);
+      onLog('info', '执行成功', { result: JSON.stringify(result).substring(0, 200) });
+      onProgress('完成', 100);
+      return { success: true, result };
+    } catch (error) {
+      onLog('error', `执行失败: ${error}`);
+      onProgress('失败', 100);
+      return { success: false, error: String(error) };
+    }
+  },
+};
+ 
+// ============================================================================
+// Export All Basic Templates
+// ============================================================================
+ 
+export const basicTemplates: TaskTemplate[] = [
+  navigateScreenshotTemplate,
+  fillFormTemplate,
+  clickNavigateTemplate,
+  getPageInfoTemplate,
+  executeJsTemplate,
+];
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/templates/index.html b/desktop/coverage/src/components/BrowserHand/templates/index.html new file mode 100644 index 0000000..77ffb98 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/templates/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/components/BrowserHand/templates + + + + + + + + + +
+
+

All files src/components/BrowserHand/templates

+
+ +
+ 0% + Statements + 0/1324 +
+ + +
+ 80% + Branches + 4/5 +
+ + +
+ 80% + Functions + 4/5 +
+ + +
+ 0% + Lines + 0/1324 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
automation.ts +
+
0%0/501100%1/1100%1/10%0/501
basic.ts +
+
0%0/335100%1/1100%1/10%0/335
index.ts +
+
0%0/1540%0/10%0/10%0/154
scraping.ts +
+
0%0/334100%1/1100%1/10%0/334
types.ts +
+
0%0/00%1/10%1/10%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/templates/index.ts.html b/desktop/coverage/src/components/BrowserHand/templates/index.ts.html new file mode 100644 index 0000000..e3726bd --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/templates/index.ts.html @@ -0,0 +1,805 @@ + + + + + + Code coverage report for src/components/BrowserHand/templates/index.ts + + + + + + + + + +
+
+

All files / src/components/BrowserHand/templates index.ts

+
+ +
+ 0% + Statements + 0/154 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/154 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Browser Hand Templates Registry
+ *
+ * Central registry for all browser automation task templates.
+ */
+ 
+import type {
+  TaskTemplate,
+  TemplateCategory,
+  TemplateRegistry,
+  TaskTemplateParam,
+  ValidationError,
+  ValidationResult,
+} from './types';
+import { basicTemplates } from './basic';
+import { scrapingTemplates } from './scraping';
+import { automationTemplates } from './automation';
+ 
+// ============================================================================
+// Re-export Types
+// ============================================================================
+ 
+export * from './types';
+ 
+// ============================================================================
+// All Built-in Templates
+// ============================================================================
+ 
+export const BUILTIN_TEMPLATES: TaskTemplate[] = [
+  ...basicTemplates,
+  ...scrapingTemplates,
+  ...automationTemplates,
+];
+ 
+// ============================================================================
+// Template Registry Implementation
+// ============================================================================
+ 
+function createTemplateRegistry(): TemplateRegistry {
+  const templates = new Map<string, TaskTemplate>();
+  const byCategory = new Map<TemplateCategory, TaskTemplate[]>();
+ 
+  // Initialize category maps
+  byCategory.set('basic', []);
+  byCategory.set('scraping', []);
+  byCategory.set('automation', []);
+ 
+  function register(template: TaskTemplate): void {
+    if (templates.has(template.id)) {
+      console.warn(`[BrowserHand] Template "${template.id}" already registered, overwriting`);
+    }
+    templates.set(template.id, template);
+ 
+    const categoryList = byCategory.get(template.category);
+    if (categoryList) {
+      // Remove existing if updating
+      const existingIndex = categoryList.findIndex((t) => t.id === template.id);
+      if (existingIndex >= 0) {
+        categoryList.splice(existingIndex, 1);
+      }
+      categoryList.push(template);
+    }
+  }
+ 
+  function get(id: string): TaskTemplate | undefined {
+    return templates.get(id);
+  }
+ 
+  function getByCategory(category: TemplateCategory): TaskTemplate[] {
+    return byCategory.get(category) ?? [];
+  }
+ 
+  function getAll(): TaskTemplate[] {
+    return Array.from(templates.values());
+  }
+ 
+  // Register all built-in templates
+  BUILTIN_TEMPLATES.forEach(register);
+ 
+  return {
+    templates,
+    byCategory,
+    register,
+    get,
+    getByCategory,
+    getAll,
+  };
+}
+ 
+// ============================================================================
+// Singleton Registry Instance
+// ============================================================================
+ 
+export const templateRegistry = createTemplateRegistry();
+ 
+// ============================================================================
+// Validation Utilities
+// ============================================================================
+ 
+/**
+ * Validate template parameters against their definitions
+ */
+export function validateTemplateParams(
+  templateParams: TaskTemplateParam[],
+  providedParams: Record<string, unknown>
+): ValidationResult {
+  const errors: ValidationError[] = [];
+ 
+  for (const param of templateParams) {
+    const value = providedParams[param.key];
+ 
+    // Check required
+    if (param.required && (value === undefined || value === null || value === '')) {
+      errors.push({
+        param: param.key,
+        message: `${param.label} 是必填项`,
+      });
+      continue;
+    }
+ 
+    // Skip further validation if not provided and not required
+    if (value === undefined || value === null || value === '') {
+      continue;
+    }
+ 
+    // Type-specific validation
+    switch (param.type) {
+      case 'url':
+        if (typeof value === 'string' && !isValidUrl(value)) {
+          errors.push({
+            param: param.key,
+            message: `${param.label} 必须是有效的 URL`,
+          });
+        }
+        break;
+ 
+      case 'number':
+        const numValue = Number(value);
+        if (isNaN(numValue)) {
+          errors.push({
+            param: param.key,
+            message: `${param.label} 必须是数字`,
+          });
+        } else {
+          if (param.min !== undefined && numValue < param.min) {
+            errors.push({
+              param: param.key,
+              message: `${param.label} 不能小于 ${param.min}`,
+            });
+          }
+          if (param.max !== undefined && numValue > param.max) {
+            errors.push({
+              param: param.key,
+              message: `${param.label} 不能大于 ${param.max}`,
+            });
+          }
+        }
+        break;
+ 
+      case 'json':
+        if (typeof value === 'string') {
+          try {
+            JSON.parse(value);
+          } catch {
+            errors.push({
+              param: param.key,
+              message: `${param.label} 必须是有效的 JSON`,
+            });
+          }
+        }
+        break;
+ 
+      case 'text':
+      case 'textarea':
+        if (param.pattern && typeof value === 'string') {
+          const regex = new RegExp(param.pattern);
+          if (!regex.test(value)) {
+            errors.push({
+              param: param.key,
+              message: `${param.label} 格式不正确`,
+            });
+          }
+        }
+        break;
+    }
+  }
+ 
+  return {
+    valid: errors.length === 0,
+    errors,
+  };
+}
+ 
+/**
+ * Check if string is a valid URL
+ */
+function isValidUrl(str: string): boolean {
+  try {
+    const url = new URL(str);
+    return url.protocol === 'http:' || url.protocol === 'https:';
+  } catch {
+    return false;
+  }
+}
+ 
+/**
+ * Get default values for template parameters
+ */
+export function getDefaultParams(templateParams: TaskTemplateParam[]): Record<string, unknown> {
+  const defaults: Record<string, unknown> = {};
+ 
+  for (const param of templateParams) {
+    if (param.default !== undefined) {
+      defaults[param.key] = param.default;
+    }
+  }
+ 
+  return defaults;
+}
+ 
+/**
+ * Merge provided params with defaults
+ */
+export function mergeParamsWithDefaults(
+  templateParams: TaskTemplateParam[],
+  providedParams: Record<string, unknown>
+): Record<string, unknown> {
+  const defaults = getDefaultParams(templateParams);
+  return { ...defaults, ...providedParams };
+}
+ 
+// ============================================================================
+// Convenience Exports
+// ============================================================================
+ 
+export const getTemplate = (id: string) => templateRegistry.get(id);
+export const getTemplatesByCategory = (category: TemplateCategory) =>
+  templateRegistry.getByCategory(category);
+export const getAllTemplates = () => templateRegistry.getAll();
+export const registerTemplate = (template: TaskTemplate) => templateRegistry.register(template);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/templates/scraping.ts.html b/desktop/coverage/src/components/BrowserHand/templates/scraping.ts.html new file mode 100644 index 0000000..f5473a2 --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/templates/scraping.ts.html @@ -0,0 +1,1690 @@ + + + + + + Code coverage report for src/components/BrowserHand/templates/scraping.ts + + + + + + + + + +
+
+

All files / src/components/BrowserHand/templates scraping.ts

+
+ +
+ 0% + Statements + 0/334 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/334 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Scraping Templates for Browser Hand
+ *
+ * Contains data scraping and extraction templates.
+ */
+ 
+import type { TaskTemplate, ExecutionContext } from './types';
+ 
+// ============================================================================
+// Template: Scrape Text
+// ============================================================================
+ 
+const scrapeTextTemplate: TaskTemplate = {
+  id: 'scrape_text',
+  name: '抓取页面文本',
+  description: '从多个选择器提取文本内容',
+  category: 'scraping',
+  icon: 'FileText',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com',
+    },
+    {
+      key: 'selectors',
+      label: '选择器列表',
+      type: 'textarea',
+      required: true,
+      placeholder: '.title\n.description\n.price',
+      description: 'CSS 选择器(每行一个)',
+    },
+    {
+      key: 'waitFor',
+      label: '等待元素',
+      type: 'text',
+      required: false,
+      placeholder: '.content',
+      description: '等待此元素出现后再抓取',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const selectorsText = params.selectors as string;
+    const waitFor = params.waitFor as string | undefined;
+    const selectors = selectorsText.split('\n').map((s) => s.trim()).filter(Boolean);
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    if (waitFor) {
+      onProgress('等待页面加载...', 20);
+      onLog('action', `等待元素: ${waitFor}`);
+      await browser.wait(waitFor, 10000);
+    }
+ 
+    onProgress('正在抓取文本...', 50);
+    const result: Record<string, string | string[]> = {};
+ 
+    for (let i = 0; i < selectors.length; i++) {
+      const selector = selectors[i];
+      const progress = 50 + Math.floor((i / selectors.length) * 40);
+ 
+      onProgress(`正在抓取 ${i + 1}/${selectors.length}...`, progress);
+ 
+      try {
+        // Try to get multiple elements first
+        const multipleResult = await browser.eval(`
+          (selector) => {
+            const elements = document.querySelectorAll(selector);
+            if (elements.length > 1) {
+              return Array.from(elements).map(el => el.textContent?.trim() || '');
+            } else if (elements.length === 1) {
+              return elements[0].textContent?.trim() || '';
+            }
+            return null;
+          }
+        `, [selector]);
+ 
+        if (multipleResult !== null) {
+          result[selector] = multipleResult as string | string[];
+          onLog('info', `抓取成功: ${selector}`);
+        } else {
+          result[selector] = '';
+          onLog('warn', `未找到元素: ${selector}`);
+        }
+      } catch (error) {
+        result[selector] = '';
+        onLog('error', `抓取失败: ${selector}`, { error: String(error) });
+      }
+    }
+ 
+    onProgress('完成', 100);
+    return { url: await browser.url(), data: result };
+  },
+};
+ 
+// ============================================================================
+// Template: Scrape List
+// ============================================================================
+ 
+const scrapeListTemplate: TaskTemplate = {
+  id: 'scrape_list',
+  name: '提取列表数据',
+  description: '从重复元素中批量提取结构化数据',
+  category: 'scraping',
+  icon: 'List',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/products',
+    },
+    {
+      key: 'itemSelector',
+      label: '列表项选择器',
+      type: 'text',
+      required: true,
+      placeholder: '.product-item',
+      description: '每个列表项的 CSS 选择器',
+    },
+    {
+      key: 'fieldMappings',
+      label: '字段映射',
+      type: 'json',
+      required: true,
+      default: {},
+      description: 'JSON 对象,映射字段名到选择器',
+      placeholder: '{"title": ".title", "price": ".price", "link": "a@href"}',
+    },
+    {
+      key: 'limit',
+      label: '最大数量',
+      type: 'number',
+      required: false,
+      default: 50,
+      min: 1,
+      max: 500,
+      description: '最多提取多少条数据',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const itemSelector = params.itemSelector as string;
+    const fieldMappings = params.fieldMappings as Record<string, string>;
+    const limit = (params.limit as number) ?? 50;
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('等待列表加载...', 30);
+    await browser.wait(itemSelector, 10000);
+ 
+    onProgress('正在提取列表数据...', 50);
+ 
+    const scrapingScript = `
+      ({ itemSelector, fieldMappings, limit }) => {
+        const items = document.querySelectorAll(itemSelector);
+        const results = [];
+ 
+        for (let i = 0; i < Math.min(items.length, limit); i++) {
+          const item = items[i];
+          const row = {};
+ 
+          for (const [field, selector] of Object.entries(fieldMappings)) {
+            // Handle attribute selectors like "a@href"
+            const parts = selector.split('@');
+            const cssSelector = parts[0];
+            const attr = parts[1];
+ 
+            const el = item.querySelector(cssSelector);
+            if (el) {
+              if (attr) {
+                row[field] = el.getAttribute(attr) || '';
+              } else {
+                row[field] = el.textContent?.trim() || '';
+              }
+            } else {
+              row[field] = '';
+            }
+          }
+ 
+          results.push(row);
+        }
+ 
+        return results;
+      }
+    `;
+ 
+    const result = await browser.eval(scrapingScript, [{
+      itemSelector,
+      fieldMappings,
+      limit,
+    }]);
+ 
+    const items = result as Array<Record<string, string>>;
+    onLog('info', `提取了 ${items.length} 条数据`);
+ 
+    onProgress('完成', 100);
+    return {
+      url: await browser.url(),
+      count: items.length,
+      data: items,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Scrape Images
+// ============================================================================
+ 
+const scrapeImagesTemplate: TaskTemplate = {
+  id: 'scrape_images',
+  name: '抓取图片列表',
+  description: '提取页面中的图片 URL',
+  category: 'scraping',
+  icon: 'Image',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/gallery',
+    },
+    {
+      key: 'imageSelector',
+      label: '图片选择器',
+      type: 'text',
+      required: false,
+      default: 'img',
+      placeholder: 'img.gallery-image',
+      description: '图片元素的 CSS 选择器',
+    },
+    {
+      key: 'minWidth',
+      label: '最小宽度',
+      type: 'number',
+      required: false,
+      default: 100,
+      description: '忽略小于此宽度的图片',
+    },
+    {
+      key: 'minHeight',
+      label: '最小高度',
+      type: 'number',
+      required: false,
+      default: 100,
+      description: '忽略小于此高度的图片',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const imageSelector = (params.imageSelector as string) ?? 'img';
+    const minWidth = (params.minWidth as number) ?? 100;
+    const minHeight = (params.minHeight as number) ?? 100;
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在提取图片...', 50);
+ 
+    const extractScript = `
+      ({ imageSelector, minWidth, minHeight }) => {
+        const images = document.querySelectorAll(imageSelector);
+        const results = [];
+ 
+        images.forEach(img => {
+          const width = img.naturalWidth || img.width;
+          const height = img.naturalHeight || img.height;
+ 
+          if (width >= minWidth && height >= minHeight) {
+            results.push({
+              src: img.src,
+              alt: img.alt || '',
+              width,
+              height,
+            });
+          }
+        });
+ 
+        return results;
+      }
+    `;
+ 
+    const result = await browser.eval(extractScript, [{
+      imageSelector,
+      minWidth,
+      minHeight,
+    }]);
+ 
+    const images = result as Array<{
+      src: string;
+      alt: string;
+      width: number;
+      height: number;
+    }>;
+ 
+    onLog('info', `找到 ${images.length} 张图片`);
+ 
+    onProgress('完成', 100);
+    return {
+      url: await browser.url(),
+      count: images.length,
+      images,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Scrape Links
+// ============================================================================
+ 
+const scrapeLinksTemplate: TaskTemplate = {
+  id: 'scrape_links',
+  name: '抓取链接列表',
+  description: '提取页面中的所有链接',
+  category: 'scraping',
+  icon: 'Link',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com',
+    },
+    {
+      key: 'linkSelector',
+      label: '链接选择器',
+      type: 'text',
+      required: false,
+      default: 'a[href]',
+      placeholder: 'a[href]',
+      description: '链接元素的 CSS 选择器',
+    },
+    {
+      key: 'filterPattern',
+      label: 'URL 过滤',
+      type: 'text',
+      required: false,
+      placeholder: 'example.com',
+      description: '只保留包含此文本的链接',
+    },
+    {
+      key: 'excludePattern',
+      label: '排除模式',
+      type: 'text',
+      required: false,
+      placeholder: '#, javascript:',
+      description: '排除包含此文本的链接',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const linkSelector = (params.linkSelector as string) ?? 'a[href]';
+    const filterPattern = params.filterPattern as string | undefined;
+    const excludePattern = params.excludePattern as string | undefined;
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在提取链接...', 50);
+ 
+    const extractScript = `
+      ({ linkSelector, filterPattern, excludePattern }) => {
+        const links = document.querySelectorAll(linkSelector);
+        const results = [];
+        const seen = new Set();
+ 
+        links.forEach(a => {
+          const href = a.href;
+          const text = a.textContent?.trim() || '';
+ 
+          if (!href || seen.has(href)) return;
+ 
+          // Apply filter
+          if (filterPattern && !href.includes(filterPattern) && !text.includes(filterPattern)) {
+            return;
+          }
+ 
+          // Apply exclude
+          if (excludePattern) {
+            const patterns = excludePattern.split(',').map(p => p.trim());
+            for (const p of patterns) {
+              if (href.includes(p)) return;
+            }
+          }
+ 
+          seen.add(href);
+          results.push({ href, text });
+        });
+ 
+        return results;
+      }
+    `;
+ 
+    const result = await browser.eval(extractScript, [{
+      linkSelector,
+      filterPattern,
+      excludePattern,
+    }]);
+ 
+    const links = result as Array<{ href: string; text: string }>;
+    onLog('info', `找到 ${links.length} 个链接`);
+ 
+    onProgress('完成', 100);
+    return {
+      url: await browser.url(),
+      count: links.length,
+      links,
+    };
+  },
+};
+ 
+// ============================================================================
+// Template: Scrape Table
+// ============================================================================
+ 
+const scrapeTableTemplate: TaskTemplate = {
+  id: 'scrape_table',
+  name: '抓取表格数据',
+  description: '从 HTML 表格中提取数据',
+  category: 'scraping',
+  icon: 'Table',
+  params: [
+    {
+      key: 'url',
+      label: '网页地址',
+      type: 'url',
+      required: true,
+      placeholder: 'https://example.com/data',
+    },
+    {
+      key: 'tableSelector',
+      label: '表格选择器',
+      type: 'text',
+      required: false,
+      default: 'table',
+      placeholder: 'table.data-table',
+      description: '表格元素的 CSS 选择器',
+    },
+    {
+      key: 'headerRow',
+      label: '表头行',
+      type: 'number',
+      required: false,
+      default: 1,
+      min: 0,
+      max: 10,
+      description: '表头所在行(0 表示无表头)',
+    },
+  ],
+  execute: async (params, context: ExecutionContext) => {
+    const { browser, onProgress, onLog } = context;
+    const url = params.url as string;
+    const tableSelector = (params.tableSelector as string) ?? 'table';
+    const headerRow = (params.headerRow as number) ?? 1;
+ 
+    onProgress('正在导航到页面...', 0);
+    onLog('info', `访问: ${url}`);
+    await browser.goto(url);
+ 
+    onProgress('正在提取表格数据...', 50);
+ 
+    const extractScript = `
+      ({ tableSelector, headerRow }) => {
+        const table = document.querySelector(tableSelector);
+        if (!table) return { headers: [], rows: [] };
+ 
+        const allRows = table.querySelectorAll('tr');
+ 
+        // Extract headers
+        let headers = [];
+        if (headerRow > 0 && allRows[headerRow - 1]) {
+          const headerCells = allRows[headerRow - 1].querySelectorAll('th, td');
+          headers = Array.from(headerCells).map(cell => cell.textContent?.trim() || '');
+        }
+ 
+        // Extract data rows
+        const startRow = headerRow > 0 ? headerRow : 0;
+        const rows = [];
+ 
+        for (let i = startRow; i < allRows.length; i++) {
+          const cells = allRows[i].querySelectorAll('td, th');
+          const rowData = Array.from(cells).map(cell => cell.textContent?.trim() || '');
+          if (rowData.some(d => d)) { // Skip empty rows
+            rows.push(rowData);
+          }
+        }
+ 
+        return { headers, rows };
+      }
+    `;
+ 
+    const result = await browser.eval(extractScript, [{ tableSelector, headerRow }]) as {
+      headers: string[];
+      rows: string[][];
+    };
+ 
+    onLog('info', `提取了 ${result.rows.length} 行数据,${result.headers.length} 列`);
+ 
+    onProgress('完成', 100);
+    return {
+      url: await browser.url(),
+      headers: result.headers,
+      rowCount: result.rows.length,
+      data: result.rows,
+    };
+  },
+};
+ 
+// ============================================================================
+// Export All Scraping Templates
+// ============================================================================
+ 
+export const scrapingTemplates: TaskTemplate[] = [
+  scrapeTextTemplate,
+  scrapeListTemplate,
+  scrapeImagesTemplate,
+  scrapeLinksTemplate,
+  scrapeTableTemplate,
+];
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/BrowserHand/templates/types.ts.html b/desktop/coverage/src/components/BrowserHand/templates/types.ts.html new file mode 100644 index 0000000..d43869a --- /dev/null +++ b/desktop/coverage/src/components/BrowserHand/templates/types.ts.html @@ -0,0 +1,805 @@ + + + + + + Code coverage report for src/components/BrowserHand/templates/types.ts + + + + + + + + + +
+
+

All files / src/components/BrowserHand/templates types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Task Template Types for Browser Hand
+ *
+ * Defines the structure for browser automation task templates
+ * that can be executed via the UI or by Agent scripts.
+ */
+ 
+import type { Browser } from '../../../lib/browser-client';
+ 
+// ============================================================================
+// Template Parameter Types
+// ============================================================================
+ 
+export type TemplateParamType =
+  | 'text'
+  | 'url'
+  | 'number'
+  | 'select'
+  | 'textarea'
+  | 'json'
+  | 'boolean';
+ 
+export interface TaskTemplateParam {
+  /** Parameter key used in execution */
+  key: string;
+  /** Display label for the UI */
+  label: string;
+  /** Type of input */
+  type: TemplateParamType;
+  /** Whether this parameter is required */
+  required: boolean;
+  /** Default value if not provided */
+  default?: unknown;
+  /** Placeholder text for input */
+  placeholder?: string;
+  /** Options for select type */
+  options?: { value: string; label: string }[];
+  /** Help text / description */
+  description?: string;
+  /** Validation pattern (regex string) */
+  pattern?: string;
+  /** Minimum value for number type */
+  min?: number;
+  /** Maximum value for number type */
+  max?: number;
+}
+ 
+// ============================================================================
+// Template Types
+// ============================================================================
+ 
+export type TemplateCategory = 'basic' | 'scraping' | 'automation';
+ 
+export interface TaskTemplate {
+  /** Unique template identifier */
+  id: string;
+  /** Display name */
+  name: string;
+  /** Short description */
+  description: string;
+  /** Category for grouping */
+  category: TemplateCategory;
+  /** Icon name (Lucide icon) */
+  icon: string;
+  /** Parameter definitions */
+  params: TaskTemplateParam[];
+  /** Execution function */
+  execute: (params: Record<string, unknown>, context: ExecutionContext) => Promise<unknown>;
+}
+ 
+// ============================================================================
+// Execution Context
+// ============================================================================
+ 
+export type LogLevel = 'info' | 'warn' | 'error' | 'action';
+ 
+export interface BrowserLog {
+  id: string;
+  timestamp: string;
+  level: LogLevel;
+  message: string;
+  details?: Record<string, unknown>;
+}
+ 
+export interface ExecutionContext {
+  /** Browser client instance */
+  browser: Browser;
+  /** Progress callback */
+  onProgress: (action: string, progress: number) => void;
+  /** Log callback */
+  onLog: (level: LogLevel, message: string, details?: Record<string, unknown>) => void;
+}
+ 
+// ============================================================================
+// Execution State Types
+// ============================================================================
+ 
+export type ExecutionStatus = 'idle' | 'running' | 'success' | 'error' | 'cancelled';
+ 
+export interface ExecutionState {
+  /** Whether a task is currently running */
+  isRunning: boolean;
+  /** Current action description */
+  currentAction: string | null;
+  /** Current URL being processed */
+  currentUrl: string | null;
+  /** Last screenshot (base64) */
+  lastScreenshot: string | null;
+  /** Progress percentage (0-100) */
+  progress: number;
+  /** When execution started */
+  startTime: string | null;
+  /** Current status */
+  status: ExecutionStatus;
+  /** Error message if failed */
+  error: string | null;
+}
+ 
+// ============================================================================
+// Session Types
+// ============================================================================
+ 
+export type SessionStatus = 'connecting' | 'connected' | 'active' | 'idle' | 'error';
+ 
+export interface BrowserSession {
+  id: string;
+  name: string;
+  currentUrl: string | null;
+  title: string | null;
+  status: SessionStatus;
+  createdAt: string;
+  lastActivity: string;
+}
+ 
+// ============================================================================
+// Recent Task Types
+// ============================================================================
+ 
+export type TaskResultStatus = 'success' | 'failed' | 'cancelled';
+ 
+export interface RecentTask {
+  id: string;
+  templateId: string;
+  templateName: string;
+  params: Record<string, unknown>;
+  status: TaskResultStatus;
+  executedAt: string;
+  duration: number;
+  result?: unknown;
+  error?: string;
+}
+ 
+// ============================================================================
+// Store State Types
+// ============================================================================
+ 
+export interface BrowserHandState {
+  // Session management
+  sessions: BrowserSession[];
+  activeSessionId: string | null;
+ 
+  // Execution state
+  execution: ExecutionState;
+ 
+  // Logs
+  logs: BrowserLog[];
+ 
+  // Templates
+  templates: TaskTemplate[];
+  recentTasks: RecentTask[];
+ 
+  // UI state
+  isTemplateModalOpen: boolean;
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+// ============================================================================
+// Store Actions Types
+// ============================================================================
+ 
+export interface SessionOptions {
+  webdriverUrl?: string;
+  headless?: boolean;
+  browserType?: 'chrome' | 'firefox' | 'edge' | 'safari';
+  windowWidth?: number;
+  windowHeight?: number;
+}
+ 
+export interface BrowserHandActions {
+  // Session management
+  createSession: (options?: SessionOptions) => Promise<string>;
+  closeSession: (sessionId: string) => Promise<void>;
+  listSessions: () => Promise<void>;
+ 
+  // Template execution
+  executeTemplate: (templateId: string, params: Record<string, unknown>) => Promise<unknown>;
+  executeScript: (script: string, args?: unknown[]) => Promise<unknown>;
+ 
+  // State updates
+  updateExecutionState: (state: Partial<ExecutionState>) => void;
+  addLog: (log: Omit<BrowserLog, 'id' | 'timestamp'>) => void;
+  clearLogs: () => void;
+ 
+  // Screenshot
+  takeScreenshot: () => Promise<string>;
+ 
+  // UI control
+  openTemplateModal: () => void;
+  closeTemplateModal: () => void;
+  clearError: () => void;
+  setLoading: (loading: boolean) => void;
+}
+ 
+// ============================================================================
+// Validation Types
+// ============================================================================
+ 
+export interface ValidationError {
+  param: string;
+  message: string;
+}
+ 
+export interface ValidationResult {
+  valid: boolean;
+  errors: ValidationError[];
+}
+ 
+// ============================================================================
+// Template Registry Types
+// ============================================================================
+ 
+export interface TemplateRegistry {
+  templates: Map<string, TaskTemplate>;
+  byCategory: Map<TemplateCategory, TaskTemplate[]>;
+  register: (template: TaskTemplate) => void;
+  get: (id: string) => TaskTemplate | undefined;
+  getByCategory: (category: TemplateCategory) => TaskTemplate[];
+  getAll: () => TaskTemplate[];
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ChannelList.tsx.html b/desktop/coverage/src/components/ChannelList.tsx.html new file mode 100644 index 0000000..7aa862c --- /dev/null +++ b/desktop/coverage/src/components/ChannelList.tsx.html @@ -0,0 +1,481 @@ + + + + + + Code coverage report for src/components/ChannelList.tsx + + + + + + + + + +
+
+

All files / src/components ChannelList.tsx

+
+ +
+ 0% + Statements + 0/95 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/95 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect } from 'react';
+import { useConnectionStore } from '../store/connectionStore';
+import { useAgentStore } from '../store/agentStore';
+import { useConfigStore } from '../store/configStore';
+import { Radio, RefreshCw, MessageCircle, Settings } from 'lucide-react';
+ 
+const CHANNEL_ICONS: Record<string, string> = {
+  feishu: '飞',
+  qqbot: 'QQ',
+  wechat: '微',
+};
+ 
+// 可用频道类型(用于显示未配置的频道)
+const AVAILABLE_CHANNEL_TYPES = [
+  { type: 'feishu', name: '飞书 (Feishu)' },
+  { type: 'wechat', name: '微信' },
+  { type: 'qqbot', name: 'QQ 机器人' },
+];
+ 
+interface ChannelListProps {
+  onOpenSettings?: () => void;
+}
+ 
+export function ChannelList({ onOpenSettings }: ChannelListProps) {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const loadPluginStatus = useAgentStore((s) => s.loadPluginStatus);
+  const channels = useConfigStore((s) => s.channels);
+  const loadChannels = useConfigStore((s) => s.loadChannels);
+ 
+  const connected = connectionState === 'connected';
+ 
+  useEffect(() => {
+    if (connected) {
+      loadPluginStatus().then(() => loadChannels());
+    }
+  }, [connected]);
+ 
+  const handleRefresh = () => {
+    loadPluginStatus().then(() => loadChannels());
+  };
+ 
+  // 去重:基于 channel id
+  const uniqueChannels = channels.filter((ch, index, self) =>
+    index === self.findIndex(c => c.id === ch.id)
+  );
+ 
+  // 获取已配置的频道类型
+  const configuredTypes = new Set(uniqueChannels.map(c => c.type));
+ 
+  // 未配置的频道类型
+  const unconfiguredTypes = AVAILABLE_CHANNEL_TYPES.filter(ct => !configuredTypes.has(ct.type));
+ 
+  if (!connected) {
+    return (
+      <div className="flex flex-col items-center justify-center h-full text-gray-400 text-xs px-4 text-center">
+        <Radio className="w-8 h-8 mb-2 opacity-30" />
+        <p>IM 频道</p>
+        <p className="mt-1">连接 Gateway 后可用</p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* Header */}
+      <div className="flex items-center justify-between px-3 py-2 border-b border-gray-200">
+        <span className="text-xs font-medium text-gray-500">频道列表</span>
+        <button
+          onClick={handleRefresh}
+          className="p-1 text-gray-400 hover:text-orange-500 rounded"
+          title="刷新"
+        >
+          <RefreshCw className="w-3.5 h-3.5" />
+        </button>
+      </div>
+ 
+      <div className="flex-1 overflow-y-auto custom-scrollbar">
+        {/* Configured channels */}
+        {uniqueChannels.map((ch) => (
+          <div
+            key={ch.id}
+            className="flex items-center gap-3 px-3 py-3 hover:bg-gray-100 border-b border-gray-50"
+          >
+            <div className={`w-8 h-8 rounded-lg flex items-center justify-center text-white text-xs font-bold flex-shrink-0 ${
+              ch.status === 'active'
+                ? 'bg-gradient-to-br from-blue-500 to-indigo-500'
+                : 'bg-gray-300'
+            }`}>
+              {CHANNEL_ICONS[ch.type] || <MessageCircle className="w-4 h-4" />}
+            </div>
+            <div className="flex-1 min-w-0">
+              <div className="text-xs font-medium text-gray-900 truncate">{ch.label}</div>
+              <div className={`text-[11px] ${
+                ch.status === 'active' ? 'text-green-500' : ch.status === 'error' ? 'text-red-500' : 'text-gray-400'
+              }`}>
+                {ch.status === 'active' ? '已连接' : ch.status === 'error' ? ch.error || '错误' : '未配置'}
+                {ch.accounts !== undefined && ch.accounts > 0 && ` · ${ch.accounts} 个账号`}
+              </div>
+            </div>
+          </div>
+        ))}
+ 
+        {/* Unconfigured channels - 只显示一次 */}
+        {unconfiguredTypes.map((ct) => (
+          <div key={ct.type} className="flex items-center gap-3 px-3 py-3 hover:bg-gray-100 border-b border-gray-50 opacity-60">
+            <div className="w-8 h-8 rounded-lg flex items-center justify-center text-white text-xs font-bold flex-shrink-0 bg-gray-300">
+              {CHANNEL_ICONS[ct.type] || <MessageCircle className="w-4 h-4" />}
+            </div>
+            <div className="flex-1 min-w-0">
+              <div className="text-xs font-medium text-gray-600">{ct.name}</div>
+              <div className="text-[11px] text-gray-400">未配置</div>
+            </div>
+          </div>
+        ))}
+ 
+        {/* Help text */}
+        <div className="px-3 py-4 text-center">
+          <p className="text-[11px] text-gray-400 mb-2">在设置中配置 IM 频道</p>
+          {onOpenSettings && (
+            <button
+              onClick={onOpenSettings}
+              className="inline-flex items-center gap-1 text-xs text-orange-500 hover:text-orange-600"
+            >
+              <Settings className="w-3 h-3" />
+              打开设置
+            </button>
+          )}
+        </div>
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ChatArea.tsx.html b/desktop/coverage/src/components/ChatArea.tsx.html new file mode 100644 index 0000000..3e6aad6 --- /dev/null +++ b/desktop/coverage/src/components/ChatArea.tsx.html @@ -0,0 +1,2206 @@ + + + + + + Code coverage report for src/components/ChatArea.tsx + + + + + + + + + +
+
+

All files / src/components ChatArea.tsx

+
+ +
+ 0% + Statements + 0/512 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/512 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect, useRef, useCallback, useMemo, type MutableRefObject, type RefObject, type CSSProperties } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { List, type ListImperativeAPI } from 'react-window';
+import { useChatStore, Message } from '../store/chatStore';
+import { useConnectionStore } from '../store/connectionStore';
+import { useAgentStore } from '../store/agentStore';
+import { useConfigStore } from '../store/configStore';
+import { Paperclip, ChevronDown, Terminal, SquarePen, ArrowUp, MessageSquare, Download, Copy, Check } from 'lucide-react';
+import { Button, EmptyState, MessageListSkeleton, LoadingDots } from './ui';
+import { listItemVariants, defaultTransition, fadeInVariants } from '../lib/animations';
+import { FirstConversationPrompt } from './FirstConversationPrompt';
+import { MessageSearch } from './MessageSearch';
+import { OfflineIndicator } from './OfflineIndicator';
+import {
+  useVirtualizedMessages,
+  type VirtualizedMessageItem
+} from '../lib/message-virtualization';
+ 
+// Default heights for virtualized messages
+const DEFAULT_MESSAGE_HEIGHTS: Record<string, number> = {
+  user: 80,
+  assistant: 150,
+  tool: 120,
+  hand: 120,
+  workflow: 100,
+  system: 60,
+};
+ 
+// Threshold for enabling virtualization (messages count)
+const VIRTUALIZATION_THRESHOLD = 100;
+ 
+export function ChatArea() {
+  const {
+    messages, currentAgent, isStreaming, isLoading, currentModel,
+    sendMessage: sendToGateway, setCurrentModel, initStreamListener,
+    newConversation,
+  } = useChatStore();
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const clones = useAgentStore((s) => s.clones);
+  const models = useConfigStore((s) => s.models);
+ 
+  const [input, setInput] = useState('');
+  const [showModelPicker, setShowModelPicker] = useState(false);
+  const scrollRef = useRef<HTMLDivElement>(null);
+  const textareaRef = useRef<HTMLTextAreaElement>(null);
+  const messageRefs = useRef<Map<string, HTMLDivElement>>(new Map());
+ 
+  // Convert messages to virtualization format
+  const virtualizedMessages: VirtualizedMessageItem[] = useMemo(
+    () => messages.map((msg) => ({
+      id: msg.id,
+      height: DEFAULT_MESSAGE_HEIGHTS[msg.role] ?? 100,
+      role: msg.role,
+    })),
+    [messages]
+  );
+ 
+  // Use virtualization hook
+  const {
+    listRef,
+    getHeight,
+    setHeight,
+    scrollToBottom,
+  } = useVirtualizedMessages(virtualizedMessages, DEFAULT_MESSAGE_HEIGHTS);
+ 
+  // Whether to use virtualization
+  const useVirtualization = messages.length >= VIRTUALIZATION_THRESHOLD;
+ 
+  // Get current clone for first conversation prompt
+  const currentClone = useMemo(() => {
+    if (!currentAgent) return null;
+    return clones.find((c) => c.id === currentAgent.id) || null;
+  }, [currentAgent, clones]);
+ 
+  // Check if should show first conversation prompt
+  const showFirstPrompt = messages.length === 0 && currentClone && !currentClone.onboardingCompleted;
+ 
+  // Handle suggestion click from first conversation prompt
+  const handleSelectSuggestion = (text: string) => {
+    setInput(text);
+    textareaRef.current?.focus();
+  };
+ 
+  // Auto-resize textarea
+  const adjustTextarea = useCallback(() => {
+    const el = textareaRef.current;
+    if (el) {
+      el.style.height = 'auto';
+      el.style.height = Math.min(el.scrollHeight, 160) + 'px';
+    }
+  }, []);
+ 
+  // Init agent stream listener on mount
+  useEffect(() => {
+    const unsub = initStreamListener();
+    return unsub;
+  }, []);
+ 
+  // Auto-scroll to bottom on new messages
+  useEffect(() => {
+    if (scrollRef.current && !useVirtualization) {
+      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
+    } else if (useVirtualization && messages.length > 0) {
+      scrollToBottom();
+    }
+  }, [messages, useVirtualization, scrollToBottom]);
+ 
+  const handleSend = () => {
+    if (!input.trim() || isStreaming) return;
+    // Allow sending in offline mode - message will be queued
+    sendToGateway(input);
+    setInput('');
+  };
+ 
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter' && !e.shiftKey) {
+      e.preventDefault();
+      handleSend();
+    }
+  };
+ 
+  const connected = connectionState === 'connected';
+ 
+  // Navigate to a specific message by ID
+  const handleNavigateToMessage = useCallback((messageId: string) => {
+    const messageEl = messageRefs.current.get(messageId);
+    if (messageEl && scrollRef.current) {
+      messageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });
+      // Add highlight effect
+      messageEl.classList.add('ring-2', 'ring-orange-400', 'ring-offset-2');
+      setTimeout(() => {
+        messageEl.classList.remove('ring-2', 'ring-orange-400', 'ring-offset-2');
+      }, 2000);
+    }
+  }, []);
+ 
+  return (
+    <div className="flex flex-col h-full">
+      {/* Header */}
+      {/* Header */}
+      <div className="h-14 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between px-6 flex-shrink-0 bg-white dark:bg-gray-900">
+        <div className="flex items-center gap-2">
+          <h2 className="font-semibold text-gray-900 dark:text-gray-100">{currentAgent?.name || 'ZCLAW'}</h2>
+          {isStreaming ? (
+            <span className="text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+              <span className="w-1.5 h-1.5 bg-gray-500 dark:bg-gray-400 rounded-full thinking-dot"></span>
+              正在输入中
+            </span>
+          ) : (
+            <span className={`text-xs flex items-center gap-1 ${connected ? 'text-green-500' : 'text-gray-500 dark:text-gray-400'}`}>
+              <span className={`w-1.5 h-1.5 rounded-full ${connected ? 'bg-green-400' : 'bg-gray-300 dark:bg-gray-600'}`}></span>
+              {connected ? 'Gateway 已连接' : 'Gateway 未连接'}
+            </span>
+          )}
+        </div>
+        <div className="flex items-center gap-2">
+          {/* Offline indicator in header */}
+          <OfflineIndicator compact />
+          {messages.length > 0 && (
+            <MessageSearch onNavigateToMessage={handleNavigateToMessage} />
+          )}
+          {messages.length > 0 && (
+            <Button
+              variant="ghost"
+              size="sm"
+              onClick={newConversation}
+              title="新对话"
+              aria-label="开始新对话"
+              className="flex items-center gap-1.5 text-gray-500 dark:text-gray-400 hover:text-orange-600 dark:hover:text-orange-400 hover:bg-orange-50 dark:hover:bg-orange-900/20"
+            >
+              <SquarePen className="w-3.5 h-3.5" />
+              新对话
+            </Button>
+          )}
+        </div>
+      </div>
+ 
+      {/* Messages */}
+      <div ref={scrollRef} className="flex-1 overflow-y-auto custom-scrollbar bg-white dark:bg-gray-900">
+        <AnimatePresence mode="popLayout">
+          {/* Loading skeleton */}
+          {isLoading && messages.length === 0 && (
+            <motion.div
+              key="loading-skeleton"
+              variants={fadeInVariants}
+              initial="initial"
+              animate="animate"
+              exit="exit"
+            >
+              <MessageListSkeleton count={3} />
+            </motion.div>
+          )}
+ 
+          {/* Empty state */}
+          {!isLoading && messages.length === 0 && (
+            <motion.div
+              key="empty-state"
+              variants={fadeInVariants}
+              initial="initial"
+              animate="animate"
+              exit="exit"
+            >
+              {showFirstPrompt && currentClone ? (
+                <FirstConversationPrompt
+                  clone={currentClone}
+                  onSelectSuggestion={handleSelectSuggestion}
+                />
+              ) : (
+                <EmptyState
+                  icon={<MessageSquare className="w-8 h-8" />}
+                  title="Welcome to ZCLAW"
+                  description={connected ? 'Send a message to start the conversation.' : 'Please connect to Gateway first in Settings.'}
+                />
+              )}
+            </motion.div>
+          )}
+ 
+          {/* Virtualized list for large message counts, smooth scroll for small counts */}
+          {useVirtualization && messages.length > 0 ? (
+            <VirtualizedMessageList
+              messages={messages}
+              listRef={listRef}
+              getHeight={getHeight}
+              onHeightChange={setHeight}
+              messageRefs={messageRefs}
+            />
+          ) : (
+            messages.map((message) => (
+              <motion.div
+                key={message.id}
+                ref={(el) => { if (el) messageRefs.current.set(message.id, el); }}
+                variants={listItemVariants}
+                initial="hidden"
+                animate="visible"
+                layout
+                transition={defaultTransition}
+              >
+                <MessageBubble message={message} />
+              </motion.div>
+            ))
+          )}
+        </AnimatePresence>
+      </div>
+ 
+      {/* Input */}
+      <div className="border-t border-gray-100 dark:border-gray-800 p-4 bg-white dark:bg-gray-900">
+        <div className="max-w-4xl mx-auto">
+          <div className="relative flex items-end gap-2 bg-gray-50 dark:bg-gray-800 rounded-2xl border border-gray-200 dark:border-gray-700 p-2 focus-within:border-orange-300 dark:focus-within:border-orange-600 focus-within:ring-2 focus-within:ring-orange-100 dark:focus-within:ring-orange-900/30 transition-all">
+            <Button
+              variant="ghost"
+              size="sm"
+              className="p-2 text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+              aria-label="添加附件"
+            >
+              <Paperclip className="w-5 h-5" />
+            </Button>
+            <div className="flex-1 py-1">
+              <textarea
+                ref={textareaRef}
+                value={input}
+                onChange={(e) => { setInput(e.target.value); adjustTextarea(); }}
+                onKeyDown={handleKeyDown}
+                placeholder={
+                  isStreaming
+                    ? 'Agent 正在回复...'
+                    : `发送给 ${currentAgent?.name || 'ZCLAW'}${!connected ? ' (离线模式)' : ''}`
+                }
+                disabled={isStreaming}
+                rows={1}
+                className="w-full bg-transparent border-none focus:outline-none text-gray-700 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 disabled:opacity-50 resize-none leading-relaxed mt-1"
+                style={{ minHeight: '24px', maxHeight: '160px' }}
+              />
+            </div>
+            <div className="flex items-center gap-2 pr-2 pb-1 relative">
+              <Button
+                variant="ghost"
+                size="sm"
+                onClick={() => setShowModelPicker(!showModelPicker)}
+                className="flex items-center gap-1 text-xs text-gray-500 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700"
+                aria-label="选择模型"
+                aria-expanded={showModelPicker}
+              >
+                <span>{currentModel}</span>
+                <ChevronDown className="w-3 h-3" />
+              </Button>
+              {showModelPicker && (
+                <div className="absolute bottom-full right-8 mb-2 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 min-w-[160px] max-h-48 overflow-y-auto z-10">
+                  {models.length > 0 ? (
+                    models.map((model) => (
+                      <button
+                        key={model.id}
+                        onClick={() => { setCurrentModel(model.id); setShowModelPicker(false); }}
+                        className={`w-full text-left px-3 py-2 text-xs hover:bg-gray-50 dark:hover:bg-gray-700 ${model.id === currentModel ? 'text-orange-600 dark:text-orange-400 font-medium' : 'text-gray-700 dark:text-gray-300'}`}
+                      >
+                        {model.name}
+                      </button>
+                    ))
+                  ) : (
+                    <div className="px-3 py-2 text-xs text-gray-400">
+                      {connected ? '加载中...' : '未连接 Gateway'}
+                    </div>
+                  )}
+                </div>
+              )}
+              <Button
+                variant="primary"
+                size="sm"
+                onClick={handleSend}
+                disabled={isStreaming || !input.trim()}
+                className="w-8 h-8 rounded-full p-0 flex items-center justify-center bg-orange-500 hover:bg-orange-600 text-white disabled:opacity-50"
+                aria-label="发送消息"
+              >
+                <ArrowUp className="w-4 h-4 text-white" />
+              </Button>
+            </div>
+          </div>
+          <div className="text-center mt-2 text-xs text-gray-500 dark:text-gray-400">
+            Agent 在本地运行,内容由 AI 生成
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+/** Code block with copy and download functionality */
+function CodeBlock({ code, language, index }: { code: string; language: string; index: number }) {
+  const [copied, setCopied] = useState(false);
+  const [downloading, setDownloading] = useState(false);
+ 
+  // Infer filename from language or content
+  const inferFilename = (): string => {
+    const extMap: Record<string, string> = {
+      javascript: 'js', typescript: 'ts', python: 'py', rust: 'rs',
+      go: 'go', java: 'java', cpp: 'cpp', c: 'c', csharp: 'cs',
+      html: 'html', css: 'css', scss: 'scss', json: 'json',
+      yaml: 'yaml', yml: 'yaml', xml: 'xml', sql: 'sql',
+      shell: 'sh', bash: 'sh', powershell: 'ps1',
+      markdown: 'md', md: 'md', dockerfile: 'dockerfile',
+    };
+ 
+    // Check if language contains a filename (e.g., ```app.tsx)
+    if (language.includes('.') || language.includes('/')) {
+      return language;
+    }
+ 
+    // Check for common patterns in code
+    const codeLower = code.toLowerCase();
+    if (codeLower.includes('<!doctype html') || codeLower.includes('<html')) {
+      return 'index.html';
+    }
+    if (codeLower.includes('package.json') || (codeLower.includes('"name"') && codeLower.includes('"version"'))) {
+      return 'package.json';
+    }
+    if (codeLower.startsWith('{') && (codeLower.includes('"import"') || codeLower.includes('"export"'))) {
+      return 'config.json';
+    }
+ 
+    // Use language extension
+    const ext = extMap[language.toLowerCase()] || language.toLowerCase();
+    return `code-${index + 1}.${ext || 'txt'}`;
+  };
+ 
+  const handleCopy = async () => {
+    try {
+      await navigator.clipboard.writeText(code);
+      setCopied(true);
+      setTimeout(() => setCopied(false), 2000);
+    } catch (err) {
+      console.error('Failed to copy:', err);
+    }
+  };
+ 
+  const handleDownload = () => {
+    setDownloading(true);
+    try {
+      const filename = inferFilename();
+      const blob = new Blob([code], { type: 'text/plain;charset=utf-8' });
+      const url = URL.createObjectURL(blob);
+      const a = document.createElement('a');
+      a.href = url;
+      a.download = filename;
+      document.body.appendChild(a);
+      a.click();
+      document.body.removeChild(a);
+      URL.revokeObjectURL(url);
+    } catch (err) {
+      console.error('Failed to download:', err);
+    }
+    setTimeout(() => setDownloading(false), 500);
+  };
+ 
+  return (
+    <div className="relative group my-2">
+      <pre className="bg-gray-900 text-gray-100 rounded-lg p-3 overflow-x-auto text-xs font-mono leading-relaxed">
+        {language && (
+          <div className="text-gray-500 text-[10px] mb-1 uppercase flex items-center justify-between">
+            <span>{language}</span>
+          </div>
+        )}
+        <code>{code}</code>
+      </pre>
+      {/* Action buttons - show on hover */}
+      <div className="absolute top-2 right-2 flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity">
+        <button
+          onClick={handleCopy}
+          className="p-1.5 bg-gray-700 hover:bg-gray-600 rounded text-gray-300 hover:text-white transition-colors"
+          title="复制代码"
+        >
+          {copied ? <Check className="w-3.5 h-3.5 text-green-400" /> : <Copy className="w-3.5 h-3.5" />}
+        </button>
+        <button
+          onClick={handleDownload}
+          className="p-1.5 bg-gray-700 hover:bg-gray-600 rounded text-gray-300 hover:text-white transition-colors"
+          title="下载文件"
+          disabled={downloading}
+        >
+          <Download className={`w-3.5 h-3.5 ${downloading ? 'animate-pulse' : ''}`} />
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+/** Lightweight markdown renderer — handles code blocks, inline code, bold, italic, links */
+ 
+function sanitizeUrl(url: string): string {
+  const safeProtocols = ['http:', 'https:', 'mailto:'];
+  try {
+    const parsed = new URL(url, window.location.origin);
+    if (safeProtocols.includes(parsed.protocol)) {
+      return parsed.href;
+    }
+  } catch {
+    // Invalid URL
+  }
+  return '#';
+}
+ 
+function renderMarkdown(text: string): React.ReactNode[] {
+  const nodes: React.ReactNode[] = [];
+  const lines = text.split('\n');
+  let i = 0;
+ 
+  while (i < lines.length) {
+    const line = lines[i];
+ 
+    // Fenced code block
+    if (line.startsWith('```')) {
+      const lang = line.slice(3).trim();
+      const codeLines: string[] = [];
+      i++;
+      while (i < lines.length && !lines[i].startsWith('```')) {
+        codeLines.push(lines[i]);
+        i++;
+      }
+      i++; // skip closing ```
+      nodes.push(
+        <CodeBlock key={nodes.length} code={codeLines.join('\n')} language={lang} index={nodes.length} />
+      );
+      continue;
+    }
+ 
+    // Normal line — parse inline markdown
+    nodes.push(
+      <span key={nodes.length}>
+        {i > 0 && lines[i - 1] !== undefined && !nodes[nodes.length - 1]?.toString().includes('pre') && '\n'}
+        {renderInline(line)}
+      </span>
+    );
+    i++;
+  }
+ 
+  return nodes;
+}
+ 
+function renderInline(text: string): React.ReactNode[] {
+  const parts: React.ReactNode[] = [];
+  // Pattern: **bold**, *italic*, `code`, [text](url)
+  const regex = /(\*\*(.+?)\*\*)|(\*(.+?)\*)|(`(.+?)`)|(\[(.+?)\]\((.+?)\))/g;
+  let lastIndex = 0;
+  let match: RegExpExecArray | null;
+ 
+  while ((match = regex.exec(text)) !== null) {
+    // Text before match
+    if (match.index > lastIndex) {
+      parts.push(text.slice(lastIndex, match.index));
+    }
+ 
+    if (match[1]) {
+      // **bold**
+      parts.push(<strong key={parts.length} className="font-semibold">{match[2]}</strong>);
+    } else if (match[3]) {
+      // *italic*
+      parts.push(<em key={parts.length}>{match[4]}</em>);
+    } else if (match[5]) {
+      // `code`
+      parts.push(
+        <code key={parts.length} className="bg-gray-100 dark:bg-gray-700 text-orange-700 dark:text-orange-400 px-1 py-0.5 rounded text-[0.85em] font-mono">
+          {match[6]}
+        </code>
+      );
+    } else if (match[7]) {
+      // [text](url) - 使用 sanitizeUrl 防止 XSS
+      parts.push(
+        <a key={parts.length} href={sanitizeUrl(match[9])} target="_blank" rel="noopener noreferrer"
+          className="text-orange-600 dark:text-orange-400 underline hover:text-orange-700 dark:hover:text-orange-300">{match[8]}</a>
+      );
+    }
+ 
+    lastIndex = match.index + match[0].length;
+  }
+ 
+  if (lastIndex < text.length) {
+    parts.push(text.slice(lastIndex));
+  }
+ 
+  return parts.length > 0 ? parts : [text];
+}
+ 
+function MessageBubble({ message }: { message: Message }) {
+  if (message.role === 'tool') {
+    return (
+      <div className="ml-12 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-3 text-xs font-mono">
+        <div className="flex items-center gap-2 text-gray-500 dark:text-gray-400 mb-1">
+          <Terminal className="w-3.5 h-3.5" />
+          <span className="font-semibold">{message.toolName || 'tool'}</span>
+        </div>
+        {message.toolInput && (
+          <pre className="text-gray-600 dark:text-gray-300 bg-white dark:bg-gray-900 rounded p-2 mb-1 overflow-x-auto">{message.toolInput}</pre>
+        )}
+        {message.content && (
+          <pre className="text-green-700 dark:text-green-400 bg-white dark:bg-gray-900 rounded p-2 overflow-x-auto">{message.content}</pre>
+        )}
+      </div>
+    );
+  }
+ 
+  const isUser = message.role === 'user';
+ 
+  // 思考中状态:streaming 且内容为空时显示思考指示器
+  const isThinking = message.streaming && !message.content;
+ 
+  // Download message as Markdown file
+  const handleDownloadMessage = () => {
+    if (!message.content) return;
+    const timestamp = new Date().toISOString().slice(0, 10);
+    const filename = `message-${timestamp}.md`;
+    const blob = new Blob([message.content], { type: 'text/markdown;charset=utf-8' });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = url;
+    a.download = filename;
+    document.body.appendChild(a);
+    a.click();
+    document.body.removeChild(a);
+    URL.revokeObjectURL(url);
+  };
+ 
+  return (
+    <div className={`flex gap-4 ${isUser ? 'justify-end' : ''}`}>
+      <div
+        className={`w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0 ${isUser ? 'bg-gray-200 dark:bg-gray-600 text-gray-600 dark:text-gray-200 order-last' : 'agent-avatar text-white'}`}
+      >
+        {isUser ? '用' : 'Z'}
+      </div>
+      <div className={isUser ? 'max-w-2xl' : 'flex-1 max-w-3xl'}>
+        {isThinking ? (
+          // Thinking indicator
+          <div className="flex items-center gap-2 px-4 py-3 text-gray-500 dark:text-gray-400">
+            <LoadingDots />
+            <span className="text-sm">Thinking...</span>
+          </div>
+        ) : (
+          <div className={`p-4 shadow-sm ${isUser ? 'chat-bubble-user shadow-md' : 'chat-bubble-assistant'} relative group`}>
+            <div className={`leading-relaxed whitespace-pre-wrap ${isUser ? 'text-white' : 'text-gray-700 dark:text-gray-200'}`}>
+              {message.content
+                ? (isUser ? message.content : renderMarkdown(message.content))
+                : '...'}
+              {message.streaming && <span className="inline-block w-1.5 h-4 bg-orange-500 animate-pulse ml-0.5 align-text-bottom rounded-sm" />}
+            </div>
+            {message.error && (
+              <p className="text-xs text-red-500 mt-2">{message.error}</p>
+            )}
+            {/* Download button for AI messages - show on hover */}
+            {!isUser && message.content && !message.streaming && (
+              <button
+                onClick={handleDownloadMessage}
+                className="absolute top-2 right-2 p-1.5 bg-gray-200/80 dark:bg-gray-700/80 hover:bg-gray-300 dark:hover:bg-gray-600 rounded text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-colors opacity-0 group-hover:opacity-100"
+                title="下载为 Markdown"
+              >
+                <Download className="w-3.5 h-3.5" />
+              </button>
+            )}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+// === Virtualized Message Components ===
+ 
+interface VirtualizedMessageRowProps {
+  message: Message;
+  onHeightChange: (height: number) => void;
+  messageRefs: MutableRefObject<Map<string, HTMLDivElement>>;
+}
+ 
+/**
+ * Single row in the virtualized list.
+ * Measures actual height after render and reports back.
+ */
+function VirtualizedMessageRow({
+  message,
+  onHeightChange,
+  messageRefs,
+  style,
+  ariaAttributes,
+}: VirtualizedMessageRowProps & {
+  style: CSSProperties;
+  ariaAttributes: {
+    'aria-posinset': number;
+    'aria-setsize': number;
+    role: 'listitem';
+  };
+}) {
+  const rowRef = useRef<HTMLDivElement>(null);
+ 
+  // Measure height after mount
+  useEffect(() => {
+    if (rowRef.current) {
+      const height = rowRef.current.getBoundingClientRect().height;
+      if (height > 0) {
+        onHeightChange(height);
+      }
+    }
+  }, [message.content, message.streaming, onHeightChange]);
+ 
+  return (
+    <div
+      ref={(el) => {
+        if (el) {
+          (rowRef as MutableRefObject<HTMLDivElement | null>).current = el;
+          messageRefs.current.set(message.id, el);
+        }
+      }}
+      style={style}
+      className="py-3"
+      {...ariaAttributes}
+    >
+      <MessageBubble message={message} />
+    </div>
+  );
+}
+ 
+interface VirtualizedMessageListProps {
+  messages: Message[];
+  listRef: RefObject<ListImperativeAPI | null>;
+  getHeight: (id: string, role: string) => number;
+  onHeightChange: (id: string, height: number) => void;
+  messageRefs: MutableRefObject<Map<string, HTMLDivElement>>;
+}
+ 
+/**
+ * Virtualized message list for efficient rendering of large message counts.
+ * Uses react-window's List with dynamic height measurement.
+ */
+function VirtualizedMessageList({
+  messages,
+  listRef,
+  getHeight,
+  onHeightChange,
+  messageRefs,
+}: VirtualizedMessageListProps) {
+  // Row component for react-window v2
+  const RowComponent = (props: {
+    ariaAttributes: {
+      'aria-posinset': number;
+      'aria-setsize': number;
+      role: 'listitem';
+    };
+    index: number;
+    style: CSSProperties;
+  }) => (
+    <VirtualizedMessageRow
+      message={messages[props.index]}
+      onHeightChange={(h) => onHeightChange(messages[props.index].id, h)}
+      messageRefs={messageRefs}
+      style={props.style}
+      ariaAttributes={props.ariaAttributes}
+    />
+  );
+ 
+  return (
+    <List
+      listRef={listRef}
+      rowComponent={RowComponent}
+      rowProps={{}}
+      rowHeight={(index: number) => getHeight(messages[index].id, messages[index].role)}
+      rowCount={messages.length}
+      defaultHeight={500}
+      overscanCount={5}
+      className="focus:outline-none"
+    />
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ClassroomPreviewer.tsx.html b/desktop/coverage/src/components/ClassroomPreviewer.tsx.html new file mode 100644 index 0000000..95bf6c8 --- /dev/null +++ b/desktop/coverage/src/components/ClassroomPreviewer.tsx.html @@ -0,0 +1,1681 @@ + + + + + + Code coverage report for src/components/ClassroomPreviewer.tsx + + + + + + + + + +
+
+

All files / src/components ClassroomPreviewer.tsx

+
+ +
+ 0% + Statements + 0/356 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/356 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ClassroomPreviewer - 课堂预览器组件
+ *
+ * 预览 classroom-generator Pipeline 生成的课堂内容:
+ * - 幻灯片导航
+ * - 大纲视图
+ * - 场景切换
+ * - 全屏播放模式
+ * - AI 教师讲解展示
+ */
+ 
+import { useState, useCallback, useEffect } from 'react';
+import {
+  ChevronLeft,
+  ChevronRight,
+  Play,
+  Pause,
+  Maximize,
+  Minimize,
+  List,
+  Grid,
+  Volume2,
+  VolumeX,
+  Download,
+  Share2,
+} from 'lucide-react';
+import { useToast } from './ui/Toast';
+ 
+// === Types ===
+ 
+export interface ClassroomScene {
+  id: string;
+  title: string;
+  type: 'title' | 'content' | 'quiz' | 'summary' | 'interactive';
+  content: {
+    heading?: string;
+    bullets?: string[];
+    image?: string;
+    explanation?: string;
+    quiz?: {
+      question: string;
+      options: string[];
+      answer: number;
+    };
+  };
+  narration?: string;
+  duration?: number; // seconds
+}
+ 
+export interface ClassroomData {
+  id: string;
+  title: string;
+  subject: string;
+  difficulty: '初级' | '中级' | '高级';
+  duration: number; // minutes
+  scenes: ClassroomScene[];
+  outline: {
+    sections: {
+      title: string;
+      scenes: string[];
+    }[];
+  };
+  createdAt: string;
+}
+ 
+interface ClassroomPreviewerProps {
+  data: ClassroomData;
+  onClose?: () => void;
+  onExport?: (format: 'pptx' | 'html' | 'pdf') => void;
+}
+ 
+// === Sub-Components ===
+ 
+interface SceneRendererProps {
+  scene: ClassroomScene;
+  isPlaying: boolean;
+  showNarration: boolean;
+}
+ 
+function SceneRenderer({ scene, showNarration }: SceneRendererProps) {
+  const renderContent = () => {
+    switch (scene.type) {
+      case 'title':
+        return (
+          <div className="flex flex-col items-center justify-center h-full text-center p-8">
+            <h1 className="text-4xl font-bold text-white mb-4">
+              {scene.content.heading || scene.title}
+            </h1>
+            {scene.content.bullets && (
+              <p className="text-xl text-white/80">
+                {scene.content.bullets[0]}
+              </p>
+            )}
+          </div>
+        );
+ 
+      case 'content':
+        return (
+          <div className="p-8">
+            <h2 className="text-3xl font-bold text-white mb-6">
+              {scene.content.heading || scene.title}
+            </h2>
+            {scene.content.bullets && (
+              <ul className="space-y-4">
+                {scene.content.bullets.map((bullet, index) => (
+                  <li
+                    key={index}
+                    className="flex items-start gap-3 text-lg text-white/90"
+                  >
+                    <span className="flex-shrink-0 w-6 h-6 rounded-full bg-blue-500 flex items-center justify-center text-sm font-medium">
+                      {index + 1}
+                    </span>
+                    <span>{bullet}</span>
+                  </li>
+                ))}
+              </ul>
+            )}
+            {scene.content.image && (
+              <div className="mt-6">
+                <img
+                  src={scene.content.image}
+                  alt={scene.title}
+                  className="max-h-48 rounded-lg shadow-lg"
+                />
+              </div>
+            )}
+          </div>
+        );
+ 
+      case 'quiz':
+        return (
+          <div className="p-8">
+            <h2 className="text-2xl font-bold text-white mb-6">
+              📝 小测验
+            </h2>
+            {scene.content.quiz && (
+              <div className="space-y-4">
+                <p className="text-xl text-white">
+                  {scene.content.quiz.question}
+                </p>
+                <div className="grid grid-cols-1 md:grid-cols-2 gap-3 mt-4">
+                  {scene.content.quiz.options.map((option, index) => (
+                    <button
+                      key={index}
+                      className="p-4 bg-white/10 hover:bg-white/20 rounded-lg text-left text-white transition-colors"
+                    >
+                      <span className="font-medium mr-2">
+                        {String.fromCharCode(65 + index)}.
+                      </span>
+                      {option}
+                    </button>
+                  ))}
+                </div>
+              </div>
+            )}
+          </div>
+        );
+ 
+      case 'summary':
+        return (
+          <div className="p-8">
+            <h2 className="text-3xl font-bold text-white mb-6">
+              📋 总结
+            </h2>
+            {scene.content.bullets && (
+              <ul className="space-y-3">
+                {scene.content.bullets.map((bullet, index) => (
+                  <li
+                    key={index}
+                    className="flex items-center gap-2 text-lg text-white/90"
+                  >
+                    <span className="text-green-400">✓</span>
+                    {bullet}
+                  </li>
+                ))}
+              </ul>
+            )}
+          </div>
+        );
+ 
+      default:
+        return (
+          <div className="p-8">
+            <h2 className="text-2xl font-bold text-white">
+              {scene.title}
+            </h2>
+            <p className="text-white/80 mt-4">{scene.content.explanation}</p>
+          </div>
+        );
+    }
+  };
+ 
+  return (
+    <div className="relative h-full bg-gradient-to-br from-blue-600 via-purple-600 to-indigo-700">
+      {/* Scene Content */}
+      <div className="h-full overflow-auto">
+        {renderContent()}
+      </div>
+ 
+      {/* Narration Overlay */}
+      {showNarration && scene.narration && (
+        <div className="absolute bottom-0 left-0 right-0 bg-black/70 p-4">
+          <div className="flex items-start gap-3">
+            <div className="flex-shrink-0 w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center">
+              <Volume2 className="w-5 h-5 text-white" />
+            </div>
+            <p className="text-white/90 text-sm leading-relaxed">
+              {scene.narration}
+            </p>
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+interface OutlinePanelProps {
+  outline: ClassroomData['outline'];
+  scenes: ClassroomScene[];
+  currentIndex: number;
+  onSelectScene: (index: number) => void;
+}
+ 
+function OutlinePanel({
+  outline,
+  scenes,
+  currentIndex,
+  onSelectScene,
+}: OutlinePanelProps) {
+  return (
+    <div className="h-full overflow-auto bg-gray-50 dark:bg-gray-800 p-4">
+      <h3 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3">
+        课程大纲
+      </h3>
+      <div className="space-y-2">
+        {outline.sections.map((section, sectionIndex) => (
+          <div key={sectionIndex}>
+            <p className="text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">
+              {section.title}
+            </p>
+            <div className="space-y-1">
+              {section.scenes.map((sceneId) => {
+                const globalIndex = scenes.findIndex(s => s.id === sceneId);
+                const isActive = globalIndex === currentIndex;
+                const scene = scenes.find(s => s.id === sceneId);
+ 
+                return (
+                  <button
+                    key={sceneId}
+                    onClick={() => onSelectScene(globalIndex)}
+                    className={`w-full text-left px-3 py-2 rounded-md text-sm transition-colors ${
+                      isActive
+                        ? 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300'
+                        : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-600 dark:text-gray-300'
+                    }`}
+                  >
+                    <span className="truncate">{scene?.title || sceneId}</span>
+                  </button>
+                );
+              })}
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function ClassroomPreviewer({
+  data,
+  onExport,
+}: ClassroomPreviewerProps) {
+  const [currentSceneIndex, setCurrentSceneIndex] = useState(0);
+  const [isPlaying, setIsPlaying] = useState(false);
+  const [showNarration, setShowNarration] = useState(true);
+  const [showOutline, setShowOutline] = useState(true);
+  const [isFullscreen, setIsFullscreen] = useState(false);
+  const [viewMode, setViewMode] = useState<'slides' | 'grid'>('slides');
+ 
+  const { toast } = useToast();
+  const currentScene = data.scenes[currentSceneIndex];
+  const totalScenes = data.scenes.length;
+ 
+  // Navigation
+  const goToScene = useCallback((index: number) => {
+    if (index >= 0 && index < totalScenes) {
+      setCurrentSceneIndex(index);
+    }
+  }, [totalScenes]);
+ 
+  const nextScene = useCallback(() => {
+    goToScene(currentSceneIndex + 1);
+  }, [currentSceneIndex, goToScene]);
+ 
+  const prevScene = useCallback(() => {
+    goToScene(currentSceneIndex - 1);
+  }, [currentSceneIndex, goToScene]);
+ 
+  // Auto-play
+  useEffect(() => {
+    if (!isPlaying) return;
+ 
+    const duration = currentScene?.duration ? currentScene.duration * 1000 : 5000;
+    const timer = setTimeout(() => {
+      if (currentSceneIndex < totalScenes - 1) {
+        nextScene();
+      } else {
+        setIsPlaying(false);
+        toast('课堂播放完成', 'success');
+      }
+    }, duration);
+ 
+    return () => clearTimeout(timer);
+  }, [isPlaying, currentSceneIndex, currentScene, totalScenes, nextScene, toast]);
+ 
+  // Keyboard navigation
+  useEffect(() => {
+    const handleKeyDown = (e: KeyboardEvent) => {
+      switch (e.key) {
+        case 'ArrowRight':
+        case ' ':
+          e.preventDefault();
+          nextScene();
+          break;
+        case 'ArrowLeft':
+          e.preventDefault();
+          prevScene();
+          break;
+        case 'Escape':
+          if (isFullscreen) {
+            setIsFullscreen(false);
+          }
+          break;
+      }
+    };
+ 
+    window.addEventListener('keydown', handleKeyDown);
+    return () => window.removeEventListener('keydown', handleKeyDown);
+  }, [nextScene, prevScene, isFullscreen]);
+ 
+  // Fullscreen toggle
+  const toggleFullscreen = () => {
+    setIsFullscreen(!isFullscreen);
+  };
+ 
+  // Export handler
+  const handleExport = (format: 'pptx' | 'html' | 'pdf') => {
+    if (onExport) {
+      onExport(format);
+    } else {
+      toast(`导出 ${format.toUpperCase()} 功能开发中...`, 'info');
+    }
+  };
+ 
+  return (
+    <div className={`bg-white dark:bg-gray-900 rounded-lg shadow-xl overflow-hidden ${
+      isFullscreen ? 'fixed inset-0 z-50 rounded-none' : 'max-w-5xl w-full'
+    }`}>
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div>
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            {data.title}
+          </h2>
+          <p className="text-sm text-gray-500 dark:text-gray-400">
+            {data.subject} · {data.difficulty} · {data.duration} 分钟
+          </p>
+        </div>
+        <div className="flex items-center gap-2">
+          <button
+            onClick={() => handleExport('pptx')}
+            className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300 rounded-md hover:bg-orange-200 dark:hover:bg-orange-900/50 transition-colors"
+          >
+            <Download className="w-4 h-4" />
+            PPTX
+          </button>
+          <button
+            onClick={() => handleExport('html')}
+            className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 rounded-md hover:bg-blue-200 dark:hover:bg-blue-900/50 transition-colors"
+          >
+            <Share2 className="w-4 h-4" />
+            HTML
+          </button>
+        </div>
+      </div>
+ 
+      {/* Main Content */}
+      <div className="flex h-[500px]">
+        {/* Outline Panel */}
+        {showOutline && (
+          <div className="w-64 border-r border-gray-200 dark:border-gray-700 flex-shrink-0">
+            <OutlinePanel
+              outline={data.outline}
+              scenes={data.scenes}
+              currentIndex={currentSceneIndex}
+              onSelectScene={goToScene}
+            />
+          </div>
+        )}
+ 
+        {/* Slide Area */}
+        <div className="flex-1 flex flex-col">
+          {/* Scene Renderer */}
+          <div className="flex-1 relative">
+            {viewMode === 'slides' ? (
+              <SceneRenderer
+                scene={currentScene}
+                isPlaying={isPlaying}
+                showNarration={showNarration}
+              />
+            ) : (
+              <div className="h-full overflow-auto p-4 bg-gray-100 dark:bg-gray-800">
+                <div className="grid grid-cols-3 gap-3">
+                  {data.scenes.map((scene, index) => (
+                    <button
+                      key={scene.id}
+                      onClick={() => goToScene(index)}
+                      className={`aspect-video rounded-lg overflow-hidden border-2 transition-colors ${
+                        index === currentSceneIndex
+                          ? 'border-blue-500'
+                          : 'border-transparent hover:border-gray-300 dark:hover:border-gray-600'
+                      }`}
+                    >
+                      <div className="h-full bg-gradient-to-br from-blue-600 to-purple-600 p-2">
+                        <p className="text-xs text-white font-medium truncate">
+                          {scene.title}
+                        </p>
+                      </div>
+                    </button>
+                  ))}
+                </div>
+              </div>
+            )}
+          </div>
+ 
+          {/* Control Bar */}
+          <div className="flex items-center justify-between p-3 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800">
+            {/* Left Controls */}
+            <div className="flex items-center gap-2">
+              <button
+                onClick={() => setShowOutline(!showOutline)}
+                className={`p-2 rounded-md transition-colors ${
+                  showOutline
+                    ? 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400'
+                    : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-600 dark:text-gray-300'
+                }`}
+                title="大纲"
+              >
+                <List className="w-5 h-5" />
+              </button>
+              <button
+                onClick={() => setViewMode(viewMode === 'slides' ? 'grid' : 'slides')}
+                className="p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md text-gray-600 dark:text-gray-300"
+                title={viewMode === 'slides' ? '网格视图' : '幻灯片视图'}
+              >
+                <Grid className="w-5 h-5" />
+              </button>
+            </div>
+ 
+            {/* Center Controls */}
+            <div className="flex items-center gap-3">
+              <button
+                onClick={prevScene}
+                disabled={currentSceneIndex === 0}
+                className="p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md text-gray-600 dark:text-gray-300 disabled:opacity-50"
+              >
+                <ChevronLeft className="w-5 h-5" />
+              </button>
+ 
+              <button
+                onClick={() => setIsPlaying(!isPlaying)}
+                className="p-3 bg-blue-600 hover:bg-blue-700 text-white rounded-full transition-colors"
+              >
+                {isPlaying ? (
+                  <Pause className="w-5 h-5" />
+                ) : (
+                  <Play className="w-5 h-5" />
+                )}
+              </button>
+ 
+              <button
+                onClick={nextScene}
+                disabled={currentSceneIndex === totalScenes - 1}
+                className="p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md text-gray-600 dark:text-gray-300 disabled:opacity-50"
+              >
+                <ChevronRight className="w-5 h-5" />
+              </button>
+ 
+              <span className="text-sm text-gray-500 dark:text-gray-400 min-w-[60px] text-center">
+                {currentSceneIndex + 1} / {totalScenes}
+              </span>
+            </div>
+ 
+            {/* Right Controls */}
+            <div className="flex items-center gap-2">
+              <button
+                onClick={() => setShowNarration(!showNarration)}
+                className={`p-2 rounded-md transition-colors ${
+                  showNarration
+                    ? 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400'
+                    : 'hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-600 dark:text-gray-300'
+                }`}
+                title={showNarration ? '隐藏讲解' : '显示讲解'}
+              >
+                {showNarration ? (
+                  <Volume2 className="w-5 h-5" />
+                ) : (
+                  <VolumeX className="w-5 h-5" />
+                )}
+              </button>
+              <button
+                onClick={toggleFullscreen}
+                className="p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md text-gray-600 dark:text-gray-300"
+                title={isFullscreen ? '退出全屏' : '全屏'}
+              >
+                {isFullscreen ? (
+                  <Minimize className="w-5 h-5" />
+                ) : (
+                  <Maximize className="w-5 h-5" />
+                )}
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default ClassroomPreviewer;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/CloneManager.tsx.html b/desktop/coverage/src/components/CloneManager.tsx.html new file mode 100644 index 0000000..8c225d7 --- /dev/null +++ b/desktop/coverage/src/components/CloneManager.tsx.html @@ -0,0 +1,580 @@ + + + + + + Code coverage report for src/components/CloneManager.tsx + + + + + + + + + +
+
+

All files / src/components CloneManager.tsx

+
+ +
+ 0% + Statements + 0/129 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/129 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect } from 'react';
+import { useAgentStore } from '../store/agentStore';
+import { useConnectionStore } from '../store/connectionStore';
+import { useConfigStore } from '../store/configStore';
+import { toChatAgent, useChatStore } from '../store/chatStore';
+import { Bot, Plus, X, Globe, Cat, Search, BarChart2, Sparkles } from 'lucide-react';
+import { AgentOnboardingWizard } from './AgentOnboardingWizard';
+import type { Clone } from '../store/agentStore';
+ 
+export function CloneManager() {
+  const clones = useAgentStore((s) => s.clones);
+  const loadClones = useAgentStore((s) => s.loadClones);
+  const deleteClone = useAgentStore((s) => s.deleteClone);
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const { agents, currentAgent, setCurrentAgent } = useChatStore();
+  const [showWizard, setShowWizard] = useState(false);
+ 
+  const connected = connectionState === 'connected';
+ 
+  useEffect(() => {
+    if (connected) {
+      loadClones();
+    }
+  }, [connected, loadClones]);
+ 
+  const handleDelete = async (id: string) => {
+    if (confirm('确定删除该分身?')) {
+      await deleteClone(id);
+    }
+  };
+ 
+  const handleWizardSuccess = (clone: Clone) => {
+    setCurrentAgent(toChatAgent(clone));
+    setShowWizard(false);
+  };
+ 
+  // Merge gateway clones with local agents for display
+  const displayClones = clones.length > 0 ? clones : agents.map(a => ({
+    id: a.id,
+    name: a.name,
+    role: '默认助手',
+    nickname: a.name,
+    scenarios: [] as string[],
+    workspaceDir: '~/.openfang/zclaw-workspace',
+    userName: quickConfig.userName || '未设置',
+    userRole: '',
+    restrictFiles: true,
+    privacyOptIn: false,
+    createdAt: '',
+    onboardingCompleted: true,
+    emoji: undefined as string | undefined,
+    personality: undefined as string | undefined,
+  }));
+ 
+  // Function to get display emoji or icon for clone
+  const getCloneDisplay = (clone: typeof displayClones[0]) => {
+    // If clone has emoji, use it
+    if (clone.emoji) {
+      return {
+        emoji: clone.emoji,
+        icon: null,
+        bg: 'bg-gradient-to-br from-orange-400 to-red-500',
+      };
+    }
+ 
+    // Fallback to icon based on name
+    if (clone.name.includes('Browser') || clone.name.includes('浏览器')) {
+      return { emoji: null, icon: <Globe className="w-5 h-5" />, bg: 'bg-blue-500 text-white' };
+    }
+    if (clone.name.includes('AutoClaw') || clone.name.includes('ZCLAW')) {
+      return { emoji: null, icon: <Cat className="w-6 h-6" />, bg: 'bg-gradient-to-br from-orange-400 to-red-500 text-white' };
+    }
+    if (clone.name.includes('沉思')) {
+      return { emoji: null, icon: <Search className="w-5 h-5" />, bg: 'bg-blue-100 text-blue-600 dark:bg-blue-900 dark:text-blue-300' };
+    }
+    if (clone.name.includes('监控')) {
+      return { emoji: null, icon: <BarChart2 className="w-5 h-5" />, bg: 'bg-orange-100 text-orange-600 dark:bg-orange-900 dark:text-orange-300' };
+    }
+    return { emoji: null, icon: <Bot className="w-5 h-5" />, bg: 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-300' };
+  };
+ 
+  return (
+    <div className="h-full flex flex-col py-2">
+      {/* Clone list */}
+      <div className="flex-1 overflow-y-auto custom-scrollbar">
+        {displayClones.map((clone, idx) => {
+          const { emoji, icon, bg } = getCloneDisplay(clone);
+          const isActive = currentAgent ? currentAgent.id === clone.id : idx === 0;
+          const canDelete = clones.length > 0;
+ 
+          return (
+            <div
+              key={clone.id}
+              onClick={() => setCurrentAgent(toChatAgent(clone))}
+              className={`group sidebar-item mx-2 px-3 py-3 rounded-lg cursor-pointer mb-1 flex items-start gap-3 transition-colors ${
+                isActive ? 'bg-white dark:bg-gray-800 shadow-sm border border-gray-100 dark:border-gray-700' : 'hover:bg-black/5 dark:hover:bg-white/5'
+              }`}
+            >
+              <div className={`w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0 ${emoji ? bg : bg}`}>
+                {emoji ? (
+                  <span className="text-xl">{emoji}</span>
+                ) : (
+                  icon
+                )}
+              </div>
+              <div className="flex-1 min-w-0">
+                <div className="flex justify-between items-center mb-0.5">
+                  <span className={`truncate ${isActive ? 'font-semibold text-gray-900 dark:text-white' : 'font-medium text-gray-900 dark:text-white'}`}>
+                    {clone.name}
+                  </span>
+                  {isActive ? <span className="text-xs text-orange-500">当前</span> : null}
+                </div>
+                <p className="text-xs text-gray-500 dark:text-gray-400 truncate">
+                  {clone.role || clone.personality || '新分身'}
+                </p>
+              </div>
+              {canDelete && (
+                <button
+                  onClick={(e) => { e.stopPropagation(); handleDelete(clone.id); }}
+                  className="pointer-events-none opacity-0 group-hover:pointer-events-auto group-hover:opacity-100 focus:pointer-events-auto focus:opacity-100 p-1 mt-1 text-gray-300 hover:text-red-500 transition-opacity"
+                  title="删除"
+                >
+                  <X className="w-3.5 h-3.5" />
+                </button>
+              )}
+            </div>
+          );
+        })}
+ 
+        {/* Add new clone button */}
+        <div
+          onClick={() => {
+            if (connected) {
+              setShowWizard(true);
+            }
+          }}
+          className={`sidebar-item mx-2 px-3 py-3 rounded-lg mb-1 flex items-center gap-3 transition-colors border border-dashed border-gray-300 dark:border-gray-600 ${
+            connected
+              ? 'cursor-pointer text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5'
+              : 'cursor-not-allowed text-gray-400 dark:text-gray-500 bg-gray-50 dark:bg-gray-800/50'
+          }`}
+        >
+          <div className="w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0 bg-gray-50 dark:bg-gray-800">
+            {connected ? (
+              <Sparkles className="w-5 h-5 text-primary" />
+            ) : (
+              <Plus className="w-5 h-5" />
+            )}
+          </div>
+          <span className="text-sm font-medium">
+            {connected ? '创建新 Agent' : '连接 Gateway 后创建'}
+          </span>
+        </div>
+      </div>
+ 
+      {/* Onboarding Wizard Modal */}
+      <AgentOnboardingWizard
+        isOpen={showWizard}
+        onClose={() => setShowWizard(false)}
+        onSuccess={handleWizardSuccess}
+      />
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/CodeSnippetPanel.tsx.html b/desktop/coverage/src/components/CodeSnippetPanel.tsx.html new file mode 100644 index 0000000..2a0ef7b --- /dev/null +++ b/desktop/coverage/src/components/CodeSnippetPanel.tsx.html @@ -0,0 +1,1123 @@ + + + + + + Code coverage report for src/components/CodeSnippetPanel.tsx + + + + + + + + + +
+
+

All files / src/components CodeSnippetPanel.tsx

+
+ +
+ 0% + Statements + 0/251 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/251 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * CodeSnippetPanel - 代码片段快速浏览面板
+ *
+ * 功能:
+ * - 搜索过滤代码片段
+ * - 按语言筛选
+ * - 展开/折叠查看完整代码
+ * - 一键复制
+ * - 下载为文件
+ */
+ 
+import { useState, useMemo, useCallback } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Search, Copy, Download, ChevronDown, ChevronUp,
+  FileCode, X, Check, Code
+} from 'lucide-react';
+import { Button, EmptyState } from './ui';
+import type { CodeBlock } from '../store/chatStore';
+ 
+// === Types ===
+ 
+export interface CodeSnippet {
+  id: string;
+  block: CodeBlock;
+  messageIndex: number;
+}
+ 
+interface CodeSnippetPanelProps {
+  snippets: CodeSnippet[];
+}
+ 
+// === Language Colors ===
+ 
+const LANGUAGE_COLORS: Record<string, string> = {
+  python: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300',
+  javascript: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300',
+  typescript: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300',
+  rust: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300',
+  go: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300',
+  java: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300',
+  cpp: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300',
+  c: 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300',
+  html: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300',
+  css: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-300',
+  sql: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300',
+  bash: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300',
+  shell: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300',
+  json: 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300',
+  yaml: 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300',
+  markdown: 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300',
+  text: 'bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400',
+};
+ 
+function getLanguageColor(lang: string): string {
+  return LANGUAGE_COLORS[lang.toLowerCase()] || LANGUAGE_COLORS.text;
+}
+ 
+function getFileExtension(lang?: string): string {
+  const extensions: Record<string, string> = {
+    python: 'py',
+    javascript: 'js',
+    typescript: 'ts',
+    rust: 'rs',
+    go: 'go',
+    java: 'java',
+    cpp: 'cpp',
+    c: 'c',
+    html: 'html',
+    css: 'css',
+    sql: 'sql',
+    bash: 'sh',
+    shell: 'sh',
+    json: 'json',
+    yaml: 'yaml',
+    markdown: 'md',
+  };
+  return extensions[lang?.toLowerCase() || ''] || 'txt';
+}
+ 
+// === Snippet Card Component ===
+ 
+interface SnippetCardProps {
+  snippet: CodeSnippet;
+  isExpanded: boolean;
+  onToggle: () => void;
+}
+ 
+function SnippetCard({ snippet, isExpanded, onToggle }: SnippetCardProps) {
+  const [copied, setCopied] = useState(false);
+  const { block, messageIndex } = snippet;
+ 
+  const handleCopy = useCallback(async (e: React.MouseEvent) => {
+    e.stopPropagation();
+    try {
+      await navigator.clipboard.writeText(block.content || '');
+      setCopied(true);
+      setTimeout(() => setCopied(false), 2000);
+    } catch (err) {
+      console.error('Failed to copy:', err);
+    }
+  }, [block.content]);
+ 
+  const handleDownload = useCallback((e: React.MouseEvent) => {
+    e.stopPropagation();
+    const filename = block.filename || `snippet_${messageIndex + 1}.${getFileExtension(block.language)}`;
+    const blob = new Blob([block.content || ''], { type: 'text/plain' });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = url;
+    a.download = filename;
+    a.click();
+    URL.revokeObjectURL(url);
+  }, [block.content, block.filename, block.language, messageIndex]);
+ 
+  const lineCount = (block.content || '').split('\n').length;
+  const charCount = (block.content || '').length;
+  const previewLines = (block.content || '').split('\n').slice(0, 2).join('\n');
+ 
+  return (
+    <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden">
+      {/* Header */}
+      <button
+        onClick={onToggle}
+        className="w-full flex items-center justify-between p-3 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors text-left"
+      >
+        <div className="flex items-center gap-3 min-w-0">
+          <FileCode className="w-4 h-4 text-gray-400 flex-shrink-0" />
+          <div className="min-w-0">
+            <div className="flex items-center gap-2">
+              <span className="font-medium text-gray-800 dark:text-gray-200 truncate text-sm">
+                {block.filename || `代码片段 #${messageIndex + 1}`}
+              </span>
+              <span className={`text-xs px-1.5 py-0.5 rounded font-medium ${getLanguageColor(block.language || 'text')}`}>
+                {block.language || 'text'}
+              </span>
+            </div>
+            <div className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+              {lineCount} 行 · {charCount > 1024 ? `${(charCount / 1024).toFixed(1)} KB` : `${charCount} 字符`}
+            </div>
+          </div>
+        </div>
+        <div className="flex items-center gap-1">
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={handleCopy}
+            className="p-1.5 opacity-60 hover:opacity-100"
+            title="复制代码"
+          >
+            {copied ? (
+              <Check className="w-4 h-4 text-green-500" />
+            ) : (
+              <Copy className="w-4 h-4" />
+            )}
+          </Button>
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={handleDownload}
+            className="p-1.5 opacity-60 hover:opacity-100"
+            title="下载文件"
+          >
+            <Download className="w-4 h-4" />
+          </Button>
+          {isExpanded ? (
+            <ChevronUp className="w-4 h-4 text-gray-400 ml-1" />
+          ) : (
+            <ChevronDown className="w-4 h-4 text-gray-400 ml-1" />
+          )}
+        </div>
+      </button>
+ 
+      {/* Preview / Full Content */}
+      <AnimatePresence initial={false}>
+        {isExpanded ? (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            transition={{ duration: 0.2 }}
+            className="overflow-hidden"
+          >
+            <div className="border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 p-3">
+              <pre className="text-xs font-mono text-gray-700 dark:text-gray-300 overflow-x-auto whitespace-pre-wrap break-all max-h-60 overflow-y-auto">
+                {block.content}
+              </pre>
+            </div>
+          </motion.div>
+        ) : (
+          <div className="px-3 pb-3">
+            <pre className="text-xs font-mono text-gray-500 dark:text-gray-400 overflow-hidden whitespace-pre-wrap break-all line-clamp-2">
+              {previewLines}
+              {(block.content || '').split('\n').length > 2 && '...'}
+            </pre>
+          </div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function CodeSnippetPanel({ snippets }: CodeSnippetPanelProps) {
+  const [searchQuery, setSearchQuery] = useState('');
+  const [selectedLanguage, setSelectedLanguage] = useState<string | null>(null);
+  const [expandedId, setExpandedId] = useState<string | null>(null);
+ 
+  // Get unique languages with counts
+  const languages = useMemo(() => {
+    const langMap = new Map<string, number>();
+    snippets.forEach(s => {
+      const lang = s.block.language?.toLowerCase() || 'text';
+      langMap.set(lang, (langMap.get(lang) || 0) + 1);
+    });
+    return Array.from(langMap.entries())
+      .map(([lang, count]) => ({ lang, count }))
+      .sort((a, b) => b.count - a.count);
+  }, [snippets]);
+ 
+  // Filter snippets
+  const filteredSnippets = useMemo(() => {
+    return snippets.filter(snippet => {
+      const block = snippet.block;
+ 
+      // Language filter
+      if (selectedLanguage && (block.language?.toLowerCase() || 'text') !== selectedLanguage) {
+        return false;
+      }
+ 
+      // Search filter
+      if (searchQuery) {
+        const query = searchQuery.toLowerCase();
+        const matchesFilename = block.filename?.toLowerCase().includes(query);
+        const matchesContent = block.content?.toLowerCase().includes(query);
+        const matchesLanguage = block.language?.toLowerCase().includes(query);
+        return matchesFilename || matchesContent || matchesLanguage;
+      }
+ 
+      return true;
+    });
+  }, [snippets, searchQuery, selectedLanguage]);
+ 
+  const handleToggle = useCallback((id: string) => {
+    setExpandedId(prev => prev === id ? null : id);
+  }, []);
+ 
+  if (snippets.length === 0) {
+    return (
+      <EmptyState
+        icon={<Code className="w-10 h-10" />}
+        title="暂无代码片段"
+        description="对话中生成的代码会自动出现在这里"
+        className="py-8"
+      />
+    );
+  }
+ 
+  return (
+    <div className="space-y-3">
+      {/* Search Bar */}
+      <div className="relative">
+        <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
+        <input
+          type="text"
+          placeholder="搜索代码..."
+          value={searchQuery}
+          onChange={(e) => setSearchQuery(e.target.value)}
+          className="w-full pl-9 pr-8 py-2 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-emerald-500 focus:border-transparent"
+        />
+        {searchQuery && (
+          <button
+            onClick={() => setSearchQuery('')}
+            className="absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded"
+          >
+            <X className="w-3 h-3 text-gray-400" />
+          </button>
+        )}
+      </div>
+ 
+      {/* Language Filters */}
+      {languages.length > 1 && (
+        <div className="flex flex-wrap gap-1.5">
+          <button
+            onClick={() => setSelectedLanguage(null)}
+            className={`px-2 py-1 text-xs rounded-full transition-colors ${
+              selectedLanguage === null
+                ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300'
+                : 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'
+            }`}
+          >
+            全部 ({snippets.length})
+          </button>
+          {languages.map(({ lang, count }) => (
+            <button
+              key={lang}
+              onClick={() => setSelectedLanguage(selectedLanguage === lang ? null : lang)}
+              className={`px-2 py-1 text-xs rounded-full transition-colors ${
+                selectedLanguage === lang
+                  ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300'
+                  : 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'
+              }`}
+            >
+              {lang} ({count})
+            </button>
+          ))}
+        </div>
+      )}
+ 
+      {/* Results Count */}
+      {(searchQuery || selectedLanguage) && (
+        <div className="text-xs text-gray-500 dark:text-gray-400">
+          找到 {filteredSnippets.length} 个代码片段
+        </div>
+      )}
+ 
+      {/* Snippet List */}
+      <div className="space-y-2 overflow-y-auto" style={{ maxHeight: 'calc(100vh - 380px)' }}>
+        <AnimatePresence mode="popLayout">
+          {filteredSnippets.map((snippet) => (
+            <motion.div
+              key={snippet.id}
+              initial={{ opacity: 0, y: 10 }}
+              animate={{ opacity: 1, y: 0 }}
+              exit={{ opacity: 0, y: -10 }}
+              layout
+            >
+              <SnippetCard
+                snippet={snippet}
+                isExpanded={expandedId === snippet.id}
+                onToggle={() => handleToggle(snippet.id)}
+              />
+            </motion.div>
+          ))}
+        </AnimatePresence>
+ 
+        {filteredSnippets.length === 0 && (
+          <div className="text-center py-4 text-sm text-gray-500 dark:text-gray-400">
+            没有找到匹配的代码片段
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ConnectionStatus.tsx.html b/desktop/coverage/src/components/ConnectionStatus.tsx.html new file mode 100644 index 0000000..5812a03 --- /dev/null +++ b/desktop/coverage/src/components/ConnectionStatus.tsx.html @@ -0,0 +1,943 @@ + + + + + + Code coverage report for src/components/ConnectionStatus.tsx + + + + + + + + + +
+
+

All files / src/components ConnectionStatus.tsx

+
+ +
+ 0% + Statements + 0/196 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/196 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ConnectionStatus Component
+ *
+ * Displays the current Gateway connection status with visual indicators.
+ * Supports automatic reconnect and manual reconnect button.
+ * Includes health status indicator for OpenFang backend.
+ */
+ 
+import { useState, useEffect } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { Wifi, WifiOff, Loader2, RefreshCw, Heart, HeartPulse } from 'lucide-react';
+import { useConnectionStore, getClient } from '../store/connectionStore';
+import {
+  createHealthCheckScheduler,
+  getHealthStatusLabel,
+  formatHealthCheckTime,
+  type HealthCheckResult,
+  type HealthStatus,
+} from '../lib/health-check';
+ 
+interface ConnectionStatusProps {
+  /** Show compact version (just icon and status text) */
+  compact?: boolean;
+  /** Show reconnect button when disconnected */
+  showReconnectButton?: boolean;
+  /** Additional CSS classes */
+  className?: string;
+}
+ 
+interface ReconnectInfo {
+  attempt: number;
+  delay: number;
+  maxAttempts: number;
+}
+ 
+type StatusType = 'disconnected' | 'connecting' | 'handshaking' | 'connected' | 'reconnecting';
+ 
+const statusConfig: Record<StatusType, {
+  color: string;
+  bgColor: string;
+  label: string;
+  icon: typeof Wifi;
+  animate?: boolean;
+}> = {
+  disconnected: {
+    color: 'text-red-500',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    label: '已断开',
+    icon: WifiOff,
+  },
+  connecting: {
+    color: 'text-yellow-500',
+    bgColor: 'bg-yellow-50 dark:bg-yellow-900/20',
+    label: '连接中...',
+    icon: Loader2,
+    animate: true,
+  },
+  handshaking: {
+    color: 'text-yellow-500',
+    bgColor: 'bg-yellow-50 dark:bg-yellow-900/20',
+    label: '认证中...',
+    icon: Loader2,
+    animate: true,
+  },
+  connected: {
+    color: 'text-green-500',
+    bgColor: 'bg-green-50 dark:bg-green-900/20',
+    label: '已连接',
+    icon: Wifi,
+  },
+  reconnecting: {
+    color: 'text-orange-500',
+    bgColor: 'bg-orange-50 dark:bg-orange-900/20',
+    label: '重连中...',
+    icon: RefreshCw,
+    animate: true,
+  },
+};
+ 
+export function ConnectionStatus({
+  compact = false,
+  showReconnectButton = true,
+  className = '',
+}: ConnectionStatusProps) {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const connect = useConnectionStore((s) => s.connect);
+  const [showPrompt, setShowPrompt] = useState(false);
+  const [reconnectInfo, setReconnectInfo] = useState<ReconnectInfo | null>(null);
+ 
+  // Listen for reconnect events
+  useEffect(() => {
+    const client = getClient();
+ 
+    const unsubReconnecting = client.on('reconnecting', (info) => {
+      setReconnectInfo(info as ReconnectInfo);
+    });
+ 
+    const unsubFailed = client.on('reconnect_failed', () => {
+      setShowPrompt(true);
+      setReconnectInfo(null);
+    });
+ 
+    const unsubConnected = client.on('connected', () => {
+      setShowPrompt(false);
+      setReconnectInfo(null);
+    });
+ 
+    return () => {
+      unsubReconnecting();
+      unsubFailed();
+      unsubConnected();
+    };
+  }, []);
+ 
+  const config = statusConfig[connectionState];
+  const Icon = config.icon;
+  const isDisconnected = connectionState === 'disconnected';
+  const isReconnecting = connectionState === 'reconnecting';
+ 
+  const handleReconnect = async () => {
+    setShowPrompt(false);
+    try {
+      await connect();
+    } catch (error) {
+      console.error('Manual reconnect failed:', error);
+    }
+  };
+ 
+  // Compact version
+  if (compact) {
+    return (
+      <div className={`flex items-center gap-1.5 ${className}`}>
+        <Icon
+          className={`w-3.5 h-3.5 ${config.color} ${config.animate ? 'animate-spin' : ''}`}
+        />
+        <span className={`text-xs ${config.color}`}>
+          {isReconnecting && reconnectInfo
+            ? `${config.label} (${reconnectInfo.attempt}/${reconnectInfo.maxAttempts})`
+            : config.label}
+        </span>
+        {showPrompt && showReconnectButton && (
+          <button
+            onClick={handleReconnect}
+            className="text-xs text-blue-500 hover:text-blue-600 ml-1"
+          >
+            重连
+          </button>
+        )}
+      </div>
+    );
+  }
+ 
+  // Full version
+  return (
+    <div className={`flex items-center gap-3 ${config.bgColor} rounded-lg px-3 py-2 ${className}`}>
+      <motion.div
+        initial={false}
+        animate={{ rotate: config.animate ? 360 : 0 }}
+        transition={config.animate ? { duration: 1, repeat: Infinity, ease: 'linear' } : {}}
+      >
+        <Icon className={`w-5 h-5 ${config.color}`} />
+      </motion.div>
+ 
+      <div className="flex-1">
+        <div className={`text-sm font-medium ${config.color}`}>
+          {isReconnecting && reconnectInfo
+            ? `${config.label} (${reconnectInfo.attempt}/${reconnectInfo.maxAttempts})`
+            : config.label}
+        </div>
+        {reconnectInfo && (
+          <div className="text-xs text-gray-500 dark:text-gray-400">
+            {Math.round(reconnectInfo.delay / 1000)}秒后重试
+          </div>
+        )}
+      </div>
+ 
+      <AnimatePresence>
+        {showPrompt && isDisconnected && showReconnectButton && (
+          <motion.button
+            initial={{ opacity: 0, scale: 0.9 }}
+            animate={{ opacity: 1, scale: 1 }}
+            exit={{ opacity: 0, scale: 0.9 }}
+            onClick={handleReconnect}
+            className="flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-white bg-blue-500 hover:bg-blue-600 rounded-md transition-colors"
+          >
+            <RefreshCw className="w-4 h-4" />
+            重新连接
+          </motion.button>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+/**
+ * ConnectionIndicator - Minimal connection indicator for headers
+ */
+export function ConnectionIndicator({ className = '' }: { className?: string }) {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+ 
+  const isConnected = connectionState === 'connected';
+  const isReconnecting = connectionState === 'reconnecting';
+ 
+  return (
+    <span className={`text-xs flex items-center gap-1 ${className}`}>
+      <span
+        className={`w-1.5 h-1.5 rounded-full ${
+          isConnected
+            ? 'bg-green-400'
+            : isReconnecting
+            ? 'bg-orange-400 animate-pulse'
+            : 'bg-red-400'
+        }`}
+      />
+      <span className={
+        isConnected
+          ? 'text-green-500'
+          : isReconnecting
+          ? 'text-orange-500'
+          : 'text-red-500'
+      }>
+        {isConnected
+          ? 'Gateway 已连接'
+          : isReconnecting
+          ? '重连中...'
+          : 'Gateway 未连接'}
+      </span>
+    </span>
+  );
+}
+ 
+/**
+ * HealthStatusIndicator - Displays OpenFang backend health status
+ */
+export function HealthStatusIndicator({
+  className = '',
+  showDetails = false,
+}: {
+  className?: string;
+  showDetails?: boolean;
+}) {
+  const [healthResult, setHealthResult] = useState<HealthCheckResult | null>(null);
+ 
+  useEffect(() => {
+    // Start periodic health checks
+    const cleanup = createHealthCheckScheduler((result) => {
+      setHealthResult(result);
+    }, 30000); // Check every 30 seconds
+ 
+    return cleanup;
+  }, []);
+ 
+  if (!healthResult) {
+    return (
+      <span className={`text-xs flex items-center gap-1 ${className}`}>
+        <Heart className="w-3.5 h-3.5 text-gray-400" />
+        <span className="text-gray-400">检查中...</span>
+      </span>
+    );
+  }
+ 
+  const statusColors: Record<HealthStatus, { dot: string; text: string; icon: typeof Heart }> = {
+    healthy: { dot: 'bg-green-400', text: 'text-green-500', icon: Heart },
+    unhealthy: { dot: 'bg-red-400', text: 'text-red-500', icon: HeartPulse },
+    unknown: { dot: 'bg-gray-400', text: 'text-gray-500', icon: Heart },
+  };
+ 
+  const config = statusColors[healthResult.status];
+  const Icon = config.icon;
+ 
+  return (
+    <span className={`text-xs flex items-center gap-1 ${className}`}>
+      <Icon className={`w-3.5 h-3.5 ${config.text}`} />
+      <span className={config.text}>
+        {getHealthStatusLabel(healthResult.status)}
+      </span>
+      {showDetails && healthResult.message && (
+        <span className="text-gray-400 ml-1" title={healthResult.message}>
+          ({formatHealthCheckTime(healthResult.timestamp)})
+        </span>
+      )}
+    </span>
+  );
+}
+ 
+export default ConnectionStatus;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ConversationList.tsx.html b/desktop/coverage/src/components/ConversationList.tsx.html new file mode 100644 index 0000000..d7e0445 --- /dev/null +++ b/desktop/coverage/src/components/ConversationList.tsx.html @@ -0,0 +1,442 @@ + + + + + + Code coverage report for src/components/ConversationList.tsx + + + + + + + + + +
+
+

All files / src/components ConversationList.tsx

+
+ +
+ 0% + Statements + 0/93 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/93 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useChatStore } from '../store/chatStore';
+import { MessageSquare, Trash2, SquarePen } from 'lucide-react';
+import { EmptyConversations, ConversationListSkeleton } from './ui';
+ 
+export function ConversationList() {
+  const {
+    conversations, currentConversationId, messages, agents, currentAgent,
+    newConversation, switchConversation, deleteConversation,
+    isLoading,
+  } = useChatStore();
+ 
+  const hasActiveChat = messages.length > 0;
+ 
+  // Show skeleton during initial load
+  if (isLoading && conversations.length === 0 && !hasActiveChat) {
+    return <ConversationListSkeleton count={4} />;
+  }
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* Header */}
+      <div className="flex items-center justify-between px-3 py-2 border-b border-gray-200">
+        <span className="text-xs font-medium text-gray-500">对话历史</span>
+        <button
+          onClick={newConversation}
+          className="p-1 text-gray-400 hover:text-orange-500 rounded"
+          title="新对话"
+        >
+          <SquarePen className="w-4 h-4" />
+        </button>
+      </div>
+ 
+      <div className="flex-1 overflow-y-auto custom-scrollbar">
+        {/* Current active chat (unsaved) */}
+        {hasActiveChat && !currentConversationId && (
+          <div className="flex items-center gap-3 px-3 py-3 bg-orange-50 border-b border-orange-100 cursor-default">
+            <div className="w-7 h-7 bg-orange-500 rounded-lg flex items-center justify-center text-white flex-shrink-0">
+              <MessageSquare className="w-3.5 h-3.5" />
+            </div>
+            <div className="flex-1 min-w-0">
+              <div className="text-xs font-medium text-orange-700 truncate">当前对话</div>
+              <div className="text-[11px] text-orange-500 truncate">
+                {messages.filter(m => m.role === 'user').length} 条消息 · {currentAgent?.name || 'ZCLAW'}
+              </div>
+            </div>
+          </div>
+        )}
+ 
+        {/* Saved conversations */}
+        {conversations.map((conv) => {
+          const isActive = conv.id === currentConversationId;
+          const msgCount = conv.messages.filter(m => m.role === 'user').length;
+          const timeStr = formatTime(conv.updatedAt);
+          const agentName = conv.agentId
+            ? agents.find((agent) => agent.id === conv.agentId)?.name || conv.agentId
+            : 'ZCLAW';
+ 
+          return (
+            <div
+              key={conv.id}
+              onClick={() => switchConversation(conv.id)}
+              className={`group flex items-center gap-3 px-3 py-3 cursor-pointer border-b border-gray-50 transition-colors ${
+                isActive ? 'bg-orange-50' : 'hover:bg-gray-100'
+              }`}
+            >
+              <div className={`w-7 h-7 rounded-lg flex items-center justify-center flex-shrink-0 ${
+                isActive ? 'bg-orange-500 text-white' : 'bg-gray-200 text-gray-500'
+              }`}>
+                <MessageSquare className="w-3.5 h-3.5" />
+              </div>
+              <div className="flex-1 min-w-0">
+                <div className={`text-xs font-medium truncate ${isActive ? 'text-orange-700' : 'text-gray-900'}`}>
+                  {conv.title}
+                </div>
+                <div className="text-[11px] text-gray-400 truncate">
+                  {msgCount} 条消息 · {agentName} · {timeStr}
+                </div>
+              </div>
+              <button
+                onClick={(e) => {
+                  e.stopPropagation();
+                  if (confirm('删除该对话?')) {
+                    deleteConversation(conv.id);
+                  }
+                }}
+                className="opacity-0 group-hover:opacity-100 p-1 text-gray-300 hover:text-red-500 transition-opacity"
+                title="删除"
+              >
+                <Trash2 className="w-3 h-3" />
+              </button>
+            </div>
+          );
+        })}
+ 
+        {conversations.length === 0 && !hasActiveChat && (
+          <EmptyConversations size="sm" className="h-auto" />
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+function formatTime(date: Date): string {
+  const now = new Date();
+  const d = new Date(date);
+  const diffMs = now.getTime() - d.getTime();
+  const diffMin = Math.floor(diffMs / 60000);
+  
+  if (diffMin < 1) return '刚刚';
+  if (diffMin < 60) return `${diffMin} 分钟前`;
+  
+  const diffHr = Math.floor(diffMin / 60);
+  if (diffHr < 24) return `${diffHr} 小时前`;
+  
+  const diffDay = Math.floor(diffHr / 24);
+  if (diffDay < 7) return `${diffDay} 天前`;
+  
+  return `${d.getMonth() + 1}/${d.getDate()}`;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/CreateTriggerModal.tsx.html b/desktop/coverage/src/components/CreateTriggerModal.tsx.html new file mode 100644 index 0000000..f33995a --- /dev/null +++ b/desktop/coverage/src/components/CreateTriggerModal.tsx.html @@ -0,0 +1,1858 @@ + + + + + + Code coverage report for src/components/CreateTriggerModal.tsx + + + + + + + + + +
+
+

All files / src/components CreateTriggerModal.tsx

+
+ +
+ 0% + Statements + 0/437 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/437 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * CreateTriggerModal - Modal for creating event triggers
+ *
+ * Supports trigger types:
+ * - webhook: External HTTP request trigger
+ * - event: OpenFang internal event trigger
+ * - message: Chat message pattern trigger
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore } from '../store/handStore';
+import { useWorkflowStore } from '../store/workflowStore';
+import {
+  Zap,
+  X,
+  AlertCircle,
+  CheckCircle,
+  Loader2,
+  Globe,
+  MessageSquare,
+  Bell,
+} from 'lucide-react';
+ 
+// === ReDoS Protection ===
+ 
+const MAX_PATTERN_LENGTH = 200;
+const REGEX_TIMEOUT_MS = 100;
+ 
+// Dangerous regex patterns that can cause catastrophic backtracking
+const DANGEROUS_PATTERNS = [
+  /\([^)]*\+[^)]*\)\+/,      // Nested quantifiers like (a+)+
+  /\([^)]*\*[^)]*\)\*/,      // Nested quantifiers like (a*)*
+  /\([^)]*\+[^)]*\)\*/,      // Mixed nested quantifiers
+  /\([^)]*\*[^)]*\)\+/,      // Mixed nested quantifiers
+  /\.\*\.\*/,                // Multiple greedy wildcards
+  /\.+\.\+/,                 // Multiple greedy wildcards
+  /(.*)\1{3,}/,              // Backreference loops
+];
+ 
+function validateRegexPattern(pattern: string): { valid: boolean; error?: string } {
+  // Length check
+  if (pattern.length > MAX_PATTERN_LENGTH) {
+    return { valid: false, error: `Pattern too long (max ${MAX_PATTERN_LENGTH} chars)` };
+  }
+ 
+  // Check for dangerous constructs
+  for (const dangerous of DANGEROUS_PATTERNS) {
+    if (dangerous.test(pattern)) {
+      return { valid: false, error: 'Pattern contains potentially dangerous constructs' };
+    }
+  }
+ 
+  // Validate syntax and check execution time
+  try {
+    const regex = new RegExp(pattern);
+    const testString = 'a'.repeat(20) + 'b'.repeat(20);
+    const start = Date.now();
+    regex.test(testString);
+    const elapsed = Date.now() - start;
+ 
+    if (elapsed > REGEX_TIMEOUT_MS) {
+      return { valid: false, error: 'Pattern is too complex (execution timeout)' };
+    }
+ 
+    return { valid: true };
+  } catch (err: unknown) {
+    const message = err instanceof Error ? err.message : 'Invalid pattern';
+    return { valid: false, error: `Invalid regular expression: ${message}` };
+  }
+}
+ 
+// === Types ===
+ 
+type TriggerType = 'webhook' | 'event' | 'message';
+type TargetType = 'hand' | 'workflow';
+ 
+interface TriggerFormData {
+  name: string;
+  type: TriggerType;
+  pattern: string;
+  targetType: TargetType;
+  targetId: string;
+  webhookPath: string;
+  eventType: string;
+  enabled: boolean;
+}
+ 
+interface CreateTriggerModalProps {
+  isOpen: boolean;
+  onClose: () => void;
+  onSuccess: () => void;
+}
+ 
+const initialFormData: TriggerFormData = {
+  name: '',
+  type: 'webhook',
+  pattern: '',
+  targetType: 'hand',
+  targetId: '',
+  webhookPath: '',
+  eventType: '',
+  enabled: true,
+};
+ 
+// === Trigger Type Options ===
+ 
+const triggerTypeOptions: Array<{
+  value: TriggerType;
+  label: string;
+  description: string;
+  icon: React.ComponentType<{ className?: string }>;
+}> = [
+  {
+    value: 'webhook',
+    label: 'Webhook',
+    description: 'External HTTP request trigger',
+    icon: Globe,
+  },
+  {
+    value: 'event',
+    label: 'Event',
+    description: 'OpenFang internal event trigger',
+    icon: Bell,
+  },
+  {
+    value: 'message',
+    label: 'Message',
+    description: 'Chat message pattern trigger',
+    icon: MessageSquare,
+  },
+];
+ 
+// === Event Type Options ===
+ 
+const eventTypeOptions = [
+  { value: 'file_changed', label: 'File Changed' },
+  { value: 'agent_started', label: 'Agent Started' },
+  { value: 'agent_stopped', label: 'Agent Stopped' },
+  { value: 'hand_completed', label: 'Hand Completed' },
+  { value: 'workflow_completed', label: 'Workflow Completed' },
+  { value: 'session_created', label: 'Session Created' },
+  { value: 'custom', label: 'Custom Event' },
+];
+ 
+// === Component ===
+ 
+export function CreateTriggerModal({ isOpen, onClose, onSuccess }: CreateTriggerModalProps) {
+  // Store state - use domain stores
+  const hands = useHandStore((s) => s.hands);
+  const workflows = useWorkflowStore((s) => s.workflows);
+  const createTrigger = useHandStore((s) => s.createTrigger);
+  const loadHands = useHandStore((s) => s.loadHands);
+  const loadWorkflows = useWorkflowStore((s) => s.loadWorkflows);
+  const [formData, setFormData] = useState<TriggerFormData>(initialFormData);
+  const [errors, setErrors] = useState<Record<string, string>>({});
+  const [isSubmitting, setIsSubmitting] = useState(false);
+  const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');
+  const [errorMessage, setErrorMessage] = useState('');
+ 
+  // Load available targets on mount
+  useEffect(() => {
+    if (isOpen) {
+      loadHands();
+      loadWorkflows();
+    }
+  }, [isOpen, loadHands, loadWorkflows]);
+ 
+  // Reset form when modal opens
+  useEffect(() => {
+    if (isOpen) {
+      setFormData(initialFormData);
+      setErrors({});
+      setSubmitStatus('idle');
+      setErrorMessage('');
+    }
+  }, [isOpen]);
+ 
+  // Validate form
+  const validateForm = useCallback((): boolean => {
+    const newErrors: Record<string, string> = {};
+ 
+    if (!formData.name.trim()) {
+      newErrors.name = 'Trigger name is required';
+    }
+ 
+    switch (formData.type) {
+      case 'webhook':
+        if (!formData.webhookPath.trim()) {
+          newErrors.webhookPath = 'Webhook path is required';
+        } else if (!formData.webhookPath.startsWith('/')) {
+          newErrors.webhookPath = 'Webhook path must start with /';
+        }
+        break;
+      case 'event':
+        if (!formData.eventType) {
+          newErrors.eventType = 'Event type is required';
+        }
+        break;
+      case 'message':
+        if (!formData.pattern.trim()) {
+          newErrors.pattern = 'Pattern is required';
+        } else {
+          // Validate regex pattern with ReDoS protection
+          const validation = validateRegexPattern(formData.pattern);
+          if (!validation.valid) {
+            newErrors.pattern = validation.error || 'Invalid pattern';
+          }
+        }
+        break;
+    }
+ 
+    if (!formData.targetId) {
+      newErrors.targetId = 'Please select a target';
+    }
+ 
+    setErrors(newErrors);
+    return Object.keys(newErrors).length === 0;
+  }, [formData]);
+ 
+  // Handle form submission
+  const handleSubmit = async (e: React.FormEvent) => {
+    e.preventDefault();
+ 
+    if (!validateForm()) {
+      return;
+    }
+ 
+    setIsSubmitting(true);
+    setSubmitStatus('idle');
+    setErrorMessage('');
+ 
+    try {
+      // Build config based on trigger type
+      const config: Record<string, unknown> = {};
+ 
+      switch (formData.type) {
+        case 'webhook':
+          config.path = formData.webhookPath;
+          break;
+        case 'event':
+          config.eventType = formData.eventType;
+          break;
+        case 'message':
+          config.pattern = formData.pattern;
+          break;
+      }
+ 
+      await createTrigger({
+        type: formData.type,
+        name: formData.name.trim(),
+        enabled: formData.enabled,
+        config,
+        handName: formData.targetType === 'hand' ? formData.targetId : undefined,
+        workflowId: formData.targetType === 'workflow' ? formData.targetId : undefined,
+      });
+ 
+      setSubmitStatus('success');
+      setTimeout(() => {
+        onSuccess();
+        onClose();
+      }, 1500);
+    } catch (err) {
+      setSubmitStatus('error');
+      setErrorMessage(err instanceof Error ? err.message : 'Failed to create trigger');
+    } finally {
+      setIsSubmitting(false);
+    }
+  };
+ 
+  // Update form field
+  const updateField = <K extends keyof TriggerFormData>(field: K, value: TriggerFormData[K]) => {
+    setFormData(prev => ({ ...prev, [field]: value }));
+    // Clear error when field is updated
+    if (errors[field]) {
+      setErrors(prev => {
+        const newErrors = { ...prev };
+        delete newErrors[field];
+        return newErrors;
+      });
+    }
+  };
+ 
+  // Get available targets based on type
+  const getAvailableTargets = (): Array<{ id: string; name?: string }> => {
+    switch (formData.targetType) {
+      case 'hand':
+        return hands.map(h => ({ id: h.id, name: h.name }));
+      case 'workflow':
+        return workflows.map(w => ({ id: w.id, name: w.name }));
+      default:
+        return [];
+    }
+  };
+ 
+  if (!isOpen) return null;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <div className="flex items-center gap-3">
+            <div className="w-8 h-8 bg-amber-100 dark:bg-amber-900/30 rounded-lg flex items-center justify-center">
+              <Zap className="w-4 h-4 text-amber-600 dark:text-amber-400" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                Create Event Trigger
+              </h2>
+              <p className="text-xs text-gray-500 dark:text-gray-400">
+                Create a trigger to respond to events
+              </p>
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
+          >
+            <X className="w-5 h-5" />
+          </button>
+        </div>
+ 
+        {/* Form */}
+        <form onSubmit={handleSubmit} className="flex-1 overflow-y-auto p-4 space-y-4">
+          {/* Trigger Name */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              Trigger Name <span className="text-red-500">*</span>
+            </label>
+            <input
+              type="text"
+              value={formData.name}
+              onChange={(e) => updateField('name', e.target.value)}
+              placeholder="e.g., Daily Report Webhook"
+              className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-amber-500 ${
+                errors.name ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+              }`}
+            />
+            {errors.name && (
+              <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                <AlertCircle className="w-3 h-3" />
+                {errors.name}
+              </p>
+            )}
+          </div>
+ 
+          {/* Trigger Type */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              Trigger Type <span className="text-red-500">*</span>
+            </label>
+            <div className="grid grid-cols-3 gap-2">
+              {triggerTypeOptions.map((option) => {
+                const Icon = option.icon;
+                return (
+                  <button
+                    key={option.value}
+                    type="button"
+                    onClick={() => updateField('type', option.value as TriggerType)}
+                    className={`flex flex-col items-center gap-1 p-3 text-sm rounded-lg border transition-colors ${
+                      formData.type === option.value
+                        ? 'bg-amber-600 text-white border-amber-600'
+                        : 'bg-white dark:bg-gray-900 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:border-amber-500'
+                    }`}
+                  >
+                    <Icon className="w-5 h-5" />
+                    <span>{option.label}</span>
+                  </button>
+                );
+              })}
+            </div>
+            <p className="mt-1 text-xs text-gray-400">
+              {triggerTypeOptions.find(o => o.value === formData.type)?.description}
+            </p>
+          </div>
+ 
+          {/* Webhook Path */}
+          {formData.type === 'webhook' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                Webhook Path <span className="text-red-500">*</span>
+              </label>
+              <input
+                type="text"
+                value={formData.webhookPath}
+                onChange={(e) => updateField('webhookPath', e.target.value)}
+                placeholder="/api/webhooks/daily-report"
+                className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-amber-500 font-mono ${
+                  errors.webhookPath ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                }`}
+              />
+              {errors.webhookPath && (
+                <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                  <AlertCircle className="w-3 h-3" />
+                  {errors.webhookPath}
+                </p>
+              )}
+              <p className="mt-1 text-xs text-gray-400">
+                The URL path that will trigger this action when called
+              </p>
+            </div>
+          )}
+ 
+          {/* Event Type */}
+          {formData.type === 'event' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                Event Type <span className="text-red-500">*</span>
+              </label>
+              <select
+                value={formData.eventType}
+                onChange={(e) => updateField('eventType', e.target.value)}
+                className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-amber-500 ${
+                  errors.eventType ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                }`}
+              >
+                <option value="">-- Select Event Type --</option>
+                {eventTypeOptions.map((option) => (
+                  <option key={option.value} value={option.value}>
+                    {option.label}
+                  </option>
+                ))}
+              </select>
+              {errors.eventType && (
+                <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                  <AlertCircle className="w-3 h-3" />
+                  {errors.eventType}
+                </p>
+              )}
+            </div>
+          )}
+ 
+          {/* Message Pattern */}
+          {formData.type === 'message' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                Message Pattern <span className="text-red-500">*</span>
+              </label>
+              <input
+                type="text"
+                value={formData.pattern}
+                onChange={(e) => updateField('pattern', e.target.value)}
+                placeholder="^/report"
+                className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-amber-500 font-mono ${
+                  errors.pattern ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                }`}
+              />
+              {errors.pattern && (
+                <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                  <AlertCircle className="w-3 h-3" />
+                  {errors.pattern}
+                </p>
+              )}
+              <p className="mt-1 text-xs text-gray-400">
+                Regular expression pattern to match chat messages
+              </p>
+            </div>
+          )}
+ 
+          {/* Target Selection */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              Target Type
+            </label>
+            <div className="flex gap-2">
+              {[
+                { value: 'hand', label: 'Hand' },
+                { value: 'workflow', label: 'Workflow' },
+              ].map((option) => (
+                <button
+                  key={option.value}
+                  type="button"
+                  onClick={() => {
+                    updateField('targetType', option.value as TargetType);
+                    updateField('targetId', ''); // Reset target when type changes
+                  }}
+                  className={`flex-1 px-3 py-2 text-sm rounded-lg border transition-colors ${
+                    formData.targetType === option.value
+                      ? 'bg-amber-600 text-white border-amber-600'
+                      : 'bg-white dark:bg-gray-900 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:border-amber-500'
+                  }`}
+                >
+                  {option.label}
+                </button>
+              ))}
+            </div>
+          </div>
+ 
+          {/* Target Selection Dropdown */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              Select Target <span className="text-red-500">*</span>
+            </label>
+            <select
+              value={formData.targetId}
+              onChange={(e) => updateField('targetId', e.target.value)}
+              className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-amber-500 ${
+                errors.targetId ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+              }`}
+            >
+              <option value="">-- Please Select --</option>
+              {getAvailableTargets().map((target) => (
+                <option key={target.id} value={target.id}>
+                  {target.name || target.id}
+                </option>
+              ))}
+            </select>
+            {errors.targetId && (
+              <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                <AlertCircle className="w-3 h-3" />
+                {errors.targetId}
+              </p>
+            )}
+            {getAvailableTargets().length === 0 && (
+              <p className="mt-1 text-xs text-gray-400">
+                No {formData.targetType === 'hand' ? 'Hands' : 'Workflows'} available
+              </p>
+            )}
+          </div>
+ 
+          {/* Enabled Toggle */}
+          <div className="flex items-center gap-2">
+            <input
+              type="checkbox"
+              id="trigger-enabled"
+              checked={formData.enabled}
+              onChange={(e) => updateField('enabled', e.target.checked)}
+              className="w-4 h-4 text-amber-600 border-gray-300 rounded focus:ring-amber-500"
+            />
+            <label htmlFor="trigger-enabled" className="text-sm text-gray-700 dark:text-gray-300">
+              Enable immediately after creation
+            </label>
+          </div>
+ 
+          {/* Status Messages */}
+          {submitStatus === 'success' && (
+            <div className="flex items-center gap-2 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg text-green-700 dark:text-green-400">
+              <CheckCircle className="w-5 h-5 flex-shrink-0" />
+              <span className="text-sm">Trigger created successfully!</span>
+            </div>
+          )}
+          {submitStatus === 'error' && (
+            <div className="flex items-center gap-2 p-3 bg-red-50 dark:bg-red-900/20 rounded-lg text-red-700 dark:text-red-400">
+              <AlertCircle className="w-5 h-5 flex-shrink-0" />
+              <span className="text-sm">{errorMessage}</span>
+            </div>
+          )}
+        </form>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <button
+            type="button"
+            onClick={onClose}
+            disabled={isSubmitting}
+            className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors disabled:opacity-50"
+          >
+            Cancel
+          </button>
+          <button
+            type="submit"
+            onClick={handleSubmit}
+            disabled={isSubmitting || submitStatus === 'success'}
+            className="px-4 py-2 text-sm text-white bg-amber-600 rounded-lg hover:bg-amber-700 transition-colors disabled:opacity-50 flex items-center gap-2"
+          >
+            {isSubmitting ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                Creating...
+              </>
+            ) : (
+              <>
+                <Zap className="w-4 h-4" />
+                Create Trigger
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default CreateTriggerModal;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/DetailDrawer.tsx.html b/desktop/coverage/src/components/DetailDrawer.tsx.html new file mode 100644 index 0000000..b0c8460 --- /dev/null +++ b/desktop/coverage/src/components/DetailDrawer.tsx.html @@ -0,0 +1,253 @@ + + + + + + Code coverage report for src/components/DetailDrawer.tsx + + + + + + + + + +
+
+

All files / src/components DetailDrawer.tsx

+
+ +
+ 0% + Statements + 0/36 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ReactNode } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { X } from 'lucide-react';
+ 
+interface DetailDrawerProps {
+  open: boolean;
+  onClose: () => void;
+  title?: string;
+  children: ReactNode;
+}
+ 
+export function DetailDrawer({ open, onClose, title = '详情', children }: DetailDrawerProps) {
+  return (
+    <AnimatePresence>
+      {open && (
+        <>
+          {/* 遮罩层 */}
+          <motion.div
+            initial={{ opacity: 0 }}
+            animate={{ opacity: 1 }}
+            exit={{ opacity: 0 }}
+            transition={{ duration: 0.2 }}
+            className="fixed inset-0 bg-black/20 dark:bg-black/40 z-40"
+            onClick={onClose}
+          />
+ 
+          {/* 抽屉面板 */}
+          <motion.aside
+            initial={{ x: '100%' }}
+            animate={{ x: 0 }}
+            exit={{ x: '100%' }}
+            transition={{ type: 'spring', damping: 25, stiffness: 300 }}
+            className="fixed right-0 top-0 bottom-0 w-[400px] bg-white dark:bg-gray-900 border-l border-gray-200 dark:border-gray-700 z-50 flex flex-col shadow-xl"
+          >
+            {/* 抽屉头部 */}
+            <header className="h-14 border-b border-gray-200 dark:border-gray-700 flex items-center px-4 flex-shrink-0">
+              <span className="font-medium text-gray-900 dark:text-gray-100">{title}</span>
+              <button
+                onClick={onClose}
+                className="ml-auto p-1.5 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg text-gray-500 dark:text-gray-400 transition-colors"
+                aria-label="关闭"
+              >
+                <X className="w-5 h-5" />
+              </button>
+            </header>
+ 
+            {/* 抽屉内容 */}
+            <div className="flex-1 overflow-y-auto">
+              {children}
+            </div>
+          </motion.aside>
+        </>
+      )}
+    </AnimatePresence>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/DevQALoop.tsx.html b/desktop/coverage/src/components/DevQALoop.tsx.html new file mode 100644 index 0000000..c1b7302 --- /dev/null +++ b/desktop/coverage/src/components/DevQALoop.tsx.html @@ -0,0 +1,1477 @@ + + + + + + Code coverage report for src/components/DevQALoop.tsx + + + + + + + + + +
+
+

All files / src/components DevQALoop.tsx

+
+ +
+ 0% + Statements + 0/355 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/355 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * DevQALoop - Developer ↔ QA Review Loop Interface
+ *
+ * Visualizes the iterative review cycle between Developer and QA agents,
+ * showing iteration count, feedback history, and current state.
+ *
+ * @module components/DevQALoop
+ */
+ 
+import { useState } from 'react';
+import { useTeamStore } from '../store/teamStore';
+import type { DevQALoop as DevQALoopType, ReviewFeedback, ReviewIssue } from '../types/team';
+import {
+  RefreshCw, CheckCircle, XCircle, AlertTriangle,
+  Clock, MessageSquare, FileCode, Bug, Lightbulb, ChevronDown, ChevronUp,
+  Send, ThumbsUp, ThumbsDown, AlertOctagon,
+} from 'lucide-react';
+ 
+// === Sub-Components ===
+ 
+interface FeedbackItemProps {
+  feedback: ReviewFeedback;
+  iteration: number;
+  isExpanded: boolean;
+  onToggle: () => void;
+}
+ 
+function FeedbackItem({ feedback, iteration, isExpanded, onToggle }: FeedbackItemProps) {
+  const verdictColors = {
+    approved: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300',
+    needs_work: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300',
+    rejected: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300',
+  };
+ 
+  const verdictIcons = {
+    approved: <ThumbsUp className="w-4 h-4" />,
+    needs_work: <AlertTriangle className="w-4 h-4" />,
+    rejected: <ThumbsDown className="w-4 h-4" />,
+  };
+ 
+  const severityColors = {
+    critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300',
+    major: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300',
+    minor: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300',
+    suggestion: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300',
+  };
+ 
+  return (
+    <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden">
+      <button
+        onClick={onToggle}
+        className="w-full px-4 py-3 flex items-center justify-between bg-gray-50 dark:bg-gray-800"
+      >
+        <div className="flex items-center gap-3">
+          <span className="w-6 h-6 rounded-full bg-gray-200 dark:bg-gray-700 flex items-center justify-center text-xs font-medium">
+            {iteration}
+          </span>
+          <span className={`px-2 py-0.5 rounded text-xs font-medium flex items-center gap-1 ${verdictColors[feedback.verdict]}`}>
+            {verdictIcons[feedback.verdict]}
+            {feedback.verdict.replace('_', ' ')}
+          </span>
+          <span className="text-xs text-gray-500 dark:text-gray-400">
+            {new Date(feedback.reviewedAt).toLocaleString()}
+          </span>
+        </div>
+        {isExpanded ? <ChevronUp className="w-4 h-4" /> : <ChevronDown className="w-4 h-4" />}
+      </button>
+ 
+      {isExpanded && (
+        <div className="p-4 space-y-4">
+          {/* Comments */}
+          {feedback.comments.length > 0 && (
+            <div>
+              <h5 className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Comments</h5>
+              <ul className="space-y-2">
+                {feedback.comments.map((comment, idx) => (
+                  <li key={idx} className="text-sm text-gray-600 dark:text-gray-400 flex items-start gap-2">
+                    <MessageSquare className="w-4 h-4 mt-0.5 text-gray-400" />
+                    {comment}
+                  </li>
+                ))}
+              </ul>
+            </div>
+          )}
+ 
+          {/* Issues */}
+          {feedback.issues.length > 0 && (
+            <div>
+              <h5 className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Issues ({feedback.issues.length})</h5>
+              <div className="space-y-2">
+                {feedback.issues.map((issue, idx) => (
+                  <div key={idx} className="p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
+                    <div className="flex items-center gap-2 mb-1">
+                      <span className={`px-1.5 py-0.5 rounded text-xs font-medium ${severityColors[issue.severity]}`}>
+                        {issue.severity}
+                      </span>
+                      {issue.file && (
+                        <span className="text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+                          <FileCode className="w-3 h-3" />
+                          {issue.file}{issue.line ? `:${issue.line}` : ''}
+                        </span>
+                      )}
+                    </div>
+                    <p className="text-sm text-gray-700 dark:text-gray-300">{issue.description}</p>
+                    {issue.suggestion && (
+                      <p className="mt-1 text-xs text-blue-600 dark:text-blue-400 flex items-start gap-1">
+                        <Lightbulb className="w-3 h-3 mt-0.5" />
+                        {issue.suggestion}
+                      </p>
+                    )}
+                  </div>
+                ))}
+              </div>
+            </div>
+          )}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+interface ReviewFormProps {
+  loopId: string;
+  teamId: string;
+  onSubmit: (feedback: Omit<ReviewFeedback, 'reviewedAt' | 'reviewerId'>) => void;
+  onCancel: () => void;
+}
+ 
+function ReviewForm({ loopId: _loopId, teamId: _teamId, onSubmit, onCancel }: ReviewFormProps) {
+  const [verdict, setVerdict] = useState<ReviewFeedback['verdict']>('needs_work');
+  const [comment, setComment] = useState('');
+  const [issues, setIssues] = useState<ReviewIssue[]>([]);
+  const [newIssue, setNewIssue] = useState<Partial<ReviewIssue>>({});
+ 
+  const handleAddIssue = () => {
+    if (!newIssue.description) return;
+    setIssues([...issues, {
+      severity: newIssue.severity || 'minor',
+      description: newIssue.description,
+      file: newIssue.file,
+      line: newIssue.line,
+      suggestion: newIssue.suggestion,
+    } as ReviewIssue]);
+    setNewIssue({});
+  };
+ 
+  const handleSubmit = () => {
+    onSubmit({
+      verdict,
+      comments: comment ? [comment] : [],
+      issues,
+    });
+  };
+ 
+  return (
+    <div className="p-4 bg-gray-50 dark:bg-gray-800 rounded-lg space-y-4">
+      <h4 className="font-medium text-gray-900 dark:text-white">Submit Review</h4>
+ 
+      {/* Verdict */}
+      <div>
+        <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Verdict</label>
+        <div className="flex gap-2">
+          {(['approved', 'needs_work', 'rejected'] as const).map(v => (
+            <button
+              key={v}
+              onClick={() => setVerdict(v)}
+              className={`px-3 py-1.5 rounded-lg text-sm font-medium ${
+                verdict === v
+                  ? v === 'approved'
+                    ? 'bg-green-500 text-white'
+                    : v === 'needs_work'
+                    ? 'bg-yellow-500 text-white'
+                    : 'bg-red-500 text-white'
+                  : 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300'
+              }`}
+            >
+              {v.replace('_', ' ')}
+            </button>
+          ))}
+        </div>
+      </div>
+ 
+      {/* Comment */}
+      <div>
+        <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Comment</label>
+        <textarea
+          value={comment}
+          onChange={(e) => setComment(e.target.value)}
+          placeholder="Overall feedback..."
+          className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white"
+          rows={3}
+        />
+      </div>
+ 
+      {/* Add Issue */}
+      <div>
+        <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Add Issue</label>
+        <div className="grid grid-cols-2 gap-2">
+          <select
+            value={newIssue.severity || 'minor'}
+            onChange={(e) => setNewIssue({ ...newIssue, severity: e.target.value as ReviewIssue['severity'] })}
+            className="px-2 py-1.5 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white text-sm"
+          >
+            <option value="critical">Critical</option>
+            <option value="major">Major</option>
+            <option value="minor">Minor</option>
+            <option value="suggestion">Suggestion</option>
+          </select>
+          <input
+            type="text"
+            value={newIssue.file || ''}
+            onChange={(e) => setNewIssue({ ...newIssue, file: e.target.value })}
+            placeholder="File path"
+            className="px-2 py-1.5 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white text-sm"
+          />
+          <input
+            type="number"
+            value={newIssue.line || ''}
+            onChange={(e) => setNewIssue({ ...newIssue, line: parseInt(e.target.value) || undefined })}
+            placeholder="Line"
+            className="px-2 py-1.5 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white text-sm"
+          />
+          <input
+            type="text"
+            value={newIssue.description || ''}
+            onChange={(e) => setNewIssue({ ...newIssue, description: e.target.value })}
+            placeholder="Issue description"
+            className="px-2 py-1.5 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white text-sm"
+          />
+        </div>
+        <input
+          type="text"
+          value={newIssue.suggestion || ''}
+          onChange={(e) => setNewIssue({ ...newIssue, suggestion: e.target.value })}
+          placeholder="Suggested fix (optional)"
+          className="w-full mt-2 px-2 py-1.5 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white text-sm"
+        />
+        <button
+          onClick={handleAddIssue}
+          disabled={!newIssue.description}
+          className="mt-2 px-3 py-1.5 text-sm bg-gray-200 dark:bg-gray-700 rounded hover:bg-gray-300 dark:hover:bg-gray-600 disabled:opacity-50"
+        >
+          Add Issue
+        </button>
+      </div>
+ 
+      {/* Issues List */}
+      {issues.length > 0 && (
+        <div className="space-y-1">
+          {issues.map((issue, idx) => (
+            <div key={idx} className="flex items-center gap-2 text-sm p-2 bg-white dark:bg-gray-900 rounded">
+              <span className="px-1.5 py-0.5 rounded text-xs bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300">
+                {issue.severity}
+              </span>
+              <span className="flex-1 truncate">{issue.description}</span>
+              <button
+                onClick={() => setIssues(issues.filter((_, i) => i !== idx))}
+                className="text-gray-400 hover:text-red-500"
+              >
+                <XCircle className="w-4 h-4" />
+              </button>
+            </div>
+          ))}
+        </div>
+      )}
+ 
+      {/* Actions */}
+      <div className="flex gap-2">
+        <button
+          onClick={handleSubmit}
+          className="flex-1 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 flex items-center justify-center gap-2"
+        >
+          <Send className="w-4 h-4" />
+          Submit Review
+        </button>
+        <button
+          onClick={onCancel}
+          className="px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700"
+        >
+          Cancel
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+interface DevQALoopPanelProps {
+  loop: DevQALoopType;
+  teamId: string;
+  developerName: string;
+  reviewerName: string;
+  taskTitle: string;
+}
+ 
+export function DevQALoopPanel({ loop, teamId, developerName, reviewerName, taskTitle }: DevQALoopPanelProps) {
+  const [expandedFeedback, setExpandedFeedback] = useState<number | null>(null);
+  const [showReviewForm, setShowReviewForm] = useState(false);
+ 
+  const { submitReview, updateLoopState } = useTeamStore();
+ 
+  const stateConfig = {
+    idle: { color: 'gray', icon: <Clock className="w-5 h-5" />, label: 'Idle' },
+    developing: { color: 'blue', icon: <FileCode className="w-5 h-5" />, label: 'Developing' },
+    reviewing: { color: 'yellow', icon: <RefreshCw className="w-5 h-5" />, label: 'Reviewing' },
+    revising: { color: 'orange', icon: <Bug className="w-5 h-5" />, label: 'Revising' },
+    approved: { color: 'green', icon: <CheckCircle className="w-5 h-5" />, label: 'Approved' },
+    escalated: { color: 'red', icon: <AlertOctagon className="w-5 h-5" />, label: 'Escalated' },
+  };
+ 
+  const config = stateConfig[loop.state];
+ 
+  const handleSubmitReview = async (feedback: Omit<ReviewFeedback, 'reviewedAt' | 'reviewerId'>) => {
+    await submitReview(teamId, loop.id, feedback);
+    setShowReviewForm(false);
+  };
+ 
+  const handleCompleteRevision = async () => {
+    await updateLoopState(teamId, loop.id, 'reviewing');
+  };
+ 
+  return (
+    <div className="bg-white dark:bg-gray-900 rounded-xl border border-gray-200 dark:border-gray-700 overflow-hidden">
+      {/* Header */}
+      <div className={`px-4 py-3 bg-${config.color}-50 dark:bg-${config.color}-900/20 border-b border-${config.color}-200 dark:border-${config.color}-800`}>
+        <div className="flex items-center justify-between">
+          <div className="flex items-center gap-3">
+            <div className={`text-${config.color}-500`}>{config.icon}</div>
+            <div>
+              <h3 className="font-semibold text-gray-900 dark:text-white">Dev↔QA Loop</h3>
+              <p className="text-sm text-gray-500 dark:text-gray-400">{taskTitle}</p>
+            </div>
+          </div>
+          <div className="flex items-center gap-2">
+            <span className={`px-2 py-1 rounded text-xs font-medium bg-${config.color}-100 text-${config.color}-700 dark:bg-${config.color}-900/30 dark:text-${config.color}-300`}>
+              {config.label}
+            </span>
+            <span className="text-sm text-gray-500 dark:text-gray-400">
+              Iteration {loop.iterationCount + 1}/{loop.maxIterations}
+            </span>
+          </div>
+        </div>
+      </div>
+ 
+      {/* Flow Visualization */}
+      <div className="px-4 py-3 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center justify-between">
+          <div className="flex items-center gap-2">
+            <div className={`w-8 h-8 rounded-full flex items-center justify-center ${
+              ['developing', 'revising'].includes(loop.state) ? 'bg-blue-500 text-white' : 'bg-gray-200 dark:bg-gray-700'
+            }`}>
+              <FileCode className="w-4 h-4" />
+            </div>
+            <div className="text-sm">
+              <div className="font-medium text-gray-900 dark:text-white">{developerName}</div>
+              <div className="text-xs text-gray-500">Developer</div>
+            </div>
+          </div>
+ 
+          <div className="flex-1 mx-4 flex items-center">
+            <div className="flex-1 h-0.5 bg-gray-200 dark:bg-gray-700" />
+            <RefreshCw className={`w-5 h-5 mx-2 ${loop.state === 'reviewing' ? 'text-yellow-500 animate-spin' : 'text-gray-400'}`} />
+            <div className="flex-1 h-0.5 bg-gray-200 dark:bg-gray-700" />
+          </div>
+ 
+          <div className="flex items-center gap-2">
+            <div className="text-sm text-right">
+              <div className="font-medium text-gray-900 dark:text-white">{reviewerName}</div>
+              <div className="text-xs text-gray-500">QA Reviewer</div>
+            </div>
+            <div className={`w-8 h-8 rounded-full flex items-center justify-center ${
+              loop.state === 'reviewing' ? 'bg-yellow-500 text-white' : 'bg-gray-200 dark:bg-gray-700'
+            }`}>
+              <Bug className="w-4 h-4" />
+            </div>
+          </div>
+        </div>
+      </div>
+ 
+      {/* Progress Bar */}
+      <div className="px-4 py-2 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-1">
+          {Array.from({ length: loop.maxIterations }).map((_, i) => (
+            <div
+              key={i}
+              className={`flex-1 h-2 rounded ${
+                i < loop.iterationCount
+                  ? 'bg-yellow-400'
+                  : i === loop.iterationCount && ['developing', 'reviewing', 'revising'].includes(loop.state)
+                  ? 'bg-blue-400'
+                  : 'bg-gray-200 dark:bg-gray-700'
+              }`}
+            />
+          ))}
+        </div>
+      </div>
+ 
+      {/* Feedback History */}
+      <div className="p-4 space-y-3 max-h-64 overflow-y-auto">
+        <h4 className="text-sm font-medium text-gray-700 dark:text-gray-300">Feedback History</h4>
+        {loop.feedbackHistory.length === 0 ? (
+          <div className="text-sm text-gray-500 dark:text-gray-400 text-center py-4">
+            No feedback yet. First review pending.
+          </div>
+        ) : (
+          loop.feedbackHistory.map((feedback, idx) => (
+            <FeedbackItem
+              key={idx}
+              feedback={feedback}
+              iteration={idx + 1}
+              isExpanded={expandedFeedback === idx}
+              onToggle={() => setExpandedFeedback(expandedFeedback === idx ? null : idx)}
+            />
+          ))
+        )}
+      </div>
+ 
+      {/* Actions */}
+      <div className="p-4 border-t border-gray-200 dark:border-gray-700">
+        {loop.state === 'escalated' ? (
+          <div className="p-3 bg-red-50 dark:bg-red-900/20 rounded-lg text-center">
+            <AlertOctagon className="w-6 h-6 mx-auto mb-2 text-red-500" />
+            <p className="text-sm text-red-700 dark:text-red-300">
+              Maximum iterations reached. Human intervention required.
+            </p>
+          </div>
+        ) : loop.state === 'approved' ? (
+          <div className="p-3 bg-green-50 dark:bg-green-900/20 rounded-lg text-center">
+            <CheckCircle className="w-6 h-6 mx-auto mb-2 text-green-500" />
+            <p className="text-sm text-green-700 dark:text-green-300">
+              Task approved and completed!
+            </p>
+          </div>
+        ) : loop.state === 'reviewing' && !showReviewForm ? (
+          <button
+            onClick={() => setShowReviewForm(true)}
+            className="w-full px-4 py-2 bg-yellow-500 text-white rounded-lg hover:bg-yellow-600 flex items-center justify-center gap-2"
+          >
+            <RefreshCw className="w-4 h-4" />
+            Submit Review
+          </button>
+        ) : loop.state === 'revising' ? (
+          <button
+            onClick={handleCompleteRevision}
+            className="w-full px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 flex items-center justify-center gap-2"
+          >
+            <CheckCircle className="w-4 h-4" />
+            Complete Revision
+          </button>
+        ) : showReviewForm ? (
+          <ReviewForm
+            loopId={loop.id}
+            teamId={teamId}
+            onSubmit={handleSubmitReview}
+            onCancel={() => setShowReviewForm(false)}
+          />
+        ) : null}
+      </div>
+    </div>
+  );
+}
+ 
+export default DevQALoopPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ErrorNotification.tsx.html b/desktop/coverage/src/components/ErrorNotification.tsx.html new file mode 100644 index 0000000..c3abd7c --- /dev/null +++ b/desktop/coverage/src/components/ErrorNotification.tsx.html @@ -0,0 +1,895 @@ + + + + + + Code coverage report for src/components/ErrorNotification.tsx + + + + + + + + + +
+
+

All files / src/components ErrorNotification.tsx

+
+ +
+ 0% + Statements + 0/177 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/177 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ErrorNotification Component
+ *
+ * Displays error notifications as toast-style messages.
+ * Integrates with the centralized error handling system.
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  X,
+  AlertCircle,
+  AlertTriangle,
+  Bug,
+  WifiOff,
+  ShieldAlert,
+  Clock,
+  ChevronDown,
+  ChevronUp,
+} from 'lucide-react';
+import {
+  getUndismissedErrors,
+  dismissError,
+  dismissAll,
+  type StoredError,
+} from '../lib/error-handling';
+import {
+  ErrorCategory,
+  ErrorSeverity,
+  formatErrorForToast,
+} from '../lib/error-types';
+ 
+interface ErrorNotificationProps {
+  /** Maximum number of visible notifications */
+  maxVisible?: number;
+  /** Position on screen */
+  position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
+  /** Auto dismiss timeout in ms (0 = no auto dismiss) */
+  autoDismissMs?: number;
+  /** Additional CSS classes */
+  className?: string;
+}
+ 
+const categoryIcons: Record<ErrorCategory, typeof AlertCircle> = {
+  network: WifiOff,
+  auth: ShieldAlert,
+  permission: ShieldAlert,
+  validation: AlertTriangle,
+  config: AlertTriangle,
+  server: Bug,
+  client: AlertCircle,
+  timeout: Clock,
+  system: Bug,
+};
+ 
+const severityColors: Record<ErrorSeverity, {
+  bg: string;
+  border: string;
+  text: string;
+  icon: string;
+}> = {
+  critical: {
+    bg: 'bg-red-50 dark:bg-red-900/20',
+    border: 'border-red-200 dark:border-red-800',
+    text: 'text-red-800 dark:text-red-200',
+    icon: 'text-red-500',
+  },
+  high: {
+    bg: 'bg-orange-50 dark:bg-orange-900/20',
+    border: 'border-orange-200 dark:border-orange-800',
+    text: 'text-orange-800 dark:text-orange-200',
+    icon: 'text-orange-500',
+  },
+  medium: {
+    bg: 'bg-yellow-50 dark:bg-yellow-900/20',
+    border: 'border-yellow-200 dark:border-yellow-800',
+    text: 'text-yellow-800 dark:text-yellow-200',
+    icon: 'text-yellow-500',
+  },
+  low: {
+    bg: 'bg-blue-50 dark:bg-blue-900/20',
+    border: 'border-blue-200 dark:border-blue-800',
+    text: 'text-blue-800 dark:text-blue-200',
+    icon: 'text-blue-500',
+  },
+};
+ 
+function ErrorItem({
+  error,
+  onDismiss,
+  autoDismissMs,
+}: {
+  error: StoredError;
+  onDismiss: (id: string) => void;
+  autoDismissMs: number;
+}) {
+  const [expanded, setExpanded] = useState(false);
+  const Icon = categoryIcons[error.category] || AlertCircle;
+  const colors = severityColors[error.severity] || severityColors.medium;
+  const { title, message } = formatErrorForToast(error);
+ 
+  // Auto dismiss
+  useEffect(() => {
+    if (autoDismissMs > 0 && error.severity !== 'critical') {
+      const timer = setTimeout(() => {
+        onDismiss(error.id);
+      }, autoDismissMs);
+      return () => clearTimeout(timer);
+    }
+  }, [autoDismissMs, error.id, error.severity, onDismiss]);
+ 
+  const hasDetails = error.stack || error.context;
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, x: 300, scale: 0.9 }}
+      animate={{ opacity: 1, x: 0, scale: 1 }}
+      exit={{ opacity: 0, x: 300, scale: 0.9 }}
+      className={`
+        ${colors.bg} ${colors.border} ${colors.text}
+        border rounded-lg shadow-lg p-4 min-w-[320px] max-w-[420px]
+      `}
+    >
+      <div className="flex items-start gap-3">
+        <Icon className={`w-5 h-5 mt-0.5 flex-shrink-0 ${colors.icon}`} />
+        <div className="flex-1 min-w-0">
+          <div className="flex items-start justify-between gap-2">
+            <h4 className="font-medium text-sm">{title}</h4>
+            <button
+              onClick={() => onDismiss(error.id)}
+              className="p-1 rounded hover:bg-black/10 dark:hover:bg-white/10 flex-shrink-0"
+            >
+              <X className="w-4 h-4" />
+            </button>
+          </div>
+          <p className="text-sm mt-1 opacity-90">{message}</p>
+ 
+          {hasDetails && (
+            <button
+              onClick={() => setExpanded(!expanded)}
+              className="flex items-center gap-1 text-xs mt-2 opacity-70 hover:opacity-100"
+            >
+              {expanded ? (
+                <>
+                  <ChevronUp className="w-3 h-3" />
+                  隐藏详情
+                </>
+              ) : (
+                <>
+                  <ChevronDown className="w-3 h-3" />
+                  显示详情
+                </>
+              )}
+            </button>
+          )}
+ 
+          {expanded && hasDetails && (
+            <motion.div
+              initial={{ height: 0, opacity: 0 }}
+              animate={{ height: 'auto', opacity: 1 }}
+              exit={{ height: 0, opacity: 0 }}
+              className="mt-2 p-2 bg-black/5 dark:bg-white/5 rounded text-xs font-mono overflow-auto max-h-32"
+            >
+              {error.context && (
+                <div className="mb-1">
+                  <span className="opacity-70">Context: </span>
+                  {JSON.stringify(error.context, null, 2)}
+                </div>
+              )}
+              {error.stack && (
+                <pre className="whitespace-pre-wrap opacity-70">{error.stack}</pre>
+              )}
+            </motion.div>
+          )}
+ 
+          <div className="flex items-center gap-2 mt-2 text-xs opacity-60">
+            <span>{error.category}</span>
+            <span>•</span>
+            <span>{new Date(error.timestamp).toLocaleTimeString()}</span>
+          </div>
+        </div>
+      </div>
+    </motion.div>
+  );
+}
+ 
+export function ErrorNotification({
+  maxVisible = 3,
+  position = 'top-right',
+  autoDismissMs = 10000,
+  className = '',
+}: ErrorNotificationProps) {
+  const [errors, setErrors] = useState<StoredError[]>([]);
+ 
+  // Poll for new errors
+  useEffect(() => {
+    const updateErrors = () => {
+      setErrors(getUndismissedErrors().slice(0, maxVisible));
+    };
+ 
+    updateErrors();
+    const interval = setInterval(updateErrors, 1000);
+    return () => clearInterval(interval);
+  }, [maxVisible]);
+ 
+  const handleDismiss = useCallback((id: string) => {
+    dismissError(id);
+    setErrors(prev => prev.filter(e => e.id !== id));
+  }, []);
+ 
+  const handleDismissAll = useCallback(() => {
+    dismissAll();
+    setErrors([]);
+  }, []);
+ 
+  const positionClasses: Record<string, string> = {
+    'top-right': 'top-4 right-4',
+    'top-left': 'top-4 left-4',
+    'bottom-right': 'bottom-4 right-4',
+    'bottom-left': 'bottom-4 left-4',
+  };
+ 
+  if (errors.length === 0) return null;
+ 
+  return (
+    <div
+      className={`fixed ${positionClasses[position]} z-50 flex flex-col gap-2 ${className}`}
+    >
+      <AnimatePresence mode="popLayout">
+        {errors.map(error => (
+          <ErrorItem
+            key={error.id}
+            error={error}
+            onDismiss={handleDismiss}
+            autoDismissMs={autoDismissMs}
+          />
+        ))}
+      </AnimatePresence>
+ 
+      {errors.length > 1 && (
+        <motion.button
+          initial={{ opacity: 0 }}
+          animate={{ opacity: 1 }}
+          onClick={handleDismissAll}
+          className="text-xs text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 text-center py-1"
+        >
+          清除全部 ({errors.length})
+        </motion.button>
+      )}
+    </div>
+  );
+}
+ 
+/**
+ * ErrorNotificationProvider - Include at app root
+ */
+export function ErrorNotificationProvider({
+  children,
+}: {
+  children: React.ReactNode;
+}) {
+  return (
+    <>
+      {children}
+      <ErrorNotification />
+    </>
+  );
+}
+ 
+export default ErrorNotification;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Feedback/FeedbackButton.tsx.html b/desktop/coverage/src/components/Feedback/FeedbackButton.tsx.html new file mode 100644 index 0000000..683dcc2 --- /dev/null +++ b/desktop/coverage/src/components/Feedback/FeedbackButton.tsx.html @@ -0,0 +1,205 @@ + + + + + + Code coverage report for src/components/Feedback/FeedbackButton.tsx + + + + + + + + + +
+
+

All files / src/components/Feedback FeedbackButton.tsx

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { MessageCircle } from 'lucide-react';
+import { motion } from 'framer-motion';
+import { useFeedbackStore } from './feedbackStore';
+import { Button } from '../ui';
+ 
+interface FeedbackButtonProps {
+  onClick: () => void;
+  showCount?: boolean;
+}
+ 
+export function FeedbackButton({ onClick, showCount = true }: FeedbackButtonProps) {
+  const feedbackItems = useFeedbackStore((state) => state.feedbackItems);
+  const pendingCount = feedbackItems.filter((f) => f.status === 'pending' || f.status === 'submitted').length;
+ 
+  return (
+    <motion.div
+      whileHover={{ scale: 1.02 }}
+      whileTap={{ scale: 0.98 }}
+    >
+      <Button
+        variant="ghost"
+        size="sm"
+        onClick={onClick}
+        className="relative flex items-center gap-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100"
+      >
+        <MessageCircle className="w-4 h-4" />
+        <span className="text-sm">Feedback</span>
+        {showCount && pendingCount > 0 && (
+          <motion.span
+            initial={{ scale: 0 }}
+            animate={{ scale: 1 }}
+            className="absolute -top-1 -right-1 w-4 h-4 bg-orange-500 text-white text-[10px] rounded-full flex items-center justify-center"
+          >
+            {pendingCount > 9 ? '9+' : pendingCount}
+          </motion.span>
+        )}
+      </Button>
+    </motion.div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Feedback/FeedbackHistory.tsx.html b/desktop/coverage/src/components/Feedback/FeedbackHistory.tsx.html new file mode 100644 index 0000000..c9b8878 --- /dev/null +++ b/desktop/coverage/src/components/Feedback/FeedbackHistory.tsx.html @@ -0,0 +1,667 @@ + + + + + + Code coverage report for src/components/Feedback/FeedbackHistory.tsx + + + + + + + + + +
+
+

All files / src/components/Feedback FeedbackHistory.tsx

+
+ +
+ 0% + Statements + 0/154 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/154 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState } from 'react';
+import { format } from 'date-fns';
+import { motion, AnimatePresence } from 'framer-motion';
+import { Clock, CheckCircle, AlertCircle, Hourglass, Trash2, ChevronDown, ChevronUp } from 'lucide-react';
+import { useFeedbackStore, type FeedbackSubmission, type FeedbackStatus } from './feedbackStore';
+import { Button, Badge } from '../ui';
+ 
+const statusConfig: Record<FeedbackStatus, { label: string; color: string; icon: React.ReactNode }> = {
+  pending: { label: 'Pending', color: 'text-gray-500', icon: <Clock className="w-4 h-4" /> },
+  submitted: { label: 'Submitted', color: 'text-blue-500', icon: <CheckCircle className="w-4 h-4" /> },
+  acknowledged: { label: 'Acknowledged', color: 'text-purple-500', icon: <CheckCircle className="w-4 h-4" /> },
+  in_progress: { label: 'In Progress', color: 'text-yellow-500', icon: <Hourglass className="w-4 h-4" /> },
+  resolved: { label: 'Resolved', color: 'text-green-500', icon: <CheckCircle className="w-4 h-4" /> },
+};
+ 
+const typeLabels: Record<string, string> = {
+  bug: 'Bug Report',
+  feature: 'Feature Request',
+  general: 'General Feedback',
+};
+const priorityLabels: Record<string, string> = {
+  low: 'Low',
+  medium: 'Medium',
+  high: 'High',
+};
+ 
+interface FeedbackHistoryProps {
+  onViewDetails?: (feedback: FeedbackSubmission) => void;
+}
+ 
+export function FeedbackHistory({ onViewDetails: _onViewDetails }: FeedbackHistoryProps) {
+  const { feedbackItems, deleteFeedback, updateFeedbackStatus } = useFeedbackStore();
+  const [expandedId, setExpandedId] = useState<string | null>(null);
+ 
+  const formatDate = (timestamp: number) => {
+    return format(new Date(timestamp), 'yyyy-MM-dd HH:mm');
+  };
+ 
+  const handleDelete = (id: string) => {
+    if (confirm('Are you sure you want to delete this feedback?')) {
+      deleteFeedback(id);
+    }
+  };
+ 
+  const handleStatusChange = (id: string, newStatus: FeedbackStatus) => {
+    updateFeedbackStatus(id, newStatus);
+  };
+ 
+  if (feedbackItems.length === 0) {
+    return (
+      <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+        <p>No feedback submissions yet.</p>
+        <p className="text-sm mt-1">Click the feedback button to submit your first feedback.</p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-3">
+      {feedbackItems.map((feedback) => {
+        const isExpanded = expandedId === feedback.id;
+        const statusInfo = statusConfig[feedback.status];
+ 
+        return (
+          <motion.div
+            key={feedback.id}
+            initial={{ opacity: 0, y: -10 }}
+            animate={{ opacity: 1, y: 0 }}
+            exit={{ opacity: 0, y: -10 }}
+            className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden"
+          >
+            {/* Header */}
+            <div
+              className="flex items-center justify-between px-4 py-3 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700/50"
+              onClick={() => setExpandedId(isExpanded ? null : feedback.id)}
+            >
+              <div className="flex items-center gap-3">
+                <div className="flex-shrink-0">
+                  {feedback.type === 'bug' && <span className="text-red-500"><AlertCircle className="w-4 h-4" /></span>}
+                  {feedback.type === 'feature' && <span className="text-yellow-500"><ChevronUp className="w-4 h-4" /></span>}
+                  {feedback.type === 'general' && <span className="text-blue-500"><CheckCircle className="w-4 h-4" /></span>}
+                </div>
+                <div className="min-w-0 flex-1">
+                  <h4 className="text-sm font-medium text-gray-900 dark:text-gray-100 truncate">
+                    {feedback.title}
+                  </h4>
+                  <p className="text-xs text-gray-500 dark:text-gray-400">
+                    {typeLabels[feedback.type]} - {formatDate(feedback.createdAt)}
+                  </p>
+                </div>
+                <Badge variant={feedback.priority === 'high' ? 'error' : feedback.priority === 'medium' ? 'warning' : 'default'}>
+                  {priorityLabels[feedback.priority]}
+                </Badge>
+              </div>
+              <div className="flex items-center gap-2">
+                <button
+                  onClick={(e) => {
+                    e.stopPropagation();
+                    setExpandedId(isExpanded ? null : feedback.id);
+                  }}
+                  className="text-gray-400 hover:text-gray-600 p-1"
+                >
+                  {isExpanded ? <ChevronUp className="w-4 h-4" /> : <ChevronDown className="w-4 h-4" />}
+                </button>
+              </div>
+            </div>
+ 
+            {/* Expandable Content */}
+            <AnimatePresence>
+              {isExpanded && (
+                <motion.div
+                  initial={{ height: 0, opacity: 0 }}
+                  animate={{ height: 'auto', opacity: 1 }}
+                  exit={{ height: 0, opacity: 0 }}
+                  className="px-4 pb-3 border-t border-gray-100 dark:border-gray-700"
+                >
+                  <div className="space-y-3">
+                    {/* Description */}
+                    <div>
+                      <h5 className="text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">Description</h5>
+                      <p className="text-sm text-gray-700 dark:text-gray-300 whitespace-pre-wrap">
+                        {feedback.description}
+                      </p>
+                    </div>
+ 
+                    {/* Attachments */}
+                    {feedback.attachments.length > 0 && (
+                      <div>
+                        <h5 className="text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">
+                          Attachments ({feedback.attachments.length})
+                        </h5>
+                        <div className="flex flex-wrap gap-2 mt-1">
+                          {feedback.attachments.map((att, idx) => (
+                            <span
+                              key={idx}
+                              className="text-xs bg-gray-100 dark:bg-gray-700 px-2 py-1 rounded"
+                            >
+                              {att.name}
+                            </span>
+                          ))}
+                        </div>
+                      </div>
+                    )}
+ 
+                    {/* Metadata */}
+                    <div>
+                      <h5 className="text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">System Info</h5>
+                      <div className="text-xs text-gray-500 dark:text-gray-400 space-y-1">
+                        <p>App Version: {feedback.metadata.appVersion}</p>
+                        <p>OS: {feedback.metadata.os}</p>
+                        <p>Submitted: {formatDate(feedback.createdAt)}</p>
+                      </div>
+                    </div>
+ 
+                    {/* Status and Actions */}
+                    <div className="flex items-center justify-between pt-2 border-t border-gray-100 dark:border-gray-700">
+                      <div className="flex items-center gap-2">
+                        <span className={`flex items-center gap-1 text-xs ${statusInfo.color}`}>
+                          {statusInfo.icon}
+                          {statusInfo.label}
+                        </span>
+                      </div>
+                      <div className="flex items-center gap-2">
+                        <select
+                          value={feedback.status}
+                          onChange={(e) => handleStatusChange(feedback.id, e.target.value as FeedbackStatus)}
+                          className="text-xs border border-gray-200 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800"
+                        >
+                          <option value="pending">Pending</option>
+                          <option value="submitted">Submitted</option>
+                          <option value="acknowledged">Acknowledged</option>
+                          <option value="in_progress">In Progress</option>
+                          <option value="resolved">Resolved</option>
+                        </select>
+                        <Button
+                          variant="ghost"
+                          size="sm"
+                          onClick={() => handleDelete(feedback.id)}
+                          className="text-red-500 hover:text-red-600"
+                        >
+                          <Trash2 className="w-3.5 h-3.5" />
+                        </Button>
+                      </div>
+                    </div>
+                  </div>
+                </motion.div>
+              )}
+            </AnimatePresence>
+          </motion.div>
+        );
+      })}
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Feedback/FeedbackModal.tsx.html b/desktop/coverage/src/components/Feedback/FeedbackModal.tsx.html new file mode 100644 index 0000000..5e9c5e3 --- /dev/null +++ b/desktop/coverage/src/components/Feedback/FeedbackModal.tsx.html @@ -0,0 +1,958 @@ + + + + + + Code coverage report for src/components/Feedback/FeedbackModal.tsx + + + + + + + + + +
+
+

All files / src/components/Feedback FeedbackModal.tsx

+
+ +
+ 0% + Statements + 0/229 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/229 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { X, Send, Bug, Lightbulb, MessageSquare, AlertCircle, Upload, Trash2 } from 'lucide-react';
+import { useFeedbackStore, type FeedbackType, type FeedbackPriority, type FeedbackAttachment } from './feedbackStore';
+import { Button } from '../ui';
+import { useToast } from '../ui/Toast';
+import { silentErrorHandler } from '../../lib/error-utils';
+ 
+interface FeedbackModalProps {
+  onClose: () => void;
+}
+ 
+const typeOptions: { value: FeedbackType; label: string; icon: React.ReactNode }[] = [
+  { value: 'bug', label: 'Bug Report', icon: <Bug className="w-4 h-4" /> },
+  { value: 'feature', label: 'Feature Request', icon: <Lightbulb className="w-4 h-4" /> },
+  { value: 'general', label: 'General Feedback', icon: <MessageSquare className="w-4 h-4" /> },
+];
+ 
+const priorityOptions: { value: FeedbackPriority; label: string; color: string }[] = [
+  { value: 'low', label: 'Low', color: 'text-gray-500' },
+  { value: 'medium', label: 'Medium', color: 'text-yellow-600' },
+  { value: 'high', label: 'High', color: 'text-red-500' },
+];
+ 
+export function FeedbackModal({ onClose }: FeedbackModalProps) {
+  const { submitFeedback, isLoading, error } = useFeedbackStore();
+  const { toast } = useToast();
+  const fileInputRef = useRef<HTMLInputElement>(null);
+ 
+  const [type, setType] = useState<FeedbackType>('bug');
+  const [title, setTitle] = useState('');
+  const [description, setDescription] = useState('');
+  const [priority, setPriority] = useState<FeedbackPriority>('medium');
+  const [attachments, setAttachments] = useState<File[]>([]);
+ 
+  const handleSubmit = async () => {
+    if (!title.trim() || !description.trim()) {
+      toast('Please fill in title and description', 'warning');
+      return;
+    }
+ 
+    // Convert files to base64 for storage
+    const processedAttachments: FeedbackAttachment[] = await Promise.all(
+      attachments.map(async (file) => {
+        return new Promise<FeedbackAttachment>((resolve) => {
+          const reader = new FileReader();
+          reader.onload = () => {
+            resolve({
+              name: file.name,
+              type: file.type,
+              size: file.size,
+              data: reader.result as string,
+            });
+          };
+          reader.readAsDataURL(file);
+        });
+      })
+    );
+ 
+    try {
+      await submitFeedback({
+        type,
+        title: title.trim(),
+        description: description.trim(),
+        priority,
+        attachments: processedAttachments,
+        metadata: {
+          appVersion: '0.0.0',
+          os: navigator.platform,
+          timestamp: Date.now(),
+        },
+      });
+ 
+      toast('Feedback submitted successfully!', 'success');
+      // Reset form
+      setTitle('');
+      setDescription('');
+      setAttachments([]);
+      setType('bug');
+      setPriority('medium');
+      onClose();
+    } catch (err) {
+      toast('Failed to submit feedback. Please try again.', 'error');
+    }
+  };
+ 
+  const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const files = Array.from(e.target.files || []);
+    // Limit to 5 attachments
+    const newFiles = [...attachments, ...files].slice(0, 5);
+    setAttachments(newFiles);
+  };
+ 
+  const removeAttachment = (index: number) => {
+    setAttachments(attachments.filter((_, i) => i !== index));
+  };
+ 
+  const formatFileSize = (bytes: number): string => {
+    if (bytes < 1024) return `${bytes} B`;
+    if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
+    return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
+  };
+ 
+  return (
+    <AnimatePresence>
+      <motion.div
+        initial={{ opacity: 0 }}
+        animate={{ opacity: 1 }}
+        exit={{ opacity: 0 }}
+        className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50"
+        onClick={(e) => {
+          if (e.target === e.currentTarget) onClose();
+        }}
+      >
+        <motion.div
+          initial={{ scale: 0.95, opacity: 0 }}
+          animate={{ scale: 1, opacity: 1 }}
+          exit={{ scale: 0.95, opacity: 0 }}
+          className="w-full max-w-lg bg-white dark:bg-gray-800 rounded-xl shadow-2xl overflow-hidden"
+          role="dialog"
+          aria-modal="true"
+          aria-labelledby="feedback-title"
+        >
+          {/* Header */}
+          <div className="flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700">
+            <h2 id="feedback-title" className="text-lg font-semibold text-gray-900 dark:text-gray-100">
+              Submit Feedback
+            </h2>
+            <button
+              onClick={onClose}
+              className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
+              aria-label="Close"
+            >
+              <X className="w-5 h-5" />
+            </button>
+          </div>
+ 
+          {/* Content */}
+          <div className="px-6 py-4 space-y-4">
+            {/* Type Selection */}
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                Feedback Type
+              </label>
+              <div className="flex gap-2">
+                {typeOptions.map((opt) => (
+                  <button
+                    key={opt.value}
+                    onClick={() => setType(opt.value)}
+                    className={`flex-1 flex items-center justify-center gap-2 px-3 py-2 rounded-lg border text-sm transition-all ${
+                      type === opt.value
+                        ? 'border-orange-400 bg-orange-50 dark:bg-orange-900/20 text-orange-600 dark:text-orange-400'
+                        : 'border-gray-200 dark:border-gray-600 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700'
+                    }`}
+                  >
+                    {opt.icon}
+                    {opt.label}
+                  </button>
+                ))}
+              </div>
+            </div>
+ 
+            {/* Title */}
+            <div>
+              <label htmlFor="feedback-title-input" className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                Title
+              </label>
+              <input
+                id="feedback-title-input"
+                type="text"
+                value={title}
+                onChange={(e) => setTitle(e.target.value)}
+                placeholder="Brief summary of your feedback"
+                className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-orange-400 dark:bg-gray-700 dark:text-gray-100"
+                maxLength={100}
+              />
+            </div>
+ 
+            {/* Description */}
+            <div>
+              <label htmlFor="feedback-desc-input" className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                Description
+              </label>
+              <textarea
+                id="feedback-desc-input"
+                value={description}
+                onChange={(e) => setDescription(e.target.value)}
+                placeholder="Please describe your feedback in detail. For bugs, include steps to reproduce."
+                className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-orange-400 dark:bg-gray-700 dark:text-gray-100 resize-none"
+                rows={4}
+                maxLength={2000}
+              />
+            </div>
+ 
+            {/* Priority */}
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                Priority
+              </label>
+              <div className="flex gap-2">
+                {priorityOptions.map((opt) => (
+                  <button
+                    key={opt.value}
+                    onClick={() => setPriority(opt.value)}
+                    className={`flex-1 px-3 py-2 rounded-lg border text-sm transition-all ${
+                      priority === opt.value
+                        ? 'border-orange-400 bg-orange-50 dark:bg-orange-900/20 font-medium'
+                        : 'border-gray-200 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700'
+                    } ${opt.color}`}
+                  >
+                    {opt.label}
+                  </button>
+                ))}
+              </div>
+            </div>
+ 
+            {/* Attachments */}
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                Attachments (optional, max 5)
+              </label>
+              <input
+                ref={fileInputRef}
+                type="file"
+                multiple
+                accept="image/*"
+                onChange={handleFileSelect}
+                className="hidden"
+              />
+              <button
+                onClick={() => fileInputRef.current?.click()}
+                className="flex items-center gap-2 px-3 py-2 border border-dashed border-gray-300 dark:border-gray-600 rounded-lg text-sm text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors"
+              >
+                <Upload className="w-4 h-4" />
+                Add Screenshots
+              </button>
+              {attachments.length > 0 && (
+                <div className="mt-2 space-y-1">
+                  {attachments.map((file, index) => (
+                    <div
+                      key={index}
+                      className="flex items-center justify-between px-2 py-1 bg-gray-50 dark:bg-gray-700 rounded text-xs"
+                    >
+                      <span className="truncate text-gray-600 dark:text-gray-300">
+                        {file.name} ({formatFileSize(file.size)})
+                      </span>
+                      <button
+                        onClick={() => removeAttachment(index)}
+                        className="text-gray-400 hover:text-red-500"
+                      >
+                        <Trash2 className="w-3.5 h-3.5" />
+                      </button>
+                    </div>
+                  ))}
+                </div>
+              )}
+            </div>
+ 
+            {/* Error Display */}
+            {error && (
+              <div className="flex items-center gap-2 text-sm text-red-500 bg-red-50 dark:bg-red-900/20 px-3 py-2 rounded-lg">
+                <AlertCircle className="w-4 h-4" />
+                {error}
+              </div>
+            )}
+          </div>
+ 
+          {/* Footer */}
+          <div className="flex justify-end gap-3 px-6 py-4 bg-gray-50 dark:bg-gray-700/50 border-t border-gray-200 dark:border-gray-700">
+            <Button
+              variant="outline"
+              onClick={onClose}
+              disabled={isLoading}
+            >
+              Cancel
+            </Button>
+            <Button
+              variant="primary"
+              onClick={() => { handleSubmit().catch(silentErrorHandler('FeedbackModal')); }}
+              loading={isLoading}
+              disabled={!title.trim() || !description.trim()}
+            >
+              <Send className="w-4 h-4 mr-2" />
+              Submit
+            </Button>
+          </div>
+        </motion.div>
+      </motion.div>
+    </AnimatePresence>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Feedback/feedbackStore.ts.html b/desktop/coverage/src/components/Feedback/feedbackStore.ts.html new file mode 100644 index 0000000..9dd6d45 --- /dev/null +++ b/desktop/coverage/src/components/Feedback/feedbackStore.ts.html @@ -0,0 +1,508 @@ + + + + + + Code coverage report for src/components/Feedback/feedbackStore.ts + + + + + + + + + +
+
+

All files / src/components/Feedback feedbackStore.ts

+
+ +
+ 0% + Statements + 0/75 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/75 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+ 
+// Types
+export type FeedbackType = 'bug' | 'feature' | 'general';
+export type FeedbackPriority = 'low' | 'medium' | 'high';
+export type FeedbackStatus = 'pending' | 'submitted' | 'acknowledged' | 'in_progress' | 'resolved';
+ 
+export interface FeedbackAttachment {
+  name: string;
+  type: string;
+  size: number;
+  data: string; // base64 encoded
+}
+ 
+export interface FeedbackSubmission {
+  id: string;
+  type: FeedbackType;
+  title: string;
+  description: string;
+  priority: FeedbackPriority;
+  status: FeedbackStatus;
+  attachments: FeedbackAttachment[];
+  metadata: {
+    appVersion: string;
+    os: string;
+    timestamp: number;
+    userAgent?: string;
+  };
+  createdAt: number;
+  updatedAt: number;
+}
+ 
+interface FeedbackState {
+  feedbackItems: FeedbackSubmission[];
+  isModalOpen: boolean;
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+interface FeedbackActions {
+  openModal: () => void;
+  closeModal: () => void;
+  submitFeedback: (feedback: Omit<FeedbackSubmission, 'id' | 'createdAt' | 'updatedAt' | 'status'>) => Promise<void>;
+  updateFeedbackStatus: (id: string, status: FeedbackStatus) => void;
+  deleteFeedback: (id: string) => void;
+  clearError: () => void;
+}
+ 
+export type FeedbackStore = FeedbackState & FeedbackActions;
+ 
+const STORAGE_KEY = 'zclaw-feedback-history';
+const MAX_FEEDBACK_ITEMS = 100;
+ 
+// Helper to get app metadata
+function getAppMetadata() {
+  return {
+    appVersion: '0.0.0',
+    os: typeof navigator !== 'undefined' ? navigator.platform : 'unknown',
+    timestamp: Date.now(),
+    userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,
+  };
+}
+ 
+// Generate unique ID
+function generateFeedbackId(): string {
+  return `fb-${Date.now()}-${Math.random().toString(36).slice(2)}`;
+}
+ 
+export const useFeedbackStore = create<FeedbackStore>()(
+  persist(
+    (set, get) => ({
+      feedbackItems: [],
+      isModalOpen: false,
+      isLoading: false,
+      error: null,
+ 
+      openModal: () => set({ isModalOpen: true }),
+      closeModal: () => set({ isModalOpen: false }),
+ 
+      submitFeedback: async (feedback): Promise<void> => {
+        const { feedbackItems } = get();
+        set({ isLoading: true, error: null });
+ 
+        try {
+          const newFeedback: FeedbackSubmission = {
+            ...feedback,
+            id: generateFeedbackId(),
+            createdAt: Date.now(),
+            updatedAt: Date.now(),
+            status: 'submitted',
+            metadata: {
+              ...feedback.metadata,
+              ...getAppMetadata(),
+            },
+          };
+ 
+          // Simulate async submission
+          await new Promise(resolve => setTimeout(resolve, 300));
+ 
+          // Keep only MAX_FEEDBACK_ITEMS
+          const updatedItems = [newFeedback, ...feedbackItems].slice(0, MAX_FEEDBACK_ITEMS);
+ 
+          set({
+            feedbackItems: updatedItems,
+            isLoading: false,
+            isModalOpen: false,
+          });
+        } catch (err) {
+          set({
+            isLoading: false,
+            error: err instanceof Error ? err.message : 'Failed to submit feedback',
+          });
+          throw err;
+        }
+      },
+ 
+      updateFeedbackStatus: (id, status) => {
+        const { feedbackItems } = get();
+        const updatedItems = feedbackItems.map(item =>
+          item.id === id
+            ? { ...item, status, updatedAt: Date.now() }
+            : item
+        );
+        set({ feedbackItems: updatedItems });
+      },
+ 
+      deleteFeedback: (id) => {
+        const { feedbackItems } = get();
+        set({
+          feedbackItems: feedbackItems.filter(item => item.id !== id),
+        });
+      },
+ 
+      clearError: () => set({ error: null }),
+    }),
+    {
+      name: STORAGE_KEY,
+    }
+  )
+);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Feedback/index.html b/desktop/coverage/src/components/Feedback/index.html new file mode 100644 index 0000000..9f99627 --- /dev/null +++ b/desktop/coverage/src/components/Feedback/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/components/Feedback + + + + + + + + + +
+
+

All files src/components/Feedback

+
+ +
+ 0% + Statements + 0/484 +
+ + +
+ 0% + Branches + 0/5 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 0% + Lines + 0/484 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
FeedbackButton.tsx +
+
0%0/250%0/10%0/10%0/25
FeedbackHistory.tsx +
+
0%0/1540%0/10%0/10%0/154
FeedbackModal.tsx +
+
0%0/2290%0/10%0/10%0/229
feedbackStore.ts +
+
0%0/750%0/10%0/10%0/75
index.ts +
+
0%0/10%0/10%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Feedback/index.ts.html b/desktop/coverage/src/components/Feedback/index.ts.html new file mode 100644 index 0000000..7a7b0c1 --- /dev/null +++ b/desktop/coverage/src/components/Feedback/index.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/components/Feedback/index.ts + + + + + + + + + +
+
+

All files / src/components/Feedback index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12  +  +  +  +  +  +  +  +  +  +  + 
export { FeedbackButton } from './FeedbackButton';
+export { FeedbackModal } from './FeedbackModal';
+export { FeedbackHistory } from './FeedbackHistory';
+export {
+  useFeedbackStore,
+  type FeedbackSubmission,
+  type FeedbackType,
+  type FeedbackPriority,
+  type FeedbackStatus,
+  type FeedbackAttachment,
+} from './feedbackStore';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/FirstConversationPrompt.tsx.html b/desktop/coverage/src/components/FirstConversationPrompt.tsx.html new file mode 100644 index 0000000..4cf7794 --- /dev/null +++ b/desktop/coverage/src/components/FirstConversationPrompt.tsx.html @@ -0,0 +1,457 @@ + + + + + + Code coverage report for src/components/FirstConversationPrompt.tsx + + + + + + + + + +
+
+

All files / src/components FirstConversationPrompt.tsx

+
+ +
+ 0% + Statements + 0/79 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/79 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * FirstConversationPrompt - Welcome prompt for new Agents
+ *
+ * Displays a personalized welcome message and quick start suggestions
+ * when entering a new Agent's chat for the first time.
+ */
+import { motion } from 'framer-motion';
+import { Lightbulb, ArrowRight } from 'lucide-react';
+import { cn } from '../lib/utils';
+import {
+  generateWelcomeMessage,
+  getQuickStartSuggestions,
+  getScenarioById,
+  type QuickStartSuggestion,
+} from '../lib/personality-presets';
+import type { Clone } from '../store/agentStore';
+ 
+interface FirstConversationPromptProps {
+  clone: Clone;
+  onSelectSuggestion?: (text: string) => void;
+  onDismiss?: () => void;
+}
+ 
+export function FirstConversationPrompt({
+  clone,
+  onSelectSuggestion,
+}: FirstConversationPromptProps) {
+  // Generate welcome message
+  const welcomeMessage = generateWelcomeMessage({
+    userName: clone.userName,
+    agentName: clone.nickname || clone.name,
+    emoji: clone.emoji,
+    personality: clone.personality,
+    scenarios: clone.scenarios,
+  });
+ 
+  // Get quick start suggestions based on scenarios
+  const suggestions = getQuickStartSuggestions(clone.scenarios || []);
+ 
+  const handleSuggestionClick = (suggestion: QuickStartSuggestion) => {
+    onSelectSuggestion?.(suggestion.text);
+  };
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, y: 20 }}
+      animate={{ opacity: 1, y: 0 }}
+      exit={{ opacity: 0, y: -10 }}
+      className="flex flex-col items-center justify-center py-12 px-4"
+    >
+      {/* Avatar with emoji */}
+      <div className="mb-6">
+        <div className="w-20 h-20 rounded-2xl bg-gradient-to-br from-primary/20 to-primary/10 dark:from-primary/30 dark:to-primary/20 flex items-center justify-center shadow-lg">
+          <span className="text-4xl">{clone.emoji || '🦞'}</span>
+        </div>
+      </div>
+ 
+      {/* Welcome message */}
+      <div className="text-center max-w-md mb-8">
+        <p className="text-lg text-gray-700 dark:text-gray-200 whitespace-pre-line leading-relaxed">
+          {welcomeMessage}
+        </p>
+      </div>
+ 
+      {/* Quick start suggestions */}
+      <div className="w-full max-w-lg space-y-2">
+        <div className="flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 mb-3">
+          <Lightbulb className="w-4 h-4" />
+          <span>快速开始</span>
+        </div>
+ 
+        {suggestions.map((suggestion, index) => (
+          <motion.button
+            key={index}
+            initial={{ opacity: 0, x: -20 }}
+            animate={{ opacity: 1, x: 0 }}
+            transition={{ delay: index * 0.1 }}
+            onClick={() => handleSuggestionClick(suggestion)}
+            className={cn(
+              'w-full flex items-center gap-3 px-4 py-3 rounded-xl',
+              'bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700',
+              'hover:bg-gray-100 dark:hover:bg-gray-800 hover:border-primary/30',
+              'transition-all duration-200 group text-left'
+            )}
+          >
+            <span className="text-xl flex-shrink-0">{suggestion.icon}</span>
+            <span className="flex-1 text-sm text-gray-700 dark:text-gray-200">
+              {suggestion.text}
+            </span>
+            <ArrowRight className="w-4 h-4 text-gray-400 group-hover:text-primary transition-colors flex-shrink-0" />
+          </motion.button>
+        ))}
+      </div>
+ 
+      {/* Scenario tags */}
+      {clone.scenarios && clone.scenarios.length > 0 && (
+        <div className="mt-8 flex flex-wrap gap-2 justify-center">
+          {clone.scenarios.map((scenarioId) => {
+            const scenario = getScenarioById(scenarioId);
+            if (!scenario) return null;
+            return (
+              <span
+                key={scenarioId}
+                className={cn(
+                  'px-3 py-1 rounded-full text-xs font-medium',
+                  'bg-primary/10 text-primary dark:bg-primary/20 dark:text-primary'
+                )}
+              >
+                {scenario.label}
+              </span>
+            );
+          })}
+        </div>
+      )}
+ 
+      {/* Dismiss hint */}
+      <p className="mt-8 text-xs text-gray-400 dark:text-gray-500">
+        发送消息开始对话,或点击上方建议
+      </p>
+    </motion.div>
+  );
+}
+ 
+export default FirstConversationPrompt;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/HandApprovalModal.tsx.html b/desktop/coverage/src/components/HandApprovalModal.tsx.html new file mode 100644 index 0000000..6d71798 --- /dev/null +++ b/desktop/coverage/src/components/HandApprovalModal.tsx.html @@ -0,0 +1,1798 @@ + + + + + + Code coverage report for src/components/HandApprovalModal.tsx + + + + + + + + + +
+
+

All files / src/components HandApprovalModal.tsx

+
+ +
+ 0% + Statements + 0/396 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/396 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HandApprovalModal - Modal for approving/rejecting Hand executions
+ *
+ * Provides detailed view of Hand execution request with:
+ * - Hand name and description
+ * - Trigger parameters
+ * - Expected output/impact
+ * - Risk level indicator
+ * - Approval timeout countdown
+ * - Approve/Reject buttons
+ */
+ 
+import { useState, useEffect, useCallback, useMemo } from 'react';
+import {
+  X,
+  AlertTriangle,
+  CheckCircle,
+  XCircle,
+  Clock,
+  Loader2,
+  Shield,
+  Zap,
+  Info,
+} from 'lucide-react';
+import type { HandRun } from '../store/gatewayStore';
+import { HAND_DEFINITIONS, type HandId } from '../types/hands';
+ 
+// === Types ===
+ 
+export type RiskLevel = 'low' | 'medium' | 'high';
+ 
+export interface HandApprovalData {
+  runId: string;
+  handId: HandId;
+  handName: string;
+  description: string;
+  params: Record<string, unknown>;
+  riskLevel: RiskLevel;
+  expectedImpact?: string;
+  requestedAt: string;
+  requestedBy?: string;
+  timeoutSeconds?: number;
+}
+ 
+interface HandApprovalModalProps {
+  handRun: HandRun | null;
+  isOpen: boolean;
+  onApprove: (runId: string) => Promise<void>;
+  onReject: (runId: string, reason: string) => Promise<void>;
+  onClose: () => void;
+}
+ 
+// === Risk Level Config ===
+ 
+const RISK_CONFIG: Record<
+  RiskLevel,
+  { label: string; color: string; bgColor: string; borderColor: string; icon: typeof AlertTriangle }
+> = {
+  low: {
+    label: 'Low Risk',
+    color: 'text-green-600 dark:text-green-400',
+    bgColor: 'bg-green-100 dark:bg-green-900/30',
+    borderColor: 'border-green-300 dark:border-green-700',
+    icon: CheckCircle,
+  },
+  medium: {
+    label: 'Medium Risk',
+    color: 'text-yellow-600 dark:text-yellow-400',
+    bgColor: 'bg-yellow-100 dark:bg-yellow-900/30',
+    borderColor: 'border-yellow-300 dark:border-yellow-700',
+    icon: AlertTriangle,
+  },
+  high: {
+    label: 'High Risk',
+    color: 'text-red-600 dark:text-red-400',
+    bgColor: 'bg-red-100 dark:bg-red-900/30',
+    borderColor: 'border-red-300 dark:border-red-700',
+    icon: AlertTriangle,
+  },
+};
+ 
+// === Helper Functions ===
+ 
+function calculateRiskLevel(handId: HandId, params: Record<string, unknown>): RiskLevel {
+  // Risk assessment based on Hand type and parameters
+  switch (handId) {
+    case 'browser':
+      // Browser automation can be high risk if interacting with sensitive sites
+      const url = String(params.url || '').toLowerCase();
+      if (url.includes('bank') || url.includes('payment') || url.includes('admin')) {
+        return 'high';
+      }
+      if (params.headless === false) {
+        return 'medium'; // Non-headless mode is more visible
+      }
+      return 'low';
+ 
+    case 'twitter':
+      // Twitter actions can have public impact
+      const action = String(params.action || '');
+      if (action === 'post' || action === 'engage') {
+        return 'high'; // Public posting is high impact
+      }
+      return 'medium';
+ 
+    case 'collector':
+      // Data collection depends on scope
+      if (params.pagination === true) {
+        return 'medium'; // Large scale collection
+      }
+      return 'low';
+ 
+    case 'lead':
+      // Lead generation accesses external data
+      return 'medium';
+ 
+    case 'clip':
+      // Video processing is generally safe
+      return 'low';
+ 
+    case 'predictor':
+      // Predictions are read-only
+      return 'low';
+ 
+    case 'researcher':
+      // Research is generally safe
+      const depth = String(params.depth || '');
+      return depth === 'deep' ? 'medium' : 'low';
+ 
+    default:
+      return 'medium';
+  }
+}
+ 
+function getExpectedImpact(handId: HandId, params: Record<string, unknown>): string {
+  switch (handId) {
+    case 'browser':
+      return `Will perform browser automation on ${params.url || 'specified URL'}`;
+    case 'twitter':
+      if (params.action === 'post') {
+        return 'Will post content to Twitter/X publicly';
+      }
+      if (params.action === 'engage') {
+        return 'Will like/reply to tweets';
+      }
+      return 'Will perform Twitter/X operations';
+    case 'collector':
+      return `Will collect data from ${params.targetUrl || 'specified source'}`;
+    case 'lead':
+      return `Will search for leads from ${params.source || 'specified source'}`;
+    case 'clip':
+      return `Will process video: ${params.inputPath || 'specified input'}`;
+    case 'predictor':
+      return `Will run prediction on ${params.dataSource || 'specified data'}`;
+    case 'researcher':
+      return `Will conduct research on: ${params.topic || 'specified topic'}`;
+    default:
+      return 'Will execute Hand operation';
+  }
+}
+ 
+function formatTimeRemaining(seconds: number): string {
+  if (seconds <= 0) return 'Expired';
+  if (seconds < 60) return `${seconds}s`;
+  const minutes = Math.floor(seconds / 60);
+  const secs = seconds % 60;
+  return `${minutes}m ${secs}s`;
+}
+ 
+// === Countdown Timer Hook ===
+ 
+function useCountdown(startedAt: string, timeoutSeconds: number = 300) {
+  const [timeRemaining, setTimeRemaining] = useState(0);
+  const [isExpired, setIsExpired] = useState(false);
+ 
+  useEffect(() => {
+    const started = new Date(startedAt).getTime();
+    const expiresAt = started + timeoutSeconds * 1000;
+ 
+    const updateTimer = () => {
+      const now = Date.now();
+      const remaining = Math.max(0, Math.floor((expiresAt - now) / 1000));
+      setTimeRemaining(remaining);
+      setIsExpired(remaining <= 0);
+    };
+ 
+    updateTimer();
+    const interval = setInterval(updateTimer, 1000);
+ 
+    return () => clearInterval(interval);
+  }, [startedAt, timeoutSeconds]);
+ 
+  return { timeRemaining, isExpired };
+}
+ 
+// === Sub-components ===
+ 
+function RiskBadge({ level }: { level: RiskLevel }) {
+  const config = RISK_CONFIG[level];
+  const Icon = config.icon;
+ 
+  return (
+    <div
+      className={`inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md text-sm font-medium border ${config.bgColor} ${config.color} ${config.borderColor}`}
+    >
+      <Icon className="w-3.5 h-3.5" />
+      {config.label}
+    </div>
+  );
+}
+ 
+function TimeoutProgress({ timeRemaining, totalSeconds }: { timeRemaining: number; totalSeconds: number }) {
+  const percentage = Math.max(0, Math.min(100, (timeRemaining / totalSeconds) * 100));
+  const isUrgent = timeRemaining < 60;
+ 
+  return (
+    <div className="space-y-1.5">
+      <div className="flex items-center justify-between text-xs">
+        <span className="text-gray-500 dark:text-gray-400 flex items-center gap-1">
+          <Clock className="w-3 h-3" />
+          Time Remaining
+        </span>
+        <span
+          className={`font-medium ${isUrgent ? 'text-red-600 dark:text-red-400' : 'text-gray-700 dark:text-gray-300'}`}
+        >
+          {formatTimeRemaining(timeRemaining)}
+        </span>
+      </div>
+      <div className="h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden">
+        <div
+          className={`h-full transition-all duration-1000 ease-linear rounded-full ${
+            isUrgent ? 'bg-red-500' : 'bg-blue-500'
+          }`}
+          style={{ width: `${percentage}%` }}
+        />
+      </div>
+    </div>
+  );
+}
+ 
+function ParamsDisplay({ params }: { params: Record<string, unknown> }) {
+  if (!params || Object.keys(params).length === 0) {
+    return (
+      <p className="text-sm text-gray-500 dark:text-gray-400 italic">No parameters provided</p>
+    );
+  }
+ 
+  return (
+    <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3 font-mono text-xs overflow-x-auto">
+      <pre className="text-gray-700 dark:text-gray-300">
+        {JSON.stringify(params, null, 2)}
+      </pre>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function HandApprovalModal({
+  handRun,
+  isOpen,
+  onApprove,
+  onReject,
+  onClose,
+}: HandApprovalModalProps) {
+  const [isProcessing, setIsProcessing] = useState(false);
+  const [showRejectInput, setShowRejectInput] = useState(false);
+  const [rejectReason, setRejectReason] = useState('');
+  const [error, setError] = useState<string | null>(null);
+ 
+  // Parse HandRun to get approval data
+  const approvalData = useMemo((): HandApprovalData | null => {
+    if (!handRun) return null;
+ 
+    // Extract hand ID from run data (could be stored in result or need to be passed separately)
+    const result = handRun.result as Record<string, unknown> | undefined;
+    const handId = (result?.handId as HandId) || 'researcher'; // Default fallback
+    const params = (result?.params as Record<string, unknown>) || {};
+    const handDef = HAND_DEFINITIONS.find((h) => h.id === handId);
+ 
+    return {
+      runId: handRun.runId,
+      handId,
+      handName: handDef?.name || handId,
+      description: handDef?.description || 'Hand execution request',
+      params,
+      riskLevel: calculateRiskLevel(handId, params),
+      expectedImpact: getExpectedImpact(handId, params),
+      requestedAt: handRun.startedAt,
+      timeoutSeconds: 300, // 5 minutes default timeout
+    };
+  }, [handRun]);
+ 
+  // Timer countdown
+  const { timeRemaining, isExpired } = useCountdown(
+    approvalData?.requestedAt || new Date().toISOString(),
+    approvalData?.timeoutSeconds || 300
+  );
+ 
+  // Handle keyboard escape
+  useEffect(() => {
+    const handleEscape = (e: KeyboardEvent) => {
+      if (e.key === 'Escape' && isOpen) {
+        onClose();
+      }
+    };
+ 
+    window.addEventListener('keydown', handleEscape);
+    return () => window.removeEventListener('keydown', handleEscape);
+  }, [isOpen, onClose]);
+ 
+  // Reset state when modal opens/closes
+  useEffect(() => {
+    if (isOpen) {
+      setShowRejectInput(false);
+      setRejectReason('');
+      setError(null);
+      setIsProcessing(false);
+    }
+  }, [isOpen]);
+ 
+  const handleApprove = useCallback(async () => {
+    if (!approvalData || isProcessing || isExpired) return;
+ 
+    setIsProcessing(true);
+    setError(null);
+ 
+    try {
+      await onApprove(approvalData.runId);
+      onClose();
+    } catch (err) {
+      setError(err instanceof Error ? err.message : 'Failed to approve');
+    } finally {
+      setIsProcessing(false);
+    }
+  }, [approvalData, isProcessing, isExpired, onApprove, onClose]);
+ 
+  const handleReject = useCallback(async () => {
+    if (!approvalData || isProcessing) return;
+ 
+    if (!showRejectInput) {
+      setShowRejectInput(true);
+      return;
+    }
+ 
+    if (!rejectReason.trim()) {
+      setError('Please provide a reason for rejection');
+      return;
+    }
+ 
+    setIsProcessing(true);
+    setError(null);
+ 
+    try {
+      await onReject(approvalData.runId, rejectReason.trim());
+      onClose();
+    } catch (err) {
+      setError(err instanceof Error ? err.message : 'Failed to reject');
+    } finally {
+      setIsProcessing(false);
+    }
+  }, [approvalData, isProcessing, showRejectInput, rejectReason, onReject, onClose]);
+ 
+  const handleCancelReject = useCallback(() => {
+    setShowRejectInput(false);
+    setRejectReason('');
+    setError(null);
+  }, []);
+ 
+  if (!isOpen || !approvalData) return null;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-start justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <div className="flex items-center gap-3">
+            <div className="w-10 h-10 bg-amber-100 dark:bg-amber-900/30 rounded-lg flex items-center justify-center">
+              <Shield className="w-5 h-5 text-amber-600 dark:text-amber-400" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                Hand Approval Request
+              </h2>
+              <p className="text-xs text-gray-500 dark:text-gray-400">
+                Review and approve Hand execution
+              </p>
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
+          >
+            <X className="w-5 h-5" />
+          </button>
+        </div>
+ 
+        {/* Content */}
+        <div className="flex-1 overflow-y-auto p-4 space-y-4">
+          {/* Expired Warning */}
+          {isExpired && (
+            <div className="flex items-center gap-2 p-3 bg-gray-100 dark:bg-gray-900 rounded-lg text-gray-600 dark:text-gray-400">
+              <Clock className="w-5 h-5 flex-shrink-0" />
+              <span className="text-sm">This approval request has expired</span>
+            </div>
+          )}
+ 
+          {/* Hand Info */}
+          <div className="space-y-3">
+            <div className="flex items-center justify-between">
+              <div className="flex items-center gap-2">
+                <Zap className="w-4 h-4 text-amber-500" />
+                <h3 className="font-medium text-gray-900 dark:text-white">
+                  {approvalData.handName}
+                </h3>
+              </div>
+              <RiskBadge level={approvalData.riskLevel} />
+            </div>
+            <p className="text-sm text-gray-600 dark:text-gray-400">
+              {approvalData.description}
+            </p>
+          </div>
+ 
+          {/* Timeout Progress */}
+          {!isExpired && (
+            <TimeoutProgress
+              timeRemaining={timeRemaining}
+              totalSeconds={approvalData.timeoutSeconds || 300}
+            />
+          )}
+ 
+          {/* Parameters */}
+          <div className="space-y-2">
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+              Execution Parameters
+            </label>
+            <ParamsDisplay params={approvalData.params} />
+          </div>
+ 
+          {/* Expected Impact */}
+          {approvalData.expectedImpact && (
+            <div className="space-y-2">
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 flex items-center gap-1">
+                <Info className="w-3.5 h-3.5" />
+                Expected Impact
+              </label>
+              <p className="text-sm text-gray-600 dark:text-gray-400 bg-blue-50 dark:bg-blue-900/20 p-3 rounded-lg">
+                {approvalData.expectedImpact}
+              </p>
+            </div>
+          )}
+ 
+          {/* Request Info */}
+          <div className="text-xs text-gray-500 dark:text-gray-400 space-y-1 pt-2 border-t border-gray-200 dark:border-gray-700">
+            <p>Run ID: {approvalData.runId}</p>
+            <p>
+              Requested: {new Date(approvalData.requestedAt).toLocaleString()}
+            </p>
+          </div>
+ 
+          {/* Reject Input */}
+          {showRejectInput && (
+            <div className="space-y-2">
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+                Rejection Reason <span className="text-red-500">*</span>
+              </label>
+              <textarea
+                value={rejectReason}
+                onChange={(e) => setRejectReason(e.target.value)}
+                placeholder="Please provide a reason for rejecting this request..."
+                className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-red-500"
+                rows={3}
+                autoFocus
+                disabled={isProcessing}
+              />
+            </div>
+          )}
+ 
+          {/* Error Message */}
+          {error && (
+            <div className="flex items-center gap-2 p-3 bg-red-50 dark:bg-red-900/20 rounded-lg text-red-700 dark:text-red-400">
+              <AlertTriangle className="w-4 h-4 flex-shrink-0" />
+              <span className="text-sm">{error}</span>
+            </div>
+          )}
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0">
+          {showRejectInput ? (
+            <>
+              <button
+                type="button"
+                onClick={handleCancelReject}
+                disabled={isProcessing}
+                className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors disabled:opacity-50"
+              >
+                Cancel
+              </button>
+              <button
+                type="button"
+                onClick={handleReject}
+                disabled={isProcessing || !rejectReason.trim()}
+                className="px-4 py-2 text-sm text-white bg-red-600 rounded-lg hover:bg-red-700 transition-colors disabled:opacity-50 flex items-center gap-2"
+              >
+                {isProcessing ? (
+                  <>
+                    <Loader2 className="w-4 h-4 animate-spin" />
+                    Rejecting...
+                  </>
+                ) : (
+                  <>
+                    <XCircle className="w-4 h-4" />
+                    Confirm Rejection
+                  </>
+                )}
+              </button>
+            </>
+          ) : (
+            <>
+              <button
+                type="button"
+                onClick={onClose}
+                disabled={isProcessing}
+                className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors disabled:opacity-50"
+              >
+                Close
+              </button>
+              <button
+                type="button"
+                onClick={handleReject}
+                disabled={isProcessing || isExpired}
+                className="px-4 py-2 text-sm border border-red-200 dark:border-red-800 text-red-600 dark:text-red-400 rounded-lg hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors disabled:opacity-50 flex items-center gap-2"
+              >
+                <XCircle className="w-4 h-4" />
+                Reject
+              </button>
+              <button
+                type="button"
+                onClick={handleApprove}
+                disabled={isProcessing || isExpired}
+                className="px-4 py-2 text-sm text-white bg-green-600 rounded-lg hover:bg-green-700 transition-colors disabled:opacity-50 flex items-center gap-2"
+              >
+                {isProcessing ? (
+                  <>
+                    <Loader2 className="w-4 h-4 animate-spin" />
+                    Approving...
+                  </>
+                ) : (
+                  <>
+                    <CheckCircle className="w-4 h-4" />
+                    Approve
+                  </>
+                )}
+              </button>
+            </>
+          )}
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default HandApprovalModal;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/HandList.tsx.html b/desktop/coverage/src/components/HandList.tsx.html new file mode 100644 index 0000000..0564be6 --- /dev/null +++ b/desktop/coverage/src/components/HandList.tsx.html @@ -0,0 +1,478 @@ + + + + + + Code coverage report for src/components/HandList.tsx + + + + + + + + + +
+
+

All files / src/components HandList.tsx

+
+ +
+ 0% + Statements + 0/98 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/98 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HandList - 左侧导航的 Hands 列表
+ *
+ * 显示所有可用的 Hands(自主能力包),
+ * 允许用户选择一个 Hand 来查看其任务和结果。
+ */
+ 
+import { useEffect } from 'react';
+import { useHandStore, type Hand } from '../store/handStore';
+import { Zap, Loader2, RefreshCw, CheckCircle, XCircle, AlertTriangle } from 'lucide-react';
+ 
+interface HandListProps {
+  selectedHandId?: string;
+  onSelectHand?: (handId: string) => void;
+}
+ 
+// 状态图标
+function HandStatusIcon({ status }: { status: Hand['status'] }) {
+  switch (status) {
+    case 'running':
+      return <Loader2 className="w-3.5 h-3.5 text-blue-500 animate-spin" />;
+    case 'needs_approval':
+      return <AlertTriangle className="w-3.5 h-3.5 text-yellow-500" />;
+    case 'error':
+      return <XCircle className="w-3.5 h-3.5 text-red-500" />;
+    case 'setup_needed':
+    case 'unavailable':
+      return <AlertTriangle className="w-3.5 h-3.5 text-orange-500" />;
+    default:
+      return <CheckCircle className="w-3.5 h-3.5 text-green-500" />;
+  }
+}
+ 
+// 状态标签
+const STATUS_LABELS: Record<Hand['status'], string> = {
+  idle: '就绪',
+  running: '运行中',
+  needs_approval: '待审批',
+  error: '错误',
+  unavailable: '不可用',
+  setup_needed: '需配置',
+};
+ 
+export function HandList({ selectedHandId, onSelectHand }: HandListProps) {
+  const hands = useHandStore((s) => s.hands);
+  const loadHands = useHandStore((s) => s.loadHands);
+  const isLoading = useHandStore((s) => s.isLoading);
+ 
+  useEffect(() => {
+    loadHands();
+  }, [loadHands]);
+ 
+  if (isLoading && hands.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <Loader2 className="w-5 h-5 animate-spin mx-auto text-gray-400 mb-2" />
+        <p className="text-xs text-gray-400">加载中...</p>
+      </div>
+    );
+  }
+ 
+  if (hands.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <Zap className="w-8 h-8 mx-auto text-gray-300 mb-2" />
+        <p className="text-xs text-gray-400 mb-1">暂无可用 Hands</p>
+        <p className="text-xs text-gray-300">连接 OpenFang 后显示</p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="flex flex-col h-full">
+      {/* 头部 */}
+      <div className="p-3 border-b border-gray-200 flex items-center justify-between">
+        <div>
+          <h3 className="text-xs font-semibold text-gray-700">自主能力包</h3>
+          <p className="text-xs text-gray-400">{hands.length} 个可用</p>
+        </div>
+        <button
+          onClick={() => loadHands()}
+          disabled={isLoading}
+          className="p-1.5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded transition-colors disabled:opacity-50"
+          title="刷新"
+        >
+          <RefreshCw className={`w-3.5 h-3.5 ${isLoading ? 'animate-spin' : ''}`} />
+        </button>
+      </div>
+ 
+      {/* Hands 列表 */}
+      <div className="flex-1 overflow-y-auto">
+        {hands.map((hand) => (
+          <button
+            key={hand.id}
+            onClick={() => onSelectHand?.(hand.id)}
+            className={`w-full text-left p-3 border-b border-gray-100 hover:bg-gray-100 transition-colors ${
+              selectedHandId === hand.id ? 'bg-blue-50 border-l-2 border-l-blue-500' : ''
+            }`}
+          >
+            <div className="flex items-start gap-2">
+              <span className="text-lg flex-shrink-0">{hand.icon || '🤖'}</span>
+              <div className="flex-1 min-w-0">
+                <div className="flex items-center gap-1.5">
+                  <span className="font-medium text-gray-800 text-sm truncate">
+                    {hand.name}
+                  </span>
+                  <HandStatusIcon status={hand.status} />
+                </div>
+                <p className="text-xs text-gray-400 truncate mt-0.5">
+                  {hand.description}
+                </p>
+                <div className="flex items-center gap-2 mt-1">
+                  <span className="text-xs text-gray-400">
+                    {STATUS_LABELS[hand.status]}
+                  </span>
+                  {hand.toolCount !== undefined && (
+                    <span className="text-xs text-gray-300">
+                      {hand.toolCount} 工具
+                    </span>
+                  )}
+                </div>
+              </div>
+            </div>
+          </button>
+        ))}
+      </div>
+    </div>
+  );
+}
+ 
+export default HandList;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/HandParamsForm.tsx.html b/desktop/coverage/src/components/HandParamsForm.tsx.html new file mode 100644 index 0000000..6e32f43 --- /dev/null +++ b/desktop/coverage/src/components/HandParamsForm.tsx.html @@ -0,0 +1,2512 @@ + + + + + + Code coverage report for src/components/HandParamsForm.tsx + + + + + + + + + +
+
+

All files / src/components HandParamsForm.tsx

+
+ +
+ 0% + Statements + 0/594 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/594 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HandParamsForm - Dynamic form component for Hand parameters
+ *
+ * Supports all parameter types:
+ * - text: Text input
+ * - number: Number input with min/max validation
+ * - boolean: Toggle/checkbox
+ * - select: Dropdown select
+ * - textarea: Multi-line text
+ * - array: Dynamic array with add/remove items
+ * - object: JSON object editor
+ * - file: File selector
+ *
+ * Features:
+ * - Form validation (required, type, range, pattern)
+ * - Parameter presets (save/load/delete)
+ * - Error display below inputs
+ */
+ 
+import { useState, useCallback, useEffect, useMemo } from 'react';
+import {
+  AlertCircle,
+  Plus,
+  Trash2,
+  Save,
+  FolderOpen,
+  Trash,
+  ChevronDown,
+  ChevronUp,
+  FileText,
+  Info,
+} from 'lucide-react';
+import type { HandParameter } from '../types/hands';
+import { parseJsonOrDefault, safeJsonParse } from '../lib/json-utils';
+ 
+// === Types ===
+ 
+export interface HandParamsFormProps {
+  parameters: HandParameter[];
+  values: Record<string, unknown>;
+  onChange: (values: Record<string, unknown>) => void;
+  errors?: Record<string, string>;
+  disabled?: boolean;
+  presetKey?: string; // Key for storing/loading presets
+}
+ 
+export interface ParameterPreset {
+  id: string;
+  name: string;
+  createdAt: string;
+  values: Record<string, unknown>;
+}
+ 
+// === Validation ===
+ 
+interface ValidationResult {
+  isValid: boolean;
+  error?: string;
+}
+ 
+function validateParameter(param: HandParameter, value: unknown): ValidationResult {
+  // Required check
+  if (param.required) {
+    if (value === undefined || value === null || value === '') {
+      return { isValid: false, error: `${param.label} 为必填项` };
+    }
+    if (Array.isArray(value) && value.length === 0) {
+      return { isValid: false, error: `${param.label} 为必填项` };
+    }
+    if (typeof value === 'object' && !Array.isArray(value) && Object.keys(value as Record<string, unknown>).length === 0) {
+      return { isValid: false, error: `${param.label} 为必填项` };
+    }
+  }
+ 
+  // Skip further validation if value is empty and not required
+  if (value === undefined || value === null || value === '') {
+    return { isValid: true };
+  }
+ 
+  // Type-specific validation
+  switch (param.type) {
+    case 'number':
+      if (typeof value !== 'number' || isNaN(value)) {
+        return { isValid: false, error: `${param.label} 必须是有效数字` };
+      }
+      if (param.min !== undefined && value < param.min) {
+        return { isValid: false, error: `${param.label} 不能小于 ${param.min}` };
+      }
+      if (param.max !== undefined && value > param.max) {
+        return { isValid: false, error: `${param.label} 不能大于 ${param.max}` };
+      }
+      break;
+ 
+    case 'text':
+    case 'textarea':
+      if (typeof value !== 'string') {
+        return { isValid: false, error: `${param.label} 必须是文本` };
+      }
+      if (param.pattern) {
+        try {
+          const regex = new RegExp(param.pattern);
+          if (!regex.test(value)) {
+            return { isValid: false, error: `${param.label} 格式不正确` };
+          }
+        } catch {
+          // Invalid regex pattern, skip validation
+        }
+      }
+      break;
+ 
+    case 'array':
+      if (!Array.isArray(value)) {
+        return { isValid: false, error: `${param.label} 必须是数组` };
+      }
+      break;
+ 
+    case 'object':
+      if (typeof value !== 'object' || Array.isArray(value)) {
+        return { isValid: false, error: `${param.label} 必须是对象` };
+      }
+      try {
+        // Try to stringify to validate JSON
+        JSON.stringify(value);
+      } catch {
+        return { isValid: false, error: `${param.label} 包含无效的 JSON` };
+      }
+      break;
+ 
+    case 'file':
+      if (typeof value !== 'string') {
+        return { isValid: false, error: `${param.label} must be a file path` };
+      }
+      break;
+  }
+ 
+  return { isValid: true };
+}
+ 
+// === Preset Storage ===
+ 
+const PRESET_STORAGE_PREFIX = 'zclaw-hand-preset-';
+ 
+function getPresetStorageKey(handId: string): string {
+  return `${PRESET_STORAGE_PREFIX}${handId}`;
+}
+ 
+function loadPresets(handId: string): ParameterPreset[] {
+  const stored = localStorage.getItem(getPresetStorageKey(handId));
+  if (stored) {
+    return parseJsonOrDefault<ParameterPreset[]>(stored, []);
+  }
+  return [];
+}
+ 
+function savePresets(handId: string, presets: ParameterPreset[]): void {
+  try {
+    localStorage.setItem(getPresetStorageKey(handId), JSON.stringify(presets));
+  } catch {
+    // Ignore storage errors
+  }
+}
+ 
+// === Sub-Components ===
+ 
+interface FormFieldWrapperProps {
+  param: HandParameter;
+  error?: string;
+  children: React.ReactNode;
+}
+ 
+function FormFieldWrapper({ param, error, children }: FormFieldWrapperProps) {
+  return (
+    <div className="space-y-1.5">
+      <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+        {param.label}
+        {param.required && <span className="text-red-500 ml-1">*</span>}
+      </label>
+      {children}
+      {param.description && !error && (
+        <p className="text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+          <Info className="w-3 h-3" />
+          {param.description}
+        </p>
+      )}
+      {error && (
+        <p className="text-xs text-red-500 flex items-center gap-1">
+          <AlertCircle className="w-3 h-3" />
+          {error}
+        </p>
+      )}
+    </div>
+  );
+}
+ 
+// === Parameter Input Components ===
+ 
+interface ParamInputProps {
+  param: HandParameter;
+  value: unknown;
+  onChange: (value: unknown) => void;
+  disabled?: boolean;
+  error?: string;
+}
+ 
+function TextParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  return (
+    <input
+      type="text"
+      value={(value as string) ?? ''}
+      onChange={(e) => onChange(e.target.value)}
+      placeholder={param.placeholder}
+      disabled={disabled}
+      className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-400 disabled:opacity-50 disabled:cursor-not-allowed ${
+        error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+      }`}
+    />
+  );
+}
+ 
+function NumberParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  return (
+    <input
+      type="number"
+      value={(value as number) ?? ''}
+      onChange={(e) => {
+        const val = e.target.value;
+        onChange(val === '' ? undefined : parseFloat(val));
+      }}
+      placeholder={param.placeholder}
+      min={param.min}
+      max={param.max}
+      disabled={disabled}
+      className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-400 disabled:opacity-50 disabled:cursor-not-allowed ${
+        error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+      }`}
+    />
+  );
+}
+ 
+function BooleanParamInput({ param, value, onChange, disabled }: ParamInputProps) {
+  return (
+    <label className="flex items-center gap-2 cursor-pointer">
+      <input
+        type="checkbox"
+        checked={(value as boolean) ?? false}
+        onChange={(e) => onChange(e.target.checked)}
+        disabled={disabled}
+        className="w-4 h-4 text-gray-600 border-gray-300 rounded focus:ring-gray-400 disabled:opacity-50 disabled:cursor-not-allowed"
+      />
+      <span className="text-sm text-gray-600 dark:text-gray-400">
+        {param.placeholder || '启用'}
+      </span>
+    </label>
+  );
+}
+ 
+function SelectParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  return (
+    <select
+      value={(value as string) ?? ''}
+      onChange={(e) => onChange(e.target.value)}
+      disabled={disabled}
+      className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed ${
+        error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+      }`}
+    >
+      <option value="">{param.placeholder || '-- 请选择 --'}</option>
+      {param.options?.map((opt) => (
+        <option key={opt.value} value={opt.value}>
+          {opt.label}
+        </option>
+      ))}
+    </select>
+  );
+}
+ 
+function TextareaParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  return (
+    <textarea
+      value={(value as string) ?? ''}
+      onChange={(e) => onChange(e.target.value)}
+      placeholder={param.placeholder}
+      disabled={disabled}
+      rows={3}
+      className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed resize-y ${
+        error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+      }`}
+    />
+  );
+}
+ 
+function ArrayParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  const [newItem, setNewItem] = useState('');
+  const items = (Array.isArray(value) ? value : []) as string[];
+ 
+  const handleAddItem = () => {
+    if (newItem.trim()) {
+      onChange([...items, newItem.trim()]);
+      setNewItem('');
+    }
+  };
+ 
+  const handleRemoveItem = (index: number) => {
+    const newItems = [...items];
+    newItems.splice(index, 1);
+    onChange(newItems);
+  };
+ 
+  const handleUpdateItem = (index: number, newValue: string) => {
+    const newItems = [...items];
+    newItems[index] = newValue;
+    onChange(newItems);
+  };
+ 
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter') {
+      e.preventDefault();
+      handleAddItem();
+    }
+  };
+ 
+  return (
+    <div className={`space-y-2 p-3 border rounded-lg ${error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'}`}>
+      {/* Existing Items */}
+      {items.length > 0 && (
+        <div className="space-y-1.5">
+          {items.map((item, index) => (
+            <div key={index} className="flex items-center gap-2">
+              <input
+                type="text"
+                value={item}
+                onChange={(e) => handleUpdateItem(index, e.target.value)}
+                disabled={disabled}
+                className="flex-1 px-2 py-1 text-sm border border-gray-200 dark:border-gray-700 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-1 focus:ring-gray-400 disabled:opacity-50"
+              />
+              <button
+                type="button"
+                onClick={() => handleRemoveItem(index)}
+                disabled={disabled}
+                className="p-1 text-red-500 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-900/20 rounded disabled:opacity-50 disabled:cursor-not-allowed"
+              >
+                <Trash2 className="w-4 h-4" />
+              </button>
+            </div>
+          ))}
+        </div>
+      )}
+ 
+      {/* Add New Item */}
+      <div className="flex items-center gap-2">
+        <input
+          type="text"
+          value={newItem}
+          onChange={(e) => setNewItem(e.target.value)}
+          onKeyDown={handleKeyDown}
+          placeholder={param.placeholder || '添加项目...'}
+          disabled={disabled}
+          className="flex-1 px-2 py-1 text-sm border border-gray-200 dark:border-gray-700 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:opacity-50"
+        />
+        <button
+          type="button"
+          onClick={handleAddItem}
+          disabled={disabled || !newItem.trim()}
+          className="p-1 text-gray-500 hover:text-gray-700 hover:bg-gray-50 dark:hover:bg-gray-900/20 rounded disabled:opacity-50 disabled:cursor-not-allowed"
+        >
+          <Plus className="w-4 h-4" />
+        </button>
+      </div>
+ 
+      {items.length === 0 && !newItem && (
+        <p className="text-xs text-gray-400 text-center">No items added yet</p>
+      )}
+    </div>
+  );
+}
+ 
+function ObjectParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  const [jsonText, setJsonText] = useState('');
+  const [parseError, setParseError] = useState<string | null>(null);
+  const [isExpanded, setIsExpanded] = useState(true);
+ 
+  // Sync jsonText with value
+  useEffect(() => {
+    try {
+      if (value && typeof value === 'object' && !Array.isArray(value)) {
+        setJsonText(JSON.stringify(value, null, 2));
+        setParseError(null);
+      } else {
+        setJsonText('');
+      }
+    } catch {
+      setJsonText('');
+    }
+  }, [value]);
+ 
+  const handleTextChange = (text: string) => {
+    setJsonText(text);
+ 
+    if (!text.trim()) {
+      onChange({});
+      setParseError(null);
+      return;
+    }
+ 
+    const result = safeJsonParse<unknown>(text);
+    if (result.success) {
+      if (typeof result.data === 'object' && !Array.isArray(result.data)) {
+        onChange(result.data as Record<string, unknown>);
+        setParseError(null);
+      } else {
+        setParseError('值必须是 JSON 对象');
+      }
+    } else {
+      setParseError('JSON 格式无效');
+    }
+  };
+ 
+  return (
+    <div className={`space-y-2 ${error || parseError ? 'border-red-500' : ''}`}>
+      <button
+        type="button"
+        onClick={() => setIsExpanded(!isExpanded)}
+        className="flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white"
+      >
+        {isExpanded ? <ChevronUp className="w-4 h-4" /> : <ChevronDown className="w-4 h-4" />}
+        {isExpanded ? '收起' : '展开'} JSON 编辑器
+      </button>
+ 
+      {isExpanded && (
+        <textarea
+          value={jsonText}
+          onChange={(e) => handleTextChange(e.target.value)}
+          placeholder={param.placeholder || '{\n  "key": "value"\n}'}
+          disabled={disabled}
+          rows={6}
+          className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono disabled:opacity-50 disabled:cursor-not-allowed resize-y ${
+            error || parseError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+          }`}
+        />
+      )}
+ 
+      {parseError && (
+        <p className="text-xs text-red-500 flex items-center gap-1">
+          <AlertCircle className="w-3 h-3" />
+          {parseError}
+        </p>
+      )}
+    </div>
+  );
+}
+ 
+function FileParamInput({ param, value, onChange, disabled, error }: ParamInputProps) {
+  const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const file = e.target.files?.[0];
+    if (file) {
+      // For now, just store the file name. In a real implementation,
+      // you might want to read the file contents or handle upload
+      onChange(file.name);
+    }
+  };
+ 
+  return (
+    <div className={`space-y-2 ${error ? 'border-red-500' : ''}`}>
+      <div className="flex items-center gap-2">
+        <label
+          className={`flex-1 flex items-center gap-2 px-3 py-2 text-sm border rounded-lg cursor-pointer transition-colors ${
+            disabled
+              ? 'bg-gray-100 dark:bg-gray-800 cursor-not-allowed opacity-50'
+              : 'bg-white dark:bg-gray-900 hover:bg-gray-50 dark:hover:bg-gray-800'
+          } ${error ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'}`}
+        >
+          <FileText className="w-4 h-4 text-gray-400" />
+          <span className="flex-1 truncate text-gray-900 dark:text-white">
+            {(value as string) || param.placeholder || 'Choose file...'}
+          </span>
+          <input
+            type="file"
+            accept={param.accept}
+            onChange={handleFileChange}
+            disabled={disabled}
+            className="hidden"
+          />
+        </label>
+        {(value as string) && (
+          <button
+            type="button"
+            onClick={() => onChange('')}
+            disabled={disabled}
+            className="p-2 text-red-500 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-900/20 rounded disabled:opacity-50 disabled:cursor-not-allowed"
+          >
+            <Trash2 className="w-4 h-4" />
+          </button>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+// === Parameter Field Component ===
+ 
+function ParameterField({ param, value, onChange, disabled, externalError }: ParamInputProps & { externalError?: string }) {
+  const [internalError, setInternalError] = useState<string | undefined>(undefined);
+ 
+  const handleChange = useCallback((newValue: unknown) => {
+    // Validate on change
+    const result = validateParameter(param, newValue);
+    setInternalError(result.error ?? undefined);
+    onChange(newValue);
+  }, [param, onChange]);
+ 
+  const error = externalError || internalError;
+ 
+  const inputProps: ParamInputProps = { param, value, onChange: handleChange, disabled, error };
+ 
+  const renderInput = () => {
+    switch (param.type) {
+      case 'text':
+        return <TextParamInput {...inputProps} />;
+      case 'number':
+        return <NumberParamInput {...inputProps} />;
+      case 'boolean':
+        return <BooleanParamInput {...inputProps} />;
+      case 'select':
+        return <SelectParamInput {...inputProps} />;
+      case 'textarea':
+        return <TextareaParamInput {...inputProps} />;
+      case 'array':
+        return <ArrayParamInput {...inputProps} />;
+      case 'object':
+        return <ObjectParamInput {...inputProps} />;
+      case 'file':
+        return <FileParamInput {...inputProps} />;
+      default:
+        return <TextParamInput {...inputProps} />;
+    }
+  };
+ 
+  return (
+    <FormFieldWrapper param={param} error={error}>
+      {renderInput()}
+    </FormFieldWrapper>
+  );
+}
+ 
+// === Preset Manager Component ===
+ 
+interface PresetManagerProps {
+  presetKey?: string;
+  currentValues: Record<string, unknown>;
+  onLoadPreset: (values: Record<string, unknown>) => void;
+}
+ 
+function PresetManager({ presetKey, currentValues, onLoadPreset }: PresetManagerProps) {
+  const [presets, setPresets] = useState<ParameterPreset[]>([]);
+  const [showSaveDialog, setShowSaveDialog] = useState(false);
+  const [presetName, setPresetName] = useState('');
+  const [showPresetList, setShowPresetList] = useState(false);
+ 
+  // Load presets on mount
+  useEffect(() => {
+    if (presetKey) {
+      setPresets(loadPresets(presetKey));
+    }
+  }, [presetKey]);
+ 
+  const handleSavePreset = () => {
+    if (!presetKey || !presetName.trim()) return;
+ 
+    const newPreset: ParameterPreset = {
+      id: `preset-${Date.now()}`,
+      name: presetName.trim(),
+      createdAt: new Date().toISOString(),
+      values: { ...currentValues },
+    };
+ 
+    const newPresets = [...presets, newPreset];
+    setPresets(newPresets);
+    savePresets(presetKey, newPresets);
+    setPresetName('');
+    setShowSaveDialog(false);
+  };
+ 
+  const handleLoadPreset = (preset: ParameterPreset) => {
+    onLoadPreset(preset.values);
+    setShowPresetList(false);
+  };
+ 
+  const handleDeletePreset = (presetId: string) => {
+    if (!presetKey) return;
+    const newPresets = presets.filter((p) => p.id !== presetId);
+    setPresets(newPresets);
+    savePresets(presetKey, newPresets);
+  };
+ 
+  if (!presetKey) return null;
+ 
+  return (
+    <div className="border-b border-gray-200 dark:border-gray-700 pb-4 mb-4">
+      <div className="flex items-center gap-2">
+        <button
+          type="button"
+          onClick={() => setShowSaveDialog(true)}
+          className="flex items-center gap-1.5 px-3 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
+        >
+          <Save className="w-3.5 h-3.5" />
+          保存预设
+        </button>
+        <button
+          type="button"
+          onClick={() => setShowPresetList(!showPresetList)}
+          disabled={presets.length === 0}
+          className="flex items-center gap-1.5 px-3 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 disabled:opacity-50 disabled:cursor-not-allowed"
+        >
+          <FolderOpen className="w-3.5 h-3.5" />
+          加载预设 ({presets.length})
+        </button>
+      </div>
+ 
+      {/* Save Dialog */}
+      {showSaveDialog && (
+        <div className="mt-3 p-3 bg-gray-50 dark:bg-gray-900 rounded-lg space-y-2">
+          <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+            预设名称
+          </label>
+          <div className="flex items-center gap-2">
+            <input
+              type="text"
+              value={presetName}
+              onChange={(e) => setPresetName(e.target.value)}
+              placeholder="我的预设..."
+              className="flex-1 px-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-400"
+              onKeyDown={(e) => {
+                if (e.key === 'Enter') handleSavePreset();
+                if (e.key === 'Escape') setShowSaveDialog(false);
+              }}
+              autoFocus
+            />
+            <button
+              type="button"
+              onClick={handleSavePreset}
+              disabled={!presetName.trim()}
+              className="px-3 py-1.5 text-sm bg-gray-700 dark:bg-gray-600 text-white rounded-md hover:bg-gray-800 dark:hover:bg-gray-500 disabled:opacity-50 disabled:cursor-not-allowed"
+            >
+              保存
+            </button>
+            <button
+              type="button"
+              onClick={() => setShowSaveDialog(false)}
+              className="px-3 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
+            >
+              取消
+            </button>
+          </div>
+        </div>
+      )}
+ 
+      {/* Preset List */}
+      {showPresetList && presets.length > 0 && (
+        <div className="mt-3 p-3 bg-gray-50 dark:bg-gray-900 rounded-lg space-y-2">
+          <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+            可用预设
+          </label>
+          <div className="space-y-1.5 max-h-48 overflow-y-auto">
+            {presets.map((preset) => (
+              <div
+                key={preset.id}
+                className="flex items-center justify-between p-2 bg-white dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700"
+              >
+                <div className="flex-1 min-w-0">
+                  <p className="text-sm font-medium text-gray-900 dark:text-white truncate">
+                    {preset.name}
+                  </p>
+                  <p className="text-xs text-gray-500 dark:text-gray-400">
+                    {new Date(preset.createdAt).toLocaleDateString()}
+                  </p>
+                </div>
+                <div className="flex items-center gap-1 ml-2">
+                  <button
+                    type="button"
+                    onClick={() => handleLoadPreset(preset)}
+                    className="px-2 py-1 text-xs text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-900/20 rounded"
+                  >
+                    加载
+                  </button>
+                  <button
+                    type="button"
+                    onClick={() => handleDeletePreset(preset.id)}
+                    className="p-1 text-red-500 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-900/20 rounded"
+                  >
+                    <Trash className="w-3.5 h-3.5" />
+                  </button>
+                </div>
+              </div>
+            ))}
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function HandParamsForm({
+  parameters,
+  values,
+  onChange,
+  errors,
+  disabled,
+  presetKey,
+}: HandParamsFormProps) {
+  // Initialize values with defaults
+  const initialValues = useMemo(() => {
+    const result: Record<string, unknown> = { ...values };
+    parameters.forEach((param) => {
+      if (result[param.name] === undefined && param.defaultValue !== undefined) {
+        result[param.name] = param.defaultValue;
+      }
+    });
+    return result;
+  }, [parameters, values]);
+ 
+  // Update parent when initialValues changes
+  useEffect(() => {
+    const hasMissingDefaults = parameters.some(
+      (p) => values[p.name] === undefined && p.defaultValue !== undefined
+    );
+    if (hasMissingDefaults) {
+      onChange(initialValues);
+    }
+  }, [initialValues, parameters, values, onChange]);
+ 
+  const handleFieldChange = useCallback(
+    (paramName: string, value: unknown) => {
+      onChange({
+        ...values,
+        [paramName]: value,
+      });
+    },
+    [values, onChange]
+  );
+ 
+  const handleLoadPreset = useCallback(
+    (presetValues: Record<string, unknown>) => {
+      onChange({
+        ...values,
+        ...presetValues,
+      });
+    },
+    [values, onChange]
+  );
+ 
+  if (parameters.length === 0) {
+    return (
+      <div className="text-center py-4 text-gray-500 dark:text-gray-400 text-sm">
+        此自主能力无需参数配置。
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-4">
+      {/* Preset Manager */}
+      <PresetManager
+        presetKey={presetKey}
+        currentValues={values}
+        onLoadPreset={handleLoadPreset}
+      />
+ 
+      {/* Parameter Fields - Grid Layout */}
+      <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
+        {parameters.map((param) => (
+          <div
+            key={param.name}
+            className={param.type === 'textarea' || param.type === 'object' || param.type === 'array' ? 'md:col-span-2' : ''}
+          >
+            <ParameterField
+              param={param}
+              value={values[param.name]}
+              onChange={(value) => handleFieldChange(param.name, value)}
+              disabled={disabled}
+              externalError={errors?.[param.name]}
+            />
+          </div>
+        ))}
+      </div>
+    </div>
+  );
+}
+ 
+// === Validation Export ===
+ 
+export function validateAllParameters(
+  parameters: HandParameter[],
+  values: Record<string, unknown>
+): Record<string, string> {
+  const errors: Record<string, string> = {};
+ 
+  parameters.forEach((param) => {
+    const result = validateParameter(param, values[param.name]);
+    if (!result.isValid && result.error) {
+      errors[param.name] = result.error;
+    }
+  });
+ 
+  return errors;
+}
+ 
+export default HandParamsForm;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/HandTaskPanel.tsx.html b/desktop/coverage/src/components/HandTaskPanel.tsx.html new file mode 100644 index 0000000..dfcbc43 --- /dev/null +++ b/desktop/coverage/src/components/HandTaskPanel.tsx.html @@ -0,0 +1,1069 @@ + + + + + + Code coverage report for src/components/HandTaskPanel.tsx + + + + + + + + + +
+
+

All files / src/components HandTaskPanel.tsx

+
+ +
+ 0% + Statements + 0/234 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/234 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HandTaskPanel - Hand 任务和结果面板
+ *
+ * 显示选中 Hand 的任务清单、执行历史和结果。
+ * 使用真实 API 数据,移除了 Mock 数据。
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore, type Hand, type HandRun } from '../store/handStore';
+import {
+  Zap,
+  Loader2,
+  Clock,
+  CheckCircle,
+  XCircle,
+  AlertCircle,
+  ChevronRight,
+  Play,
+  ArrowLeft,
+  RefreshCw,
+} from 'lucide-react';
+import { useToast } from './ui/Toast';
+ 
+interface HandTaskPanelProps {
+  handId: string;
+  onBack?: () => void;
+}
+ 
+// 任务状态配置
+const RUN_STATUS_CONFIG: Record<string, { label: string; className: string; icon: React.ComponentType<{ className?: string }> }> = {
+  pending: { label: '等待中', className: 'text-gray-500 bg-gray-100', icon: Clock },
+  running: { label: '运行中', className: 'text-blue-600 bg-blue-100', icon: Loader2 },
+  completed: { label: '已完成', className: 'text-green-600 bg-green-100', icon: CheckCircle },
+  failed: { label: '失败', className: 'text-red-600 bg-red-100', icon: XCircle },
+  cancelled: { label: '已取消', className: 'text-gray-500 bg-gray-100', icon: XCircle },
+  needs_approval: { label: '待审批', className: 'text-yellow-600 bg-yellow-100', icon: AlertCircle },
+  success: { label: '成功', className: 'text-green-600 bg-green-100', icon: CheckCircle },
+  error: { label: '错误', className: 'text-red-600 bg-red-100', icon: XCircle },
+};
+ 
+export function HandTaskPanel({ handId, onBack }: HandTaskPanelProps) {
+  const hands = useHandStore((s) => s.hands);
+  const handRuns = useHandStore((s) => s.handRuns);
+  const loadHands = useHandStore((s) => s.loadHands);
+  const loadHandRuns = useHandStore((s) => s.loadHandRuns);
+  const triggerHand = useHandStore((s) => s.triggerHand);
+  const isLoading = useHandStore((s) => s.isLoading);
+  const { toast } = useToast();
+  const [selectedHand, setSelectedHand] = useState<Hand | null>(null);
+  const [isActivating, setIsActivating] = useState(false);
+  const [isRefreshing, setIsRefreshing] = useState(false);
+ 
+  // Load hands on mount
+  useEffect(() => {
+    loadHands();
+  }, [loadHands]);
+ 
+  // Find selected hand
+  useEffect(() => {
+    const hand = hands.find(h => h.id === handId || h.name === handId);
+    setSelectedHand(hand || null);
+  }, [hands, handId]);
+ 
+  // Load task history when hand is selected
+  useEffect(() => {
+    if (selectedHand) {
+      loadHandRuns(selectedHand.id, { limit: 50 });
+    }
+  }, [selectedHand, loadHandRuns]);
+ 
+  // Get runs for this hand from store
+  const tasks: HandRun[] = selectedHand ? (handRuns[selectedHand.id] || []) : [];
+ 
+  // Refresh task history
+  const handleRefresh = useCallback(async () => {
+    if (!selectedHand) return;
+    setIsRefreshing(true);
+    try {
+      await loadHandRuns(selectedHand.id, { limit: 50 });
+    } finally {
+      setIsRefreshing(false);
+    }
+  }, [selectedHand, loadHandRuns]);
+ 
+  // Trigger hand execution
+  const handleActivate = useCallback(async () => {
+    if (!selectedHand) return;
+ 
+    // Check if hand is already running
+    if (selectedHand.status === 'running') {
+      toast(`Hand "${selectedHand.name}" 正在运行中,请等待完成`, 'warning');
+      return;
+    }
+ 
+    setIsActivating(true);
+    console.log(`[HandTaskPanel] Activating hand: ${selectedHand.id} (${selectedHand.name})`);
+ 
+    try {
+      const result = await triggerHand(selectedHand.id);
+      console.log(`[HandTaskPanel] Activation result:`, result);
+ 
+      if (result) {
+        toast(`Hand "${selectedHand.name}" 已成功启动`, 'success');
+        // Refresh hands list and task history
+        await Promise.all([
+          loadHands(),
+          loadHandRuns(selectedHand.id, { limit: 50 }),
+        ]);
+      } else {
+        // Check for specific error in store
+        const storeError = useHandStore.getState().error;
+        if (storeError?.includes('already active')) {
+          toast(`Hand "${selectedHand.name}" 已在运行中`, 'warning');
+        } else {
+          toast(`Hand "${selectedHand.name}" 启动失败: ${storeError || '未知错误'}`, 'error');
+        }
+      }
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      console.error(`[HandTaskPanel] Activation error:`, errorMsg);
+ 
+      if (errorMsg.includes('already active')) {
+        toast(`Hand "${selectedHand.name}" 已在运行中`, 'warning');
+      } else {
+        toast(`Hand "${selectedHand.name}" 启动异常: ${errorMsg}`, 'error');
+      }
+    } finally {
+      setIsActivating(false);
+    }
+  }, [selectedHand, triggerHand, loadHands, loadHandRuns, toast]);
+ 
+  if (!selectedHand) {
+    return (
+      <div className="p-8 text-center">
+        <Zap className="w-12 h-12 mx-auto text-gray-300 mb-3" />
+        <p className="text-sm text-gray-400">请从左侧选择一个 Hand</p>
+      </div>
+    );
+  }
+ 
+  const runningTasks = tasks.filter(t => t.status === 'running');
+  const completedTasks = tasks.filter(t => ['completed', 'success', 'failed', 'error', 'cancelled'].includes(t.status));
+  const pendingTasks = tasks.filter(t => ['pending', 'needs_approval'].includes(t.status));
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* 头部 */}
+      <div className="p-4 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 flex-shrink-0">
+        <div className="flex items-center gap-3">
+          {onBack && (
+            <button
+              onClick={onBack}
+              className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors"
+            >
+              <ArrowLeft className="w-4 h-4" />
+            </button>
+          )}
+          <span className="text-2xl">{selectedHand.icon || '🤖'}</span>
+          <div className="flex-1 min-w-0">
+            <h2 className="text-lg font-semibold text-gray-900 dark:text-white truncate">
+              {selectedHand.name}
+            </h2>
+            <p className="text-xs text-gray-500 dark:text-gray-400 truncate">{selectedHand.description}</p>
+          </div>
+          <button
+            onClick={handleRefresh}
+            disabled={isRefreshing}
+            className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-50"
+            title="刷新"
+          >
+            <RefreshCw className={`w-4 h-4 ${isRefreshing ? 'animate-spin' : ''}`} />
+          </button>
+          <button
+            onClick={handleActivate}
+            disabled={selectedHand.status !== 'idle' || isActivating}
+            className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
+          >
+            {isActivating ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                启动中...
+              </>
+            ) : (
+              <>
+                <Play className="w-4 h-4" />
+                执行任务
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+ 
+      {/* 内容区域 */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-4">
+        {/* 加载状态 */}
+        {isLoading && tasks.length === 0 && (
+          <div className="text-center py-8">
+            <Loader2 className="w-8 h-8 mx-auto text-gray-400 animate-spin mb-3" />
+            <p className="text-sm text-gray-500 dark:text-gray-400">加载任务历史中...</p>
+          </div>
+        )}
+ 
+        {/* 运行中的任务 */}
+        {runningTasks.length > 0 && (
+          <div className="bg-blue-50 dark:bg-blue-900/20 rounded-lg p-4 border border-blue-200 dark:border-blue-800">
+            <h3 className="text-sm font-semibold text-blue-700 dark:text-blue-400 mb-3 flex items-center gap-2">
+              <Loader2 className="w-4 h-4 animate-spin" />
+              运行中 ({runningTasks.length})
+            </h3>
+            <div className="space-y-2">
+              {runningTasks.map(task => (
+                <TaskCard key={task.runId} task={task} />
+              ))}
+            </div>
+          </div>
+        )}
+ 
+        {/* 待处理任务 */}
+        {pendingTasks.length > 0 && (
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+            <h3 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3 flex items-center gap-2">
+              <Clock className="w-4 h-4" />
+              待处理 ({pendingTasks.length})
+            </h3>
+            <div className="space-y-2">
+              {pendingTasks.map(task => (
+                <TaskCard key={task.runId} task={task} />
+              ))}
+            </div>
+          </div>
+        )}
+ 
+        {/* 已完成任务 */}
+        {completedTasks.length > 0 && (
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+            <h3 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3">
+              历史记录 ({completedTasks.length})
+            </h3>
+            <div className="space-y-2">
+              {completedTasks.map(task => (
+                <TaskCard key={task.runId} task={task} expanded />
+              ))}
+            </div>
+          </div>
+        )}
+ 
+        {/* 空状态 */}
+        {!isLoading && tasks.length === 0 && (
+          <div className="text-center py-12">
+            <div className="w-16 h-16 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center mx-auto mb-4">
+              <Zap className="w-8 h-8 text-gray-400" />
+            </div>
+            <p className="text-sm text-gray-500 dark:text-gray-400 mb-1">暂无任务记录</p>
+            <p className="text-xs text-gray-400 dark:text-gray-500">
+              点击"执行任务"按钮开始运行
+            </p>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+// 任务卡片组件
+function TaskCard({ task, expanded = false }: { task: HandRun; expanded?: boolean }) {
+  const [isExpanded, setIsExpanded] = useState(expanded);
+  const config = RUN_STATUS_CONFIG[task.status] || RUN_STATUS_CONFIG.pending;
+  const StatusIcon = config.icon;
+ 
+  // Format result for display
+  const resultText = task.result
+    ? (typeof task.result === 'string' ? task.result : JSON.stringify(task.result, null, 2))
+    : undefined;
+ 
+  return (
+    <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3 border border-gray-100 dark:border-gray-700">
+      <div
+        className="flex items-center justify-between cursor-pointer"
+        onClick={() => setIsExpanded(!isExpanded)}
+      >
+        <div className="flex items-center gap-2 min-w-0">
+          <StatusIcon className={`w-4 h-4 flex-shrink-0 ${task.status === 'running' ? 'animate-spin' : ''}`} />
+          <span className="text-sm font-medium text-gray-800 dark:text-gray-200 truncate">
+            运行 #{task.runId.slice(0, 8)}
+          </span>
+        </div>
+        <div className="flex items-center gap-2 flex-shrink-0">
+          <span className={`text-xs px-2 py-0.5 rounded ${config.className}`}>
+            {config.label}
+          </span>
+          <ChevronRight className={`w-4 h-4 text-gray-400 transition-transform ${isExpanded ? 'rotate-90' : ''}`} />
+        </div>
+      </div>
+ 
+      {/* 展开详情 */}
+      {isExpanded && (
+        <div className="mt-3 pt-3 border-t border-gray-200 dark:border-gray-700 space-y-2 text-xs text-gray-500 dark:text-gray-400">
+          <div className="flex justify-between">
+            <span>运行 ID</span>
+            <span className="font-mono">{task.runId}</span>
+          </div>
+          <div className="flex justify-between">
+            <span>开始时间</span>
+            <span>{new Date(task.startedAt).toLocaleString()}</span>
+          </div>
+          {task.completedAt && (
+            <div className="flex justify-between">
+              <span>完成时间</span>
+              <span>{new Date(task.completedAt).toLocaleString()}</span>
+            </div>
+          )}
+          {resultText && (
+            <div className="mt-2 p-2 bg-green-50 dark:bg-green-900/20 rounded border border-green-200 dark:border-green-800 text-green-700 dark:text-green-400 whitespace-pre-wrap max-h-40 overflow-auto">
+              {resultText}
+            </div>
+          )}
+          {task.error && (
+            <div className="mt-2 p-2 bg-red-50 dark:bg-red-900/20 rounded border border-red-200 dark:border-red-800 text-red-700 dark:text-red-400">
+              {task.error}
+            </div>
+          )}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+export default HandTaskPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/HandsPanel.tsx.html b/desktop/coverage/src/components/HandsPanel.tsx.html new file mode 100644 index 0000000..8bef594 --- /dev/null +++ b/desktop/coverage/src/components/HandsPanel.tsx.html @@ -0,0 +1,2014 @@ + + + + + + Code coverage report for src/components/HandsPanel.tsx + + + + + + + + + +
+
+

All files / src/components HandsPanel.tsx

+
+ +
+ 0% + Statements + 0/449 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/449 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HandsPanel - OpenFang Hands Management UI
+ *
+ * Displays available OpenFang Hands (autonomous capability packages)
+ * with detailed status, requirements, and activation controls.
+ *
+ * Design based on OpenFang Dashboard v0.4.0
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore, type Hand, type HandRequirement } from '../store/handStore';
+import { Zap, RefreshCw, ChevronRight, CheckCircle, XCircle, Loader2, AlertTriangle, Settings, Play, Clock } from 'lucide-react';
+import { BrowserHandCard } from './BrowserHand';
+import type { HandParameter } from '../types/hands';
+import { HAND_DEFINITIONS } from '../types/hands';
+import { HandParamsForm } from './HandParamsForm';
+import { ApprovalsPanel } from './ApprovalsPanel';
+import { useToast } from './ui/Toast';
+ 
+// === Tab Type ===
+type TabType = 'hands' | 'approvals';
+ 
+// === Status Badge Component ===
+ 
+type HandStatus = 'idle' | 'running' | 'needs_approval' | 'error' | 'unavailable' | 'setup_needed';
+ 
+// === Parameter Validation Helper ===
+ 
+function validateAllParameters(
+  parameters: HandParameter[],
+  values: Record<string, unknown>
+): Record<string, string> {
+  const errors: Record<string, string> = {};
+  parameters.forEach(param => {
+    if (param.required) {
+      const value = values[param.name];
+      if (value === undefined || value === null || value === '') {
+        errors[param.name] = `${param.label} is required`;
+      }
+    }
+  });
+  return errors;
+}
+ 
+interface StatusConfig {
+  label: string;
+  className: string;
+  dotClass: string;
+}
+ 
+const STATUS_CONFIG: Record<HandStatus, StatusConfig> = {
+  idle: {
+    label: '就绪',
+    className: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+    dotClass: 'bg-green-500',
+  },
+  running: {
+    label: '运行中',
+    className: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',
+    dotClass: 'bg-blue-500 animate-pulse',
+  },
+  needs_approval: {
+    label: '待审批',
+    className: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
+    dotClass: 'bg-yellow-500',
+  },
+  error: {
+    label: '错误',
+    className: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+    dotClass: 'bg-red-500',
+  },
+  unavailable: {
+    label: '不可用',
+    className: 'bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400',
+    dotClass: 'bg-gray-400',
+  },
+  setup_needed: {
+    label: '需配置',
+    className: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400',
+    dotClass: 'bg-orange-500',
+  },
+};
+ 
+function HandStatusBadge({ status }: { status: string }) {
+  const config = STATUS_CONFIG[status as HandStatus] || STATUS_CONFIG.unavailable;
+  return (
+    <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium ${config.className}`}>
+      <span className={`w-1.5 h-1.5 rounded-full ${config.dotClass}`} />
+      {config.label}
+    </span>
+  );
+}
+ 
+// === Category Badge Component ===
+ 
+const CATEGORY_CONFIG: Record<string, { label: string; className: string }> = {
+  productivity: { label: '生产力', className: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400' },
+  data: { label: '数据', className: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400' },
+  content: { label: '内容', className: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400' },
+  communication: { label: '通信', className: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-400' },
+};
+ 
+function CategoryBadge({ category }: { category?: string }) {
+  if (!category) return null;
+  const config = CATEGORY_CONFIG[category] || { label: category, className: 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400' };
+  return (
+    <span className={`px-2 py-0.5 rounded text-xs ${config.className}`}>
+      {config.label}
+    </span>
+  );
+}
+ 
+// === Requirement Item Component ===
+ 
+function RequirementItem({ requirement }: { requirement: HandRequirement }) {
+  return (
+    <div className={`flex items-start gap-2 text-sm py-1 ${requirement.met ? 'text-green-700 dark:text-green-400' : 'text-red-600 dark:text-red-400'}`}>
+      <span className="flex-shrink-0 mt-0.5">
+        {requirement.met ? (
+          <CheckCircle className="w-4 h-4" />
+        ) : (
+          <XCircle className="w-4 h-4" />
+        )}
+      </span>
+      <div className="flex-1 min-w-0">
+        <span className="break-words">{requirement.description}</span>
+        {requirement.details && (
+          <span className="text-gray-400 dark:text-gray-500 text-xs ml-1">({requirement.details})</span>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+// === Hand Details Modal Component ===
+ 
+interface HandDetailsModalProps {
+  hand: Hand;
+  isOpen: boolean;
+  onClose: () => void;
+  onActivate: (params?: Record<string, unknown>) => void;
+  isActivating: boolean;
+}
+ 
+function HandDetailsModal({ hand, isOpen, onClose, onActivate, isActivating }: HandDetailsModalProps) {
+  // Get Hand parameters from definitions
+  const handDefinition = HAND_DEFINITIONS.find(h => h.id === hand.id);
+  const parameters: HandParameter[] = handDefinition?.parameters || [];
+ 
+  // Form state for parameters
+  const [paramValues, setParamValues] = useState<Record<string, unknown>>({});
+  const [paramErrors, setParamErrors] = useState<Record<string, string>>({});
+  const [showParamsForm, setShowParamsForm] = useState(false);
+ 
+  // Initialize default values
+  useEffect(() => {
+    if (parameters.length > 0) {
+      const defaults: Record<string, unknown> = {};
+      parameters.forEach(p => {
+        if (p.defaultValue !== undefined) {
+          defaults[p.name] = p.defaultValue;
+        }
+      });
+      setParamValues(defaults);
+    }
+  }, [parameters]);
+ 
+  // Reset form when modal opens/closes
+  useEffect(() => {
+    if (isOpen) {
+      setShowParamsForm(false);
+      setParamErrors({});
+    }
+  }, [isOpen]);
+ 
+  const handleActivateClick = useCallback(() => {
+    if (parameters.length > 0 && !showParamsForm) {
+      // Show params form first
+      setShowParamsForm(true);
+      return;
+    }
+ 
+    // Validate parameters if showing form
+    if (showParamsForm) {
+      const errors = validateAllParameters(parameters, paramValues);
+      setParamErrors(errors);
+      if (Object.keys(errors).length > 0) {
+        return;
+      }
+      // Pass parameters to onActivate
+      onActivate(paramValues);
+    } else {
+      onActivate();
+    }
+  }, [parameters, showParamsForm, paramValues, onActivate]);
+ 
+  if (!isOpen) return null;
+ 
+  const canActivate = hand.status === 'idle' || hand.status === 'setup_needed';
+  const hasUnmetRequirements = hand.requirements?.some(r => !r.met);
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-start justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+          <div className="flex items-center gap-3">
+            <span className="text-2xl">{hand.icon || '🤖'}</span>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">{hand.name}</h2>
+              <HandStatusBadge status={hand.status} />
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"
+          >
+            <span className="text-xl">&times;</span>
+          </button>
+        </div>
+ 
+        {/* Body */}
+        <div className="flex-1 overflow-y-auto p-4 space-y-4">
+          {/* Description */}
+          <p className="text-sm text-gray-600 dark:text-gray-400">{hand.description}</p>
+ 
+          {/* Agent Config */}
+          {(hand.provider || hand.model) && (
+            <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3">
+              <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2">
+                代理配置
+              </h3>
+              <div className="grid grid-cols-2 gap-3 text-sm">
+                {hand.provider && (
+                  <div>
+                    <span className="text-gray-500 dark:text-gray-400">提供商</span>
+                    <p className="font-medium text-gray-900 dark:text-white">{hand.provider}</p>
+                  </div>
+                )}
+                {hand.model && (
+                  <div>
+                    <span className="text-gray-500 dark:text-gray-400">模型</span>
+                    <p className="font-medium text-gray-900 dark:text-white">{hand.model}</p>
+                  </div>
+                )}
+              </div>
+            </div>
+          )}
+ 
+          {/* Requirements */}
+          {hand.requirements && hand.requirements.length > 0 && (
+            <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3">
+              <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2">
+                环境要求
+              </h3>
+              <div className="space-y-1">
+                {hand.requirements.map((req, idx) => (
+                  <RequirementItem key={idx} requirement={req} />
+                ))}
+              </div>
+            </div>
+          )}
+ 
+          {/* Tools */}
+          {hand.tools && hand.tools.length > 0 && (
+            <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3">
+              <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2">
+                工具 ({hand.tools.length})
+              </h3>
+              <div className="flex flex-wrap gap-1.5">
+                {hand.tools.map((tool, idx) => (
+                  <span
+                    key={idx}
+                    className="px-2 py-0.5 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded text-xs text-gray-700 dark:text-gray-300 font-mono"
+                  >
+                    {tool}
+                  </span>
+                ))}
+              </div>
+            </div>
+          )}
+ 
+          {/* Parameters Form (shown when activating) */}
+          {showParamsForm && parameters.length > 0 && (
+            <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3">
+              <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-3">
+                执行参数
+              </h3>
+              <HandParamsForm
+                parameters={parameters}
+                values={paramValues}
+                onChange={setParamValues}
+                errors={paramErrors}
+                disabled={isActivating}
+                presetKey={`hand-${hand.id}`}
+              />
+            </div>
+          )}
+ 
+          {/* Dashboard Metrics */}
+          {hand.metrics && hand.metrics.length > 0 && (
+            <div className="bg-gray-50 dark:bg-gray-900 rounded-lg p-3">
+              <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2">
+                仪表盘指标 ({hand.metrics.length})
+              </h3>
+              <div className="grid grid-cols-3 gap-2">
+                {hand.metrics.map((metric, idx) => (
+                  <div
+                    key={idx}
+                    className="bg-white dark:bg-gray-800 rounded p-2 text-center border border-gray-200 dark:border-gray-700"
+                  >
+                    <div className="text-xs text-gray-400 dark:text-gray-500 truncate">{metric}</div>
+                    <div className="text-lg font-semibold text-gray-400 dark:text-gray-500">-</div>
+                  </div>
+                ))}
+              </div>
+            </div>
+          )}
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700">
+          <button
+            onClick={showParamsForm ? () => setShowParamsForm(false) : onClose}
+            className="px-4 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
+          >
+            {showParamsForm ? '返回' : '关闭'}
+          </button>
+          <button
+            onClick={handleActivateClick}
+            disabled={!canActivate || hasUnmetRequirements || isActivating}
+            className="px-4 py-2 text-sm bg-gray-700 dark:bg-gray-600 text-white rounded-lg hover:bg-gray-800 dark:hover:bg-gray-500 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2"
+          >
+            {isActivating ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                激活中...
+              </>
+            ) : hasUnmetRequirements ? (
+              <>
+                <Settings className="w-4 h-4" />
+                需要配置
+              </>
+            ) : showParamsForm ? (
+              <>
+                <Play className="w-4 h-4" />
+                执行
+              </>
+            ) : (
+              <>
+                <Zap className="w-4 h-4" />
+                激活
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// === Hand Card Component ===
+ 
+interface HandCardProps {
+  hand: Hand;
+  onDetails: (hand: Hand) => void;
+  onActivate: (hand: Hand, params?: Record<string, unknown>) => void;
+  isActivating: boolean;
+}
+ 
+function HandCard({ hand, onDetails, onActivate, isActivating }: HandCardProps) {
+  const canActivate = hand.status === 'idle';
+  const hasUnmetRequirements = hand.requirements_met === false;
+ 
+  return (
+    <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4 shadow-sm hover:shadow-md transition-shadow">
+      {/* Header */}
+      <div className="flex items-start justify-between gap-3 mb-2">
+        <div className="flex items-center gap-2 min-w-0">
+          <span className="text-xl flex-shrink-0">{hand.icon || '🤖'}</span>
+          <h3 className="font-medium text-gray-900 dark:text-white truncate">{hand.name}</h3>
+        </div>
+        <HandStatusBadge status={hand.status} />
+      </div>
+ 
+      {/* Description */}
+      <p className="text-sm text-gray-600 dark:text-gray-400 mb-3 line-clamp-2">{hand.description}</p>
+ 
+      {/* Requirements Summary (if any unmet) */}
+      {hasUnmetRequirements && (
+        <div className="mb-3 p-2 bg-orange-50 dark:bg-orange-900/20 rounded border border-orange-200 dark:border-orange-800">
+          <div className="flex items-center gap-2 text-orange-700 dark:text-orange-400 text-xs font-medium">
+            <AlertTriangle className="w-3.5 h-3.5" />
+            <span>部分环境要求未满足</span>
+          </div>
+        </div>
+      )}
+ 
+      {/* Meta Info */}
+      <div className="flex items-center gap-3 text-xs text-gray-500 dark:text-gray-400 mb-3">
+        {hand.toolCount !== undefined && (
+          <span>{hand.toolCount} 个工具</span>
+        )}
+        {hand.metricCount !== undefined && (
+          <span>{hand.metricCount} 个指标</span>
+        )}
+        {hand.category && (
+          <CategoryBadge category={hand.category} />
+        )}
+      </div>
+ 
+      {/* Actions */}
+      <div className="flex items-center gap-2">
+        <button
+          onClick={() => onDetails(hand)}
+          className="px-3 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 flex items-center gap-1"
+        >
+          详情
+          <ChevronRight className="w-3.5 h-3.5" />
+        </button>
+        <button
+          onClick={() => onActivate(hand)}
+          disabled={!canActivate || hasUnmetRequirements || isActivating}
+          className="px-3 py-1.5 text-sm bg-gray-700 dark:bg-gray-600 text-white rounded-md hover:bg-gray-800 dark:hover:bg-gray-500 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1"
+        >
+          {isActivating ? (
+            <>
+              <Loader2 className="w-3.5 h-3.5 animate-spin" />
+              激活中...
+            </>
+          ) : hand.status === 'running' ? (
+            <>
+              <Loader2 className="w-3.5 h-3.5 animate-spin" />
+              运行中...
+            </>
+          ) : (
+            <>
+              <Zap className="w-3.5 h-3.5" />
+              激活
+            </>
+          )}
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+// === Main HandsPanel Component ===
+ 
+export function HandsPanel() {
+  const { hands, loadHands, triggerHand, isLoading, error: storeError, getHandDetails } = useHandStore();
+  const [selectedHand, setSelectedHand] = useState<Hand | null>(null);
+  const [activatingHandId, setActivatingHandId] = useState<string | null>(null);
+  const [showModal, setShowModal] = useState(false);
+  const [activeTab, setActiveTab] = useState<TabType>('hands');
+  const { toast } = useToast();
+ 
+  useEffect(() => {
+    loadHands();
+  }, [loadHands]);
+ 
+  const handleDetails = useCallback(async (hand: Hand) => {
+    // Load full details before showing modal
+    const details = await getHandDetails(hand.id);
+    setSelectedHand(details || hand);
+    setShowModal(true);
+  }, [getHandDetails]);
+ 
+  const handleActivate = useCallback(async (hand: Hand, params?: Record<string, unknown>) => {
+    setActivatingHandId(hand.id);
+    console.log(`[HandsPanel] Activating hand: ${hand.id} (${hand.name})`, params ? 'with params:' : '', params);
+ 
+    try {
+      const result = await triggerHand(hand.id, params);
+      console.log(`[HandsPanel] Hand activation result:`, result);
+ 
+      if (result) {
+        toast(`Hand "${hand.name}" 已成功激活`, 'success');
+        // Refresh hands after activation
+        await loadHands();
+      } else {
+        // Check if there's an error in the store
+        const errorMsg = storeError || '激活失败,请检查后端连接';
+        console.error(`[HandsPanel] Hand activation failed:`, errorMsg);
+        toast(`Hand "${hand.name}" 激活失败: ${errorMsg}`, 'error');
+      }
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      console.error(`[HandsPanel] Hand activation error:`, errorMsg);
+      toast(`Hand "${hand.name}" 激活异常: ${errorMsg}`, 'error');
+    } finally {
+      setActivatingHandId(null);
+    }
+  }, [triggerHand, loadHands, toast, storeError]);
+ 
+  const handleCloseModal = useCallback(() => {
+    setShowModal(false);
+    setSelectedHand(null);
+  }, []);
+ 
+  const handleModalActivate = useCallback(async (params?: Record<string, unknown>) => {
+    if (!selectedHand) return;
+    setShowModal(false);
+    await handleActivate(selectedHand, params);
+  }, [selectedHand, handleActivate]);
+ 
+  if (isLoading && hands.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <Loader2 className="w-6 h-6 animate-spin mx-auto text-gray-400 mb-2" />
+        <p className="text-sm text-gray-500 dark:text-gray-400">加载 Hands 中...</p>
+      </div>
+    );
+  }
+ 
+  if (hands.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <div className="w-12 h-12 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center mx-auto mb-3">
+          <Zap className="w-6 h-6 text-gray-400" />
+        </div>
+        <p className="text-sm text-gray-500 dark:text-gray-400 mb-3">暂无可用的 Hands</p>
+        <p className="text-xs text-gray-400 dark:text-gray-500">
+          请连接到 OpenFang 以查看可用的自主能力包。
+        </p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-4">
+      {/* Header */}
+      <div className="flex items-center justify-between">
+        <div>
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            Hands
+          </h2>
+          <p className="text-xs text-gray-500 dark:text-gray-400">
+            自主能力包
+          </p>
+        </div>
+        <button
+          onClick={() => loadHands()}
+          disabled={isLoading}
+          className="text-sm text-blue-600 dark:text-blue-400 hover:underline flex items-center gap-1 disabled:opacity-50"
+        >
+          {isLoading ? (
+            <Loader2 className="w-3.5 h-3.5 animate-spin" />
+          ) : (
+            <RefreshCw className="w-3.5 h-3.5" />
+          )}
+          刷新
+        </button>
+      </div>
+ 
+      {/* Tabs */}
+      <div className="flex border-b border-gray-200 dark:border-gray-700">
+        <button
+          onClick={() => setActiveTab('hands')}
+          className={`flex items-center gap-1.5 px-4 py-2 text-sm font-medium border-b-2 transition-colors ${
+            activeTab === 'hands'
+              ? 'text-orange-600 dark:text-orange-400 border-orange-500'
+              : 'text-gray-500 dark:text-gray-400 border-transparent hover:text-gray-700 dark:hover:text-gray-300'
+          }`}
+        >
+          <Zap className="w-4 h-4" />
+          能力包
+        </button>
+        <button
+          onClick={() => setActiveTab('approvals')}
+          className={`flex items-center gap-1.5 px-4 py-2 text-sm font-medium border-b-2 transition-colors ${
+            activeTab === 'approvals'
+              ? 'text-orange-600 dark:text-orange-400 border-orange-500'
+              : 'text-gray-500 dark:text-gray-400 border-transparent hover:text-gray-700 dark:hover:text-gray-300'
+          }`}
+        >
+          <Clock className="w-4 h-4" />
+          审批历史
+        </button>
+      </div>
+ 
+      {/* Tab Content */}
+      {activeTab === 'approvals' ? (
+        <ApprovalsPanel />
+      ) : (
+        <>
+          {/* Stats */}
+          <div className="flex items-center gap-4 text-sm">
+            <span className="text-gray-500 dark:text-gray-400">
+              可用 <span className="font-medium text-gray-900 dark:text-white">{hands.length}</span>
+            </span>
+            <span className="text-gray-500 dark:text-gray-400">
+              就绪 <span className="font-medium text-green-600 dark:text-green-400">{hands.filter(h => h.status === 'idle').length}</span>
+            </span>
+          </div>
+ 
+          {/* Hand Cards Grid */}
+          <div className="grid gap-3">
+            {hands.map((hand) => {
+              // Check if this is a Browser Hand
+              const isBrowserHand = hand.id === 'browser' || hand.name === 'Browser' || hand.name?.toLowerCase().includes('browser');
+ 
+          return isBrowserHand ? (
+            <BrowserHandCard
+              key={hand.id}
+              hand={hand}
+            />
+          ) : (
+            <HandCard
+              key={hand.id}
+              hand={hand}
+              onDetails={handleDetails}
+              onActivate={handleActivate}
+              isActivating={activatingHandId === hand.id}
+            />
+          );
+        })}
+        </div>
+ 
+        {/* Details Modal */}
+        {selectedHand && (
+          <HandDetailsModal
+            hand={selectedHand}
+            isOpen={showModal}
+            onClose={handleCloseModal}
+            onActivate={handleModalActivate}
+            isActivating={activatingHandId === selectedHand.id}
+          />
+        )}
+      </>
+      )}
+    </div>
+  );
+}
+ 
+export default HandsPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/HeartbeatConfig.tsx.html b/desktop/coverage/src/components/HeartbeatConfig.tsx.html new file mode 100644 index 0000000..f5a5695 --- /dev/null +++ b/desktop/coverage/src/components/HeartbeatConfig.tsx.html @@ -0,0 +1,1702 @@ + + + + + + Code coverage report for src/components/HeartbeatConfig.tsx + + + + + + + + + +
+
+

All files / src/components HeartbeatConfig.tsx

+
+ +
+ 0% + Statements + 0/403 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/403 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HeartbeatConfig - Configuration UI for periodic proactive checks
+ *
+ * Allows users to configure:
+ * - Heartbeat interval (default 30 minutes)
+ * - Enable/disable built-in check items
+ * - Quiet hours (no notifications during sleep time)
+ * - Proactivity level (silent/light/standard/autonomous)
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { useState, useCallback, useEffect } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Heart,
+  Settings,
+  Clock,
+  Moon,
+  Sun,
+  Volume2,
+  VolumeX,
+  AlertTriangle,
+  CheckCircle,
+  Info,
+  RefreshCw,
+} from 'lucide-react';
+import {
+  intelligenceClient,
+  type HeartbeatConfig as HeartbeatConfigType,
+  type HeartbeatResult,
+  type HeartbeatAlert,
+} from '../lib/intelligence-client';
+ 
+// === Default Config ===
+ 
+const DEFAULT_HEARTBEAT_CONFIG: HeartbeatConfigType = {
+  enabled: false,
+  interval_minutes: 30,
+  quiet_hours_start: null,
+  quiet_hours_end: null,
+  notify_channel: 'ui',
+  proactivity_level: 'standard',
+  max_alerts_per_tick: 5,
+};
+ 
+// === Types ===
+ 
+interface HeartbeatConfigProps {
+  className?: string;
+  onConfigChange?: (config: HeartbeatConfigType) => void;
+}
+ 
+type ProactivityLevel = 'silent' | 'light' | 'standard' | 'autonomous';
+ 
+// === Proactivity Level Config ===
+ 
+const PROACTIVITY_CONFIG: Record<ProactivityLevel, { label: string; description: string; icon: typeof Moon }> = {
+  silent: {
+    label: '静默',
+    description: '从不主动推送,仅被动响应',
+    icon: VolumeX,
+  },
+  light: {
+    label: '轻度',
+    description: '仅紧急事项推送(如定时任务完成)',
+    icon: Volume2,
+  },
+  standard: {
+    label: '标准',
+    description: '定期巡检 + 任务通知 + 建议推送',
+    icon: AlertTriangle,
+  },
+  autonomous: {
+    label: '自主',
+    description: 'Agent 自行判断何时推送',
+    icon: Heart,
+  },
+};
+ 
+// === Check Item Config ===
+ 
+interface CheckItemConfig {
+  id: string;
+  name: string;
+  description: string;
+  enabled: boolean;
+}
+ 
+const BUILT_IN_CHECKS: CheckItemConfig[] = [
+  {
+    id: 'pending-tasks',
+    name: '待办任务检查',
+    description: '检查是否有未完成的任务需要跟进',
+    enabled: true,
+  },
+  {
+    id: 'memory-health',
+    name: '记忆健康检查',
+    description: '检查记忆存储是否过大需要清理',
+    enabled: true,
+  },
+  {
+    id: 'idle-greeting',
+    name: '空闲问候',
+    description: '长时间未使用时发送简短问候',
+    enabled: false,
+  },
+];
+ 
+// === Components ===
+ 
+function ProactivityLevelSelector({
+  value,
+  onChange,
+}: {
+  value: ProactivityLevel;
+  onChange: (level: ProactivityLevel) => void;
+}) {
+  return (
+    <div className="grid grid-cols-2 gap-2">
+      {(Object.keys(PROACTIVITY_CONFIG) as ProactivityLevel[]).map((level) => {
+        const config = PROACTIVITY_CONFIG[level];
+        const Icon = config.icon;
+        const isSelected = value === level;
+ 
+        return (
+          <button
+            key={level}
+            onClick={() => onChange(level)}
+            className={`flex items-start gap-2 p-3 rounded-lg border transition-all text-left ${
+              isSelected
+                ? 'border-purple-500 bg-purple-50 dark:bg-purple-900/30'
+                : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+            }`}
+          >
+            <Icon
+              className={`w-4 h-4 mt-0.5 flex-shrink-0 ${
+                isSelected ? 'text-purple-500' : 'text-gray-400'
+              }`}
+            />
+            <div>
+              <div
+                className={`text-sm font-medium ${
+                  isSelected ? 'text-purple-700 dark:text-purple-400' : 'text-gray-700 dark:text-gray-300'
+                }`}
+              >
+                {config.label}
+              </div>
+              <div className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+                {config.description}
+              </div>
+            </div>
+          </button>
+        );
+      })}
+    </div>
+  );
+}
+ 
+function QuietHoursConfig({
+  start,
+  end,
+  onStartChange,
+  onEndChange,
+  enabled,
+  onToggle,
+}: {
+  start?: string;
+  end?: string;
+  onStartChange: (time: string) => void;
+  onEndChange: (time: string) => void;
+  enabled: boolean;
+  onToggle: (enabled: boolean) => void;
+}) {
+  return (
+    <div className="space-y-3">
+      <div className="flex items-center justify-between">
+        <div className="flex items-center gap-2">
+          <Moon className="w-4 h-4 text-indigo-500" />
+          <span className="text-sm font-medium text-gray-700 dark:text-gray-300">免打扰时段</span>
+        </div>
+        <button
+          onClick={() => onToggle(!enabled)}
+          className={`relative w-10 h-5 rounded-full transition-colors ${
+            enabled ? 'bg-purple-500' : 'bg-gray-300 dark:bg-gray-600'
+          }`}
+        >
+          <motion.div
+            animate={{ x: enabled ? 20 : 0 }}
+            className="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow"
+          />
+        </button>
+      </div>
+ 
+      <AnimatePresence>
+        {enabled && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="flex items-center gap-3 pl-6"
+          >
+            <div className="flex items-center gap-2">
+              <Sun className="w-3 h-3 text-gray-400" />
+              <input
+                type="time"
+                value={end || '08:00'}
+                onChange={(e) => onEndChange(e.target.value)}
+                className="px-2 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100"
+              />
+            </div>
+            <span className="text-gray-400">至</span>
+            <div className="flex items-center gap-2">
+              <Moon className="w-3 h-3 text-gray-400" />
+              <input
+                type="time"
+                value={start || '22:00'}
+                onChange={(e) => onStartChange(e.target.value)}
+                className="px-2 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100"
+              />
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+function CheckItemToggle({
+  item,
+  onToggle,
+}: {
+  item: CheckItemConfig;
+  onToggle: (enabled: boolean) => void;
+}) {
+  return (
+    <div className="flex items-center justify-between py-2">
+      <div className="flex-1 min-w-0">
+        <div className="text-sm font-medium text-gray-700 dark:text-gray-300">
+          {item.name}
+        </div>
+        <div className="text-xs text-gray-500 dark:text-gray-400 truncate">
+          {item.description}
+        </div>
+      </div>
+      <button
+        onClick={() => onToggle(!item.enabled)}
+        className={`relative w-9 h-5 rounded-full transition-colors ${
+          item.enabled ? 'bg-green-500' : 'bg-gray-300 dark:bg-gray-600'
+        }`}
+      >
+        <motion.div
+          animate={{ x: item.enabled ? 18 : 0 }}
+          className="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow"
+        />
+      </button>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function HeartbeatConfig({ className = '', onConfigChange }: HeartbeatConfigProps) {
+  const [config, setConfig] = useState<HeartbeatConfigType>(DEFAULT_HEARTBEAT_CONFIG);
+  const [checkItems, setCheckItems] = useState<CheckItemConfig[]>(BUILT_IN_CHECKS);
+  const [lastResult, setLastResult] = useState<HeartbeatResult | null>(null);
+  const [isTesting, setIsTesting] = useState(false);
+  const [hasChanges, setHasChanges] = useState(false);
+ 
+  // Load saved config
+  useEffect(() => {
+    const saved = localStorage.getItem('zclaw-heartbeat-config');
+    if (saved) {
+      try {
+        const parsed = JSON.parse(saved);
+        setConfig({ ...DEFAULT_HEARTBEAT_CONFIG, ...parsed });
+      } catch {
+        // Use defaults
+      }
+    }
+ 
+    const savedChecks = localStorage.getItem('zclaw-heartbeat-checks');
+    if (savedChecks) {
+      try {
+        setCheckItems(JSON.parse(savedChecks));
+      } catch {
+        // Use defaults
+      }
+    }
+  }, []);
+ 
+  const updateConfig = useCallback(
+    (updates: Partial<HeartbeatConfigType>) => {
+      setConfig((prev) => {
+        const next = { ...prev, ...updates };
+        setHasChanges(true);
+        onConfigChange?.(next);
+        return next;
+      });
+    },
+    [onConfigChange]
+  );
+ 
+  const toggleCheckItem = useCallback((id: string, enabled: boolean) => {
+    setCheckItems((prev) => {
+      const next = prev.map((item) =>
+        item.id === id ? { ...item, enabled } : item
+      );
+      setHasChanges(true);
+      return next;
+    });
+  }, []);
+ 
+  const handleSave = useCallback(() => {
+    localStorage.setItem('zclaw-heartbeat-config', JSON.stringify(config));
+    localStorage.setItem('zclaw-heartbeat-checks', JSON.stringify(checkItems));
+    setHasChanges(false);
+  }, [config, checkItems]);
+ 
+  const handleTestHeartbeat = useCallback(async () => {
+    setIsTesting(true);
+    try {
+      await intelligenceClient.heartbeat.init('zclaw-main', config);
+      const result = await intelligenceClient.heartbeat.tick('zclaw-main');
+      setLastResult(result);
+    } catch (error) {
+      console.error('[HeartbeatConfig] Test failed:', error);
+    } finally {
+      setIsTesting(false);
+    }
+  }, [config]);
+ 
+  return (
+    <div className={`flex flex-col h-full ${className}`}>
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Heart className="w-5 h-5 text-pink-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-gray-100">心跳配置</h2>
+        </div>
+        <div className="flex items-center gap-2">
+          <button
+            onClick={handleTestHeartbeat}
+            disabled={isTesting || !config.enabled}
+            className="flex items-center gap-1 px-3 py-1.5 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 disabled:opacity-50"
+          >
+            <RefreshCw className={`w-4 h-4 ${isTesting ? 'animate-spin' : ''}`} />
+            测试
+          </button>
+          <button
+            onClick={handleSave}
+            disabled={!hasChanges}
+            className="px-3 py-1.5 text-sm bg-pink-500 hover:bg-pink-600 disabled:bg-gray-300 disabled:cursor-not-allowed text-white rounded-lg transition-colors"
+          >
+            保存
+          </button>
+        </div>
+      </div>
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-6">
+        {/* Enable Toggle */}
+        <div className="flex items-center justify-between p-4 bg-gray-50 dark:bg-gray-800/50 rounded-lg">
+          <div className="flex items-center gap-3">
+            <div
+              className={`w-10 h-10 rounded-full flex items-center justify-center ${
+                config.enabled
+                  ? 'bg-pink-100 dark:bg-pink-900/30'
+                  : 'bg-gray-200 dark:bg-gray-700'
+              }`}
+            >
+              <Heart
+                className={`w-5 h-5 ${
+                  config.enabled ? 'text-pink-500' : 'text-gray-400'
+                }`}
+              />
+            </div>
+            <div>
+              <div className="text-sm font-medium text-gray-900 dark:text-gray-100">
+                启用主动巡检
+              </div>
+              <div className="text-xs text-gray-500 dark:text-gray-400">
+                Agent 将定期检查并主动推送通知
+              </div>
+            </div>
+          </div>
+          <button
+            onClick={() => updateConfig({ enabled: !config.enabled })}
+            className={`relative w-12 h-6 rounded-full transition-colors ${
+              config.enabled ? 'bg-pink-500' : 'bg-gray-300 dark:bg-gray-600'
+            }`}
+          >
+            <motion.div
+              animate={{ x: config.enabled ? 26 : 0 }}
+              className="absolute top-0.5 left-0.5 w-5 h-5 bg-white rounded-full shadow"
+            />
+          </button>
+        </div>
+ 
+        <AnimatePresence>
+          {config.enabled && (
+            <motion.div
+              initial={{ height: 0, opacity: 0 }}
+              animate={{ height: 'auto', opacity: 1 }}
+              exit={{ height: 0, opacity: 0 }}
+              className="space-y-6"
+            >
+              {/* Interval */}
+              <div className="space-y-2">
+                <div className="flex items-center gap-2">
+                  <Clock className="w-4 h-4 text-gray-500" />
+                  <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+                    巡检间隔
+                  </span>
+                </div>
+                <div className="flex items-center gap-2 pl-6">
+                  <input
+                    type="range"
+                    min="5"
+                    max="120"
+                    step="5"
+                    value={config.interval_minutes}
+                    onChange={(e) => updateConfig({ interval_minutes: parseInt(e.target.value) })}
+                    className="flex-1 h-2 bg-gray-200 dark:bg-gray-700 rounded-lg appearance-none cursor-pointer accent-pink-500"
+                  />
+                  <span className="text-sm font-medium text-gray-900 dark:text-gray-100 w-16 text-right">
+                    {config.interval_minutes} 分钟
+                  </span>
+                </div>
+              </div>
+ 
+              {/* Proactivity Level */}
+              <div className="space-y-2">
+                <div className="flex items-center gap-2">
+                  <AlertTriangle className="w-4 h-4 text-gray-500" />
+                  <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+                    主动性级别
+                  </span>
+                </div>
+                <div className="pl-6">
+                  <ProactivityLevelSelector
+                    value={config.proactivity_level}
+                    onChange={(level) => updateConfig({ proactivity_level: level })}
+                  />
+                </div>
+              </div>
+ 
+              {/* Quiet Hours */}
+              <div className="space-y-2">
+                <QuietHoursConfig
+                  start={config.quiet_hours_start ?? undefined}
+                  end={config.quiet_hours_end ?? undefined}
+                  enabled={!!config.quiet_hours_start}
+                  onStartChange={(time) => updateConfig({ quiet_hours_start: time })}
+                  onEndChange={(time) => updateConfig({ quiet_hours_end: time })}
+                  onToggle={(enabled) =>
+                    updateConfig({
+                      quiet_hours_start: enabled ? '22:00' : null,
+                      quiet_hours_end: enabled ? '08:00' : null,
+                    })
+                  }
+                />
+              </div>
+ 
+              {/* Check Items */}
+              <div className="space-y-2">
+                <div className="flex items-center gap-2">
+                  <Settings className="w-4 h-4 text-gray-500" />
+                  <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+                    检查项目
+                  </span>
+                </div>
+                <div className="pl-6 space-y-1 border-l-2 border-gray-200 dark:border-gray-700">
+                  {checkItems.map((item) => (
+                    <CheckItemToggle
+                      key={item.id}
+                      item={item}
+                      onToggle={(enabled) => toggleCheckItem(item.id, enabled)}
+                    />
+                  ))}
+                </div>
+              </div>
+ 
+              {/* Last Result */}
+              {lastResult && (
+                <div className="p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg">
+                  <div className="flex items-center gap-2 mb-2">
+                    {lastResult.status === 'ok' ? (
+                      <CheckCircle className="w-4 h-4 text-green-500" />
+                    ) : (
+                      <AlertTriangle className="w-4 h-4 text-yellow-500" />
+                    )}
+                    <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+                      上次测试结果
+                    </span>
+                  </div>
+                  <div className="text-xs text-gray-500 dark:text-gray-400">
+                    检查了 {lastResult.checked_items} 项
+                    {lastResult.alerts.length > 0 && ` · ${lastResult.alerts.length} 个提醒`}
+                  </div>
+                  {lastResult.alerts.length > 0 && (
+                    <div className="mt-2 space-y-1">
+                      {lastResult.alerts.map((alert: HeartbeatAlert, i: number) => (
+                        <div
+                          key={i}
+                          className={`text-xs p-2 rounded ${
+                            alert.urgency === 'high'
+                              ? 'bg-red-50 dark:bg-red-900/20 text-red-600 dark:text-red-400'
+                              : alert.urgency === 'medium'
+                              ? 'bg-yellow-50 dark:bg-yellow-900/20 text-yellow-600 dark:text-yellow-400'
+                              : 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400'
+                          }`}
+                        >
+                          <span className="font-medium">{alert.title}:</span> {alert.content}
+                        </div>
+                      ))}
+                    </div>
+                  )}
+                </div>
+              )}
+            </motion.div>
+          )}
+        </AnimatePresence>
+ 
+        {/* Info */}
+        <div className="flex items-start gap-2 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg text-xs text-blue-600 dark:text-blue-400">
+          <Info className="w-4 h-4 flex-shrink-0 mt-0.5" />
+          <p>
+            心跳机制让 Agent 具备主动意识,能够定期检查任务状态、记忆健康度等,并根据主动性级别推送通知。
+            在"自主"模式下,Agent 将自行判断是否需要通知你。
+          </p>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default HeartbeatConfig;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/IdentityChangeProposal.tsx.html b/desktop/coverage/src/components/IdentityChangeProposal.tsx.html new file mode 100644 index 0000000..1f70685 --- /dev/null +++ b/desktop/coverage/src/components/IdentityChangeProposal.tsx.html @@ -0,0 +1,1585 @@ + + + + + + Code coverage report for src/components/IdentityChangeProposal.tsx + + + + + + + + + +
+
+

All files / src/components IdentityChangeProposal.tsx

+
+ +
+ 0% + Statements + 0/355 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/355 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Identity Change Proposal Component
+ *
+ * Displays pending personality change proposals with:
+ * - Side-by-side diff view
+ * - Accept/Reject buttons
+ * - Reason explanation
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { useState, useEffect, useMemo } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Check,
+  X,
+  FileText,
+  Clock,
+  AlertCircle,
+  ChevronDown,
+  ChevronUp,
+  Sparkles,
+  History,
+} from 'lucide-react';
+import {
+  intelligenceClient,
+  type IdentityChangeProposal as Proposal,
+  type IdentitySnapshot,
+} from '../lib/intelligence-client';
+import { useChatStore } from '../store/chatStore';
+import { Button, Badge } from './ui';
+ 
+// === Error Parsing Utility ===
+ 
+type ProposalOperation = 'approval' | 'rejection' | 'restore';
+ 
+function parseProposalError(err: unknown, operation: ProposalOperation): string {
+  const errorMessage = err instanceof Error ? err.message : String(err);
+ 
+  if (errorMessage.includes('not found') || errorMessage.includes('不存在')) {
+    return '提案不存在或已被处理,请刷新页面';
+  }
+  if (errorMessage.includes('not pending') || errorMessage.includes('已处理')) {
+    return '该提案已被处理,请刷新页面';
+  }
+  if (errorMessage.includes('network') || errorMessage.includes('fetch') || errorMessage.includes('网络')) {
+    return '网络连接失败,请检查网络后重试';
+  }
+  if (errorMessage.includes('timeout') || errorMessage.includes('超时')) {
+    return '操作超时,请重试';
+  }
+ 
+  const operationName = operation === 'approval' ? '审批' : operation === 'rejection' ? '拒绝' : '恢复';
+  return `${operationName}失败: ${errorMessage}`;
+}
+ 
+// === Diff View Component ===
+ 
+function DiffView({
+  current,
+  proposed,
+}: {
+  current: string;
+  proposed: string;
+}) {
+  const currentLines = useMemo(() => current.split('\n'), [current]);
+  const proposedLines = useMemo(() => proposed.split('\n'), [proposed]);
+ 
+  // Simple line-by-line diff
+  const maxLines = Math.max(currentLines.length, proposedLines.length);
+  const diffLines: Array<{
+    type: 'unchanged' | 'added' | 'removed' | 'modified';
+    current?: string;
+    proposed?: string;
+    lineNum: number;
+  }> = [];
+ 
+  // Build a simple diff - for a production system, use a proper diff algorithm
+  // Note: currentSet/proposedSet could be used for advanced diff algorithms
+  // const currentSet = new Set(currentLines);
+  // const proposedSet = new Set(proposedLines);
+ 
+  for (let i = 0; i < maxLines; i++) {
+    const currLine = currentLines[i];
+    const propLine = proposedLines[i];
+ 
+    if (currLine === propLine) {
+      diffLines.push({ type: 'unchanged', current: currLine, proposed: propLine, lineNum: i + 1 });
+    } else if (currLine === undefined) {
+      diffLines.push({ type: 'added', proposed: propLine, lineNum: i + 1 });
+    } else if (propLine === undefined) {
+      diffLines.push({ type: 'removed', current: currLine, lineNum: i + 1 });
+    } else {
+      diffLines.push({ type: 'modified', current: currLine, proposed: propLine, lineNum: i + 1 });
+    }
+  }
+ 
+  return (
+    <div className="grid grid-cols-2 gap-2 text-xs font-mono">
+      {/* Current */}
+      <div className="rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden">
+        <div className="bg-red-50 dark:bg-red-900/20 px-2 py-1 text-red-700 dark:text-red-300 font-sans font-medium border-b border-red-100 dark:border-red-800">
+          当前版本
+        </div>
+        <div className="bg-gray-50 dark:bg-gray-800/50 max-h-64 overflow-y-auto">
+          {diffLines.map((line, idx) => (
+            <div
+              key={idx}
+              className={`px-2 py-0.5 ${
+                line.type === 'removed'
+                  ? 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300'
+                  : line.type === 'modified'
+                  ? 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-300'
+                  : 'text-gray-600 dark:text-gray-400'
+              }`}
+            >
+              {line.type === 'removed' && <span className="text-red-500 mr-1">-</span>}
+              {line.type === 'modified' && <span className="text-yellow-500 mr-1">~</span>}
+              {line.current || '\u00A0'}
+            </div>
+          ))}
+        </div>
+      </div>
+ 
+      {/* Proposed */}
+      <div className="rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden">
+        <div className="bg-green-50 dark:bg-green-900/20 px-2 py-1 text-green-700 dark:text-green-300 font-sans font-medium border-b border-green-100 dark:border-green-800">
+          建议版本
+        </div>
+        <div className="bg-gray-50 dark:bg-gray-800/50 max-h-64 overflow-y-auto">
+          {diffLines.map((line, idx) => (
+            <div
+              key={idx}
+              className={`px-2 py-0.5 ${
+                line.type === 'added'
+                  ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300'
+                  : line.type === 'modified'
+                  ? 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-300'
+                  : 'text-gray-600 dark:text-gray-400'
+              }`}
+            >
+              {line.type === 'added' && <span className="text-green-500 mr-1">+</span>}
+              {line.type === 'modified' && <span className="text-yellow-500 mr-1">~</span>}
+              {line.proposed || '\u00A0'}
+            </div>
+          ))}
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// === Single Proposal Card ===
+ 
+function ProposalCard({
+  proposal,
+  onApprove,
+  onReject,
+  isProcessing,
+}: {
+  proposal: Proposal;
+  onApprove: () => void;
+  onReject: () => void;
+  isProcessing: boolean;
+}) {
+  const [expanded, setExpanded] = useState(true);
+ 
+  const fileLabel = proposal.file === 'soul' ? 'SOUL.md' : 'Instructions';
+  const timeAgo = getTimeAgo(proposal.created_at);
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, y: 10 }}
+      animate={{ opacity: 1, y: 0 }}
+      exit={{ opacity: 0, y: -10 }}
+      className="rounded-xl border border-orange-200 dark:border-orange-800 bg-orange-50/50 dark:bg-orange-900/10 overflow-hidden"
+    >
+      {/* Header */}
+      <div
+        className="px-4 py-3 flex items-center justify-between cursor-pointer hover:bg-orange-100/50 dark:hover:bg-orange-900/20 transition-colors"
+        onClick={() => setExpanded(!expanded)}
+      >
+        <div className="flex items-center gap-3">
+          <div className="w-8 h-8 rounded-lg bg-orange-100 dark:bg-orange-900/30 flex items-center justify-center">
+            <Sparkles className="w-4 h-4 text-orange-600 dark:text-orange-400" />
+          </div>
+          <div>
+            <div className="flex items-center gap-2">
+              <span className="text-sm font-medium text-gray-900 dark:text-gray-100">
+                人格变更提案
+              </span>
+              <Badge variant="warning" className="text-xs">
+                {fileLabel}
+              </Badge>
+            </div>
+            <div className="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+              <Clock className="w-3 h-3" />
+              <span>{timeAgo}</span>
+            </div>
+          </div>
+        </div>
+        <div className="flex items-center gap-2">
+          {expanded ? (
+            <ChevronUp className="w-4 h-4 text-gray-400" />
+          ) : (
+            <ChevronDown className="w-4 h-4 text-gray-400" />
+          )}
+        </div>
+      </div>
+ 
+      {/* Content */}
+      <AnimatePresence>
+        {expanded && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            transition={{ duration: 0.2 }}
+            className="overflow-hidden"
+          >
+            <div className="px-4 pb-4 space-y-4">
+              {/* Reason */}
+              <div className="rounded-lg bg-white dark:bg-gray-800 p-3 border border-gray-200 dark:border-gray-700">
+                <div className="text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">
+                  变更原因
+                </div>
+                <p className="text-sm text-gray-700 dark:text-gray-300">{proposal.reason}</p>
+              </div>
+ 
+              {/* Diff View */}
+              <DiffView
+                current={proposal.current_content}
+                proposed={proposal.suggested_content}
+              />
+ 
+              {/* Actions */}
+              <div className="flex items-center justify-end gap-2 pt-2">
+                <Button
+                  variant="outline"
+                  size="sm"
+                  onClick={onReject}
+                  disabled={isProcessing}
+                  className="text-red-600 border-red-200 hover:bg-red-50 dark:border-red-800 dark:hover:bg-red-900/20"
+                >
+                  <X className="w-4 h-4 mr-1" />
+                  拒绝
+                </Button>
+                <Button
+                  variant="primary"
+                  size="sm"
+                  onClick={onApprove}
+                  disabled={isProcessing}
+                  className="bg-green-600 hover:bg-green-700"
+                >
+                  <Check className="w-4 h-4 mr-1" />
+                  接受
+                </Button>
+              </div>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </motion.div>
+  );
+}
+ 
+// === Evolution History Item ===
+ 
+function HistoryItem({
+  snapshot,
+  onRestore,
+  isRestoring,
+}: {
+  snapshot: IdentitySnapshot;
+  onRestore: () => void;
+  isRestoring: boolean;
+}) {
+  const timeAgo = getTimeAgo(snapshot.timestamp);
+ 
+  return (
+    <div className="flex items-start gap-3 p-3 rounded-lg bg-gray-50 dark:bg-gray-800/50 border border-gray-100 dark:border-gray-700">
+      <div className="w-8 h-8 rounded-lg bg-gray-200 dark:bg-gray-700 flex items-center justify-center flex-shrink-0">
+        <History className="w-4 h-4 text-gray-500 dark:text-gray-400" />
+      </div>
+      <div className="flex-1 min-w-0">
+        <div className="flex items-center justify-between gap-2">
+          <span className="text-xs text-gray-500 dark:text-gray-400">{timeAgo}</span>
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={onRestore}
+            disabled={isRestoring}
+            className="text-xs text-gray-500 hover:text-orange-600"
+          >
+            恢复
+          </Button>
+        </div>
+        <p className="text-sm text-gray-700 dark:text-gray-300 mt-1 truncate">
+          {snapshot.reason || '自动快照'}
+        </p>
+      </div>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function IdentityChangeProposalPanel() {
+  const { currentAgent } = useChatStore();
+  const [proposals, setProposals] = useState<Proposal[]>([]);
+  const [snapshots, setSnapshots] = useState<IdentitySnapshot[]>([]);
+  const [loading, setLoading] = useState(true);
+  const [processingId, setProcessingId] = useState<string | null>(null);
+  const [error, setError] = useState<string | null>(null);
+ 
+  const agentId = currentAgent?.id;
+ 
+  // Load data
+  useEffect(() => {
+    if (!agentId) return;
+ 
+    const loadData = async () => {
+      setLoading(true);
+      setError(null);
+      try {
+        const [pendingProposals, agentSnapshots] = await Promise.all([
+          intelligenceClient.identity.getPendingProposals(agentId),
+          intelligenceClient.identity.getSnapshots(agentId, 10),
+        ]);
+        setProposals(pendingProposals);
+        setSnapshots(agentSnapshots);
+      } catch (err) {
+        console.error('[IdentityChangeProposal] Failed to load data:', err);
+        setError('加载失败');
+      } finally {
+        setLoading(false);
+      }
+    };
+ 
+    loadData();
+  }, [agentId]);
+ 
+  const handleApprove = async (proposalId: string) => {
+    if (!agentId) return;
+    setProcessingId(proposalId);
+    setError(null);
+    try {
+      await intelligenceClient.identity.approveProposal(proposalId);
+      // Refresh data
+      const [pendingProposals, agentSnapshots] = await Promise.all([
+        intelligenceClient.identity.getPendingProposals(agentId),
+        intelligenceClient.identity.getSnapshots(agentId, 10),
+      ]);
+      setProposals(pendingProposals);
+      setSnapshots(agentSnapshots);
+    } catch (err) {
+      console.error('[IdentityChangeProposal] Failed to approve:', err);
+      setError(parseProposalError(err, 'approval'));
+    } finally {
+      setProcessingId(null);
+    }
+  };
+ 
+  const handleReject = async (proposalId: string) => {
+    if (!agentId) return;
+    setProcessingId(proposalId);
+    setError(null);
+    try {
+      await intelligenceClient.identity.rejectProposal(proposalId);
+      // Refresh proposals
+      const pendingProposals = await intelligenceClient.identity.getPendingProposals(agentId);
+      setProposals(pendingProposals);
+    } catch (err) {
+      console.error('[IdentityChangeProposal] Failed to reject:', err);
+      setError(parseProposalError(err, 'rejection'));
+    } finally {
+      setProcessingId(null);
+    }
+  };
+ 
+  const handleRestore = async (snapshotId: string) => {
+    if (!agentId) return;
+    setProcessingId(snapshotId);
+    setError(null);
+    try {
+      await intelligenceClient.identity.restoreSnapshot(agentId, snapshotId);
+      // Refresh snapshots
+      const agentSnapshots = await intelligenceClient.identity.getSnapshots(agentId, 10);
+      setSnapshots(agentSnapshots);
+    } catch (err) {
+      console.error('[IdentityChangeProposal] Failed to restore:', err);
+      setError(parseProposalError(err, 'restore'));
+    } finally {
+      setProcessingId(null);
+    }
+  };
+ 
+  if (!agentId) {
+    return (
+      <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+        <FileText className="w-8 h-8 mx-auto mb-2 opacity-50" />
+        <p className="text-sm">请先选择一个 Agent</p>
+      </div>
+    );
+  }
+ 
+  if (loading) {
+    return (
+      <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+        <div className="animate-pulse">加载中...</div>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-6">
+      {/* Error */}
+      {error && (
+        <div className="flex items-center gap-2 p-3 rounded-lg bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 text-sm">
+          <AlertCircle className="w-4 h-4" />
+          {error}
+        </div>
+      )}
+ 
+      {/* Pending Proposals */}
+      <div>
+        <h3 className="text-sm font-semibold text-gray-900 dark:text-gray-100 mb-3 flex items-center gap-2">
+          <Sparkles className="w-4 h-4 text-orange-500" />
+          待审批提案
+          {proposals.length > 0 && (
+            <Badge variant="warning" className="text-xs">
+              {proposals.length}
+            </Badge>
+          )}
+        </h3>
+ 
+        {proposals.length === 0 ? (
+          <div className="text-center py-6 text-gray-500 dark:text-gray-400 text-sm bg-gray-50 dark:bg-gray-800/50 rounded-lg border border-gray-100 dark:border-gray-700">
+            暂无待审批的人格变更提案
+          </div>
+        ) : (
+          <div className="space-y-3">
+            <AnimatePresence>
+              {proposals.map((proposal) => (
+                <ProposalCard
+                  key={proposal.id}
+                  proposal={proposal}
+                  onApprove={() => handleApprove(proposal.id)}
+                  onReject={() => handleReject(proposal.id)}
+                  isProcessing={processingId === proposal.id}
+                />
+              ))}
+            </AnimatePresence>
+          </div>
+        )}
+      </div>
+ 
+      {/* Evolution History */}
+      <div>
+        <h3 className="text-sm font-semibold text-gray-900 dark:text-gray-100 mb-3 flex items-center gap-2">
+          <History className="w-4 h-4 text-gray-500" />
+          演化历史
+        </h3>
+ 
+        {snapshots.length === 0 ? (
+          <div className="text-center py-6 text-gray-500 dark:text-gray-400 text-sm bg-gray-50 dark:bg-gray-800/50 rounded-lg border border-gray-100 dark:border-gray-700">
+            暂无演化历史
+          </div>
+        ) : (
+          <div className="space-y-2">
+            {snapshots.map((snapshot) => (
+              <HistoryItem
+                key={snapshot.id}
+                snapshot={snapshot}
+                onRestore={() => handleRestore(snapshot.id)}
+                isRestoring={processingId === snapshot.id}
+              />
+            ))}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+// === Helper ===
+ 
+function getTimeAgo(timestamp: string): string {
+  const now = Date.now();
+  const then = new Date(timestamp).getTime();
+  const diff = now - then;
+ 
+  if (diff < 60000) return '刚刚';
+  if (diff < 3600000) return `${Math.floor(diff / 60000)} 分钟前`;
+  if (diff < 86400000) return `${Math.floor(diff / 3600000)} 小时前`;
+  if (diff < 604800000) return `${Math.floor(diff / 86400000)} 天前`;
+  return new Date(timestamp).toLocaleDateString('zh-CN');
+}
+ 
+export default IdentityChangeProposalPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/MemoryGraph.tsx.html b/desktop/coverage/src/components/MemoryGraph.tsx.html new file mode 100644 index 0000000..c89583b --- /dev/null +++ b/desktop/coverage/src/components/MemoryGraph.tsx.html @@ -0,0 +1,1942 @@ + + + + + + Code coverage report for src/components/MemoryGraph.tsx + + + + + + + + + +
+
+

All files / src/components MemoryGraph.tsx

+
+ +
+ 0% + Statements + 0/440 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/440 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * MemoryGraph - 记忆图谱可视化组件
+ *
+ * 使用 Canvas 实现力导向图布局,展示记忆之间的关联关系。
+ *
+ * 功能:
+ * - 力导向布局算法
+ * - 节点拖拽
+ * - 类型筛选
+ * - 搜索高亮
+ * - 导出图片
+ */
+ 
+import { useCallback, useEffect, useRef, useState } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  ZoomIn,
+  ZoomOut,
+  Maximize2,
+  Download,
+  Search,
+  Filter,
+  X,
+  RefreshCw,
+  Tag,
+  Clock,
+  Star,
+} from 'lucide-react';
+import { Button, Badge } from './ui';
+import {
+  useMemoryGraphStore,
+  type GraphNode,
+  type GraphEdge,
+  type MemoryType,
+} from '../store/memoryGraphStore';
+import { useChatStore } from '../store/chatStore';
+import { cardHover, defaultTransition } from '../lib/animations';
+ 
+// Mark as intentionally unused for future use
+void cardHover;
+void defaultTransition;
+ 
+// === Constants ===
+ 
+const NODE_COLORS: Record<MemoryType, { fill: string; stroke: string; text: string }> = {
+  fact: { fill: '#3b82f6', stroke: '#1d4ed8', text: '#ffffff' },
+  preference: { fill: '#f59e0b', stroke: '#d97706', text: '#ffffff' },
+  lesson: { fill: '#10b981', stroke: '#059669', text: '#ffffff' },
+  context: { fill: '#8b5cf6', stroke: '#7c3aed', text: '#ffffff' },
+  task: { fill: '#ef4444', stroke: '#dc2626', text: '#ffffff' },
+};
+ 
+const TYPE_LABELS: Record<MemoryType, string> = {
+  fact: '事实',
+  preference: '偏好',
+  lesson: '经验',
+  context: '上下文',
+  task: '任务',
+};
+ 
+const NODE_RADIUS = 20;
+const REPULSION_STRENGTH = 5000;
+const ATTRACTION_STRENGTH = 0.01;
+const DAMPING = 0.9;
+const MIN_VELOCITY = 0.01;
+ 
+// === Force-Directed Layout ===
+ 
+function simulateStep(
+  nodes: GraphNode[],
+  edges: GraphEdge[],
+  width: number,
+  height: number
+): GraphNode[] {
+  const updatedNodes = nodes.map(node => ({ ...node }));
+ 
+  // 斥力 (节点间)
+  for (let i = 0; i < updatedNodes.length; i++) {
+    for (let j = i + 1; j < updatedNodes.length; j++) {
+      const n1 = updatedNodes[i];
+      const n2 = updatedNodes[j];
+      const dx = n2.x - n1.x;
+      const dy = n2.y - n1.y;
+      const dist = Math.sqrt(dx * dx + dy * dy) || 1;
+      const force = REPULSION_STRENGTH / (dist * dist);
+ 
+      const fx = (dx / dist) * force;
+      const fy = (dy / dist) * force;
+ 
+      n1.vx -= fx;
+      n1.vy -= fy;
+      n2.vx += fx;
+      n2.vy += fy;
+    }
+  }
+ 
+  // 引力 (边)
+  for (const edge of edges) {
+    const source = updatedNodes.find(n => n.id === edge.source);
+    const target = updatedNodes.find(n => n.id === edge.target);
+    if (!source || !target) continue;
+ 
+    const dx = target.x - source.x;
+    const dy = target.y - source.y;
+    const dist = Math.sqrt(dx * dx + dy * dy) || 1;
+    const force = dist * ATTRACTION_STRENGTH * edge.strength;
+ 
+    const fx = (dx / dist) * force;
+    const fy = (dy / dist) * force;
+ 
+    source.vx += fx;
+    source.vy += fy;
+    target.vx -= fx;
+    target.vy -= fy;
+  }
+ 
+  // 中心引力
+  const centerX = width / 2;
+  const centerY = height / 2;
+  const centerForce = 0.001;
+ 
+  for (const node of updatedNodes) {
+    node.vx += (centerX - node.x) * centerForce;
+    node.vy += (centerY - node.y) * centerForce;
+  }
+ 
+  // 更新位置
+  for (const node of updatedNodes) {
+    node.vx *= DAMPING;
+    node.vy *= DAMPING;
+ 
+    if (Math.abs(node.vx) < MIN_VELOCITY) node.vx = 0;
+    if (Math.abs(node.vy) < MIN_VELOCITY) node.vy = 0;
+ 
+    node.x += node.vx;
+    node.y += node.vy;
+ 
+    // 边界约束
+    node.x = Math.max(NODE_RADIUS, Math.min(width - NODE_RADIUS, node.x));
+    node.y = Math.max(NODE_RADIUS, Math.min(height - NODE_RADIUS, node.y));
+  }
+ 
+  return updatedNodes;
+}
+ 
+// === Main Component ===
+ 
+interface MemoryGraphProps {
+  className?: string;
+}
+ 
+export function MemoryGraph({ className = '' }: MemoryGraphProps) {
+  const canvasRef = useRef<HTMLCanvasElement>(null);
+  const animationRef = useRef<number | null>(null);
+  const [isDragging, setIsDragging] = useState(false);
+  const [dragNode, setDragNode] = useState<string | null>(null);
+  const [showFilters, setShowFilters] = useState(false);
+  const [searchQuery, setSearchQuery] = useState('');
+ 
+  const { currentAgent } = useChatStore();
+  const agentId = currentAgent?.id || 'zclaw-main';
+ 
+  const {
+    isLoading,
+    error,
+    filter,
+    layout,
+    selectedNodeId,
+    showLabels,
+    simulationRunning,
+    loadGraph,
+    setFilter,
+    resetFilter,
+    setLayout,
+    selectNode,
+    toggleLabels,
+    startSimulation,
+    stopSimulation,
+    updateNodePositions,
+    highlightSearch,
+    getFilteredNodes,
+    getFilteredEdges,
+  } = useMemoryGraphStore();
+ 
+  const filteredNodes = getFilteredNodes();
+  const filteredEdges = getFilteredEdges();
+ 
+  // 加载图谱
+  useEffect(() => {
+    loadGraph(agentId);
+  }, [agentId, loadGraph]);
+ 
+  // 力导向模拟
+  useEffect(() => {
+    if (!simulationRunning || filteredNodes.length === 0) return;
+ 
+    const canvas = canvasRef.current;
+    if (!canvas) return;
+ 
+    const simulate = () => {
+      const updated = simulateStep(filteredNodes, filteredEdges, layout.width, layout.height);
+      updateNodePositions(updated.map(n => ({ id: n.id, x: n.x, y: n.y })));
+      animationRef.current = requestAnimationFrame(simulate);
+    };
+ 
+    animationRef.current = requestAnimationFrame(simulate);
+ 
+    return () => {
+      if (animationRef.current) {
+        cancelAnimationFrame(animationRef.current);
+      }
+    };
+  }, [simulationRunning, filteredNodes.length, filteredEdges, layout.width, layout.height, updateNodePositions]);
+ 
+  // Canvas 渲染
+  useEffect(() => {
+    const canvas = canvasRef.current;
+    if (!canvas) return;
+ 
+    const ctx = canvas.getContext('2d');
+    if (!ctx) return;
+ 
+    const dpr = window.devicePixelRatio || 1;
+    canvas.width = layout.width * dpr;
+    canvas.height = layout.height * dpr;
+    ctx.scale(dpr, dpr);
+ 
+    // 清空画布 - 使用浅色背景匹配系统主题
+    ctx.fillStyle = '#f9fafb'; // gray-50
+    ctx.fillRect(0, 0, layout.width, layout.height);
+ 
+    // 应用变换
+    ctx.save();
+    ctx.translate(layout.offsetX, layout.offsetY);
+    ctx.scale(layout.zoom, layout.zoom);
+ 
+    // 绘制边
+    for (const edge of filteredEdges) {
+      const source = filteredNodes.find(n => n.id === edge.source);
+      const target = filteredNodes.find(n => n.id === edge.target);
+      if (!source || !target) continue;
+ 
+      ctx.beginPath();
+      ctx.moveTo(source.x, source.y);
+      ctx.lineTo(target.x, target.y);
+      ctx.strokeStyle = edge.type === 'reference'
+        ? 'rgba(59, 130, 246, 0.5)'
+        : edge.type === 'related'
+        ? 'rgba(245, 158, 11, 0.3)'
+        : 'rgba(139, 92, 246, 0.2)';
+      ctx.lineWidth = edge.strength * 3;
+      ctx.stroke();
+    }
+ 
+    // 绘制节点
+    for (const node of filteredNodes) {
+      const colors = NODE_COLORS[node.type];
+      const isSelected = node.id === selectedNodeId;
+      const radius = isSelected ? NODE_RADIUS * 1.3 : NODE_RADIUS;
+ 
+      // 高亮效果
+      if (node.isHighlighted) {
+        ctx.beginPath();
+        ctx.arc(node.x, node.y, radius + 8, 0, Math.PI * 2);
+        ctx.fillStyle = 'rgba(255, 255, 255, 0.2)';
+        ctx.fill();
+      }
+ 
+      // 节点圆形
+      ctx.beginPath();
+      ctx.arc(node.x, node.y, radius, 0, Math.PI * 2);
+      ctx.fillStyle = colors.fill;
+      ctx.fill();
+      ctx.strokeStyle = colors.stroke;
+      ctx.lineWidth = isSelected ? 3 : 1;
+      ctx.stroke();
+ 
+      // 节点标签
+      if (showLabels) {
+        ctx.font = '10px Inter, system-ui, sans-serif';
+        ctx.fillStyle = colors.text;
+        ctx.textAlign = 'center';
+        ctx.textBaseline = 'middle';
+        const text = node.label.slice(0, 10);
+        ctx.fillText(text, node.x, node.y);
+      }
+    }
+ 
+    ctx.restore();
+ 
+    // 图例
+    const legendY = 20;
+    let legendX = 20;
+    ctx.font = '12px Inter, system-ui, sans-serif';
+ 
+    for (const [type, label] of Object.entries(TYPE_LABELS)) {
+      const colors = NODE_COLORS[type as MemoryType];
+      ctx.beginPath();
+      ctx.arc(legendX, legendY, 6, 0, Math.PI * 2);
+      ctx.fillStyle = colors.fill;
+      ctx.fill();
+      ctx.fillStyle = '#6b7280'; // gray-500 for better visibility on light background
+      ctx.textAlign = 'left';
+      ctx.fillText(label, legendX + 12, legendY + 4);
+      legendX += 70;
+    }
+ 
+  }, [filteredNodes, filteredEdges, layout, selectedNodeId, showLabels]);
+ 
+  // 鼠标事件处理
+  const handleMouseDown = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {
+    const canvas = canvasRef.current;
+    if (!canvas) return;
+ 
+    const rect = canvas.getBoundingClientRect();
+    const x = (e.clientX - rect.left - layout.offsetX) / layout.zoom;
+    const y = (e.clientY - rect.top - layout.offsetY) / layout.zoom;
+ 
+    // 检查是否点击了节点
+    for (const node of filteredNodes) {
+      const dx = x - node.x;
+      const dy = y - node.y;
+      if (dx * dx + dy * dy < NODE_RADIUS * NODE_RADIUS) {
+        setDragNode(node.id);
+        setIsDragging(true);
+        selectNode(node.id);
+        return;
+      }
+    }
+ 
+    selectNode(null);
+  }, [filteredNodes, layout, selectNode]);
+ 
+  const handleMouseMove = useCallback((e: React.MouseEvent<HTMLCanvasElement>) => {
+    if (!isDragging || !dragNode) return;
+ 
+    const canvas = canvasRef.current;
+    if (!canvas) return;
+ 
+    const rect = canvas.getBoundingClientRect();
+    const x = (e.clientX - rect.left - layout.offsetX) / layout.zoom;
+    const y = (e.clientY - rect.top - layout.offsetY) / layout.zoom;
+ 
+    updateNodePositions([{ id: dragNode, x, y }]);
+  }, [isDragging, dragNode, layout, updateNodePositions]);
+ 
+  const handleMouseUp = useCallback(() => {
+    setIsDragging(false);
+    setDragNode(null);
+  }, []);
+ 
+  const handleWheel = useCallback((e: React.WheelEvent<HTMLCanvasElement>) => {
+    e.preventDefault();
+    const delta = e.deltaY > 0 ? 0.9 : 1.1;
+    const newZoom = Math.max(0.2, Math.min(3, layout.zoom * delta));
+    setLayout({ zoom: newZoom });
+  }, [layout.zoom, setLayout]);
+ 
+  const handleSearch = useCallback((query: string) => {
+    setSearchQuery(query);
+    highlightSearch(query);
+  }, [highlightSearch]);
+ 
+  const handleExport = useCallback(async () => {
+    const canvas = canvasRef.current;
+    if (!canvas) return;
+ 
+    const dataUrl = canvas.toDataURL('image/png');
+    const a = document.createElement('a');
+    a.href = dataUrl;
+    a.download = `memory-graph-${new Date().toISOString().slice(0, 10)}.png`;
+    a.click();
+  }, []);
+ 
+  const selectedNode = filteredNodes.find(n => n.id === selectedNodeId);
+ 
+  return (
+    <div className={`flex flex-col h-full ${className}`}>
+      {/* 工具栏 */}
+      <div className="flex items-center gap-2 p-2 bg-gray-100 dark:bg-gray-800/50 rounded-t-lg border-b border-gray-200 dark:border-gray-700">
+        {/* 搜索框 */}
+        <div className="relative flex-1 max-w-xs">
+          <Search className="absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
+          <input
+            type="text"
+            placeholder="搜索记忆..."
+            value={searchQuery}
+            onChange={(e) => handleSearch(e.target.value)}
+            className="w-full pl-8 pr-2 py-1 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded text-sm text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:border-orange-400 dark:focus:border-blue-500"
+          />
+        </div>
+ 
+        {/* 筛选按钮 */}
+        <Button
+          variant={showFilters ? 'primary' : 'ghost'}
+          size="sm"
+          onClick={() => setShowFilters(!showFilters)}
+          className="flex items-center gap-1"
+        >
+          <Filter className="w-4 h-4" />
+          筛选
+        </Button>
+ 
+        {/* 缩放控制 */}
+        <div className="flex items-center gap-1 border-l border-gray-700 pl-2">
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={() => setLayout({ zoom: Math.max(0.2, layout.zoom * 0.8) })}
+          >
+            <ZoomOut className="w-4 h-4" />
+          </Button>
+          <span className="text-xs text-gray-400 min-w-[3rem] text-center">
+            {Math.round(layout.zoom * 100)}%
+          </span>
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={() => setLayout({ zoom: Math.min(3, layout.zoom * 1.2) })}
+          >
+            <ZoomIn className="w-4 h-4" />
+          </Button>
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={() => setLayout({ zoom: 1, offsetX: 0, offsetY: 0 })}
+          >
+            <Maximize2 className="w-4 h-4" />
+          </Button>
+        </div>
+ 
+        {/* 模拟控制 */}
+        <div className="flex items-center gap-1 border-l border-gray-700 pl-2">
+          <Button
+            variant={simulationRunning ? 'primary' : 'ghost'}
+            size="sm"
+            onClick={() => simulationRunning ? stopSimulation() : startSimulation()}
+          >
+            <RefreshCw className={`w-4 h-4 ${simulationRunning ? 'animate-spin' : ''}`} />
+            {simulationRunning ? '停止' : '布局'}
+          </Button>
+        </div>
+ 
+        {/* 导出 */}
+        <Button variant="ghost" size="sm" onClick={handleExport}>
+          <Download className="w-4 h-4" />
+        </Button>
+ 
+        {/* 标签切换 */}
+        <Button variant="ghost" size="sm" onClick={toggleLabels}>
+          <Tag className="w-4 h-4" />
+        </Button>
+      </div>
+ 
+      {/* 筛选面板 */}
+      <AnimatePresence>
+        {showFilters && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="overflow-hidden bg-gray-50 dark:bg-gray-800/30 border-b border-gray-200 dark:border-gray-700"
+          >
+            <div className="p-3 flex flex-wrap gap-3">
+              {/* 类型筛选 */}
+              <div className="flex items-center gap-2">
+                <span className="text-xs text-gray-400">类型:</span>
+                {(Object.keys(TYPE_LABELS) as MemoryType[]).map(type => (
+                  <button
+                    key={type}
+                    onClick={() => {
+                      const types = filter.types.includes(type)
+                        ? filter.types.filter(t => t !== type)
+                        : [...filter.types, type];
+                      setFilter({ types });
+                    }}
+                    className={`px-2 py-1 text-xs rounded ${
+                      filter.types.includes(type)
+                        ? 'bg-orange-500 text-white'
+                        : 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300'
+                    }`}
+                  >
+                    {TYPE_LABELS[type]}
+                  </button>
+                ))}
+              </div>
+ 
+              {/* 重要性筛选 */}
+              <div className="flex items-center gap-2">
+                <span className="text-xs text-gray-400">重要性:</span>
+                <input
+                  type="range"
+                  min="0"
+                  max="10"
+                  value={filter.minImportance}
+                  onChange={(e) => setFilter({ minImportance: parseInt(e.target.value) })}
+                  className="w-20"
+                />
+                <span className="text-xs text-gray-300">{filter.minImportance}+</span>
+              </div>
+ 
+              {/* 重置 */}
+              <Button variant="ghost" size="sm" onClick={resetFilter}>
+                <X className="w-3 h-3 mr-1" />
+                重置
+              </Button>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+ 
+      {/* 图谱画布 */}
+      <div className="flex-1 relative overflow-hidden bg-gray-50 dark:bg-gray-900">
+        {isLoading && (
+          <div className="absolute inset-0 flex items-center justify-center bg-gray-50/80 dark:bg-gray-900/80 z-10">
+            <RefreshCw className="w-8 h-8 text-blue-500 animate-spin" />
+          </div>
+        )}
+ 
+        {error && (
+          <div className="absolute inset-0 flex items-center justify-center">
+            <div className="text-red-400 text-sm">{error}</div>
+          </div>
+        )}
+ 
+        <canvas
+          ref={canvasRef}
+          style={{ width: layout.width, height: layout.height }}
+          className="cursor-grab active:cursor-grabbing"
+          onMouseDown={handleMouseDown}
+          onMouseMove={handleMouseMove}
+          onMouseUp={handleMouseUp}
+          onMouseLeave={handleMouseUp}
+          onWheel={handleWheel}
+        />
+ 
+        {/* 节点详情面板 */}
+        <AnimatePresence>
+          {selectedNode && (
+            <motion.div
+              initial={{ opacity: 0, x: 20 }}
+              animate={{ opacity: 1, x: 0 }}
+              exit={{ opacity: 0, x: 20 }}
+              className="absolute top-4 right-4 w-64 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4 shadow-xl"
+            >
+              <div className="flex items-center justify-between mb-3">
+                <Badge variant={selectedNode.type as any}>
+                  {TYPE_LABELS[selectedNode.type]}
+                </Badge>
+                <button
+                  onClick={() => selectNode(null)}
+                  className="text-gray-400 hover:text-gray-600 dark:hover:text-white"
+                >
+                  <X className="w-4 h-4" />
+                </button>
+              </div>
+ 
+              <p className="text-sm text-gray-200 mb-3">{selectedNode.label}</p>
+ 
+              <div className="space-y-2 text-xs text-gray-500 dark:text-gray-400">
+                <div className="flex items-center gap-2">
+                  <Star className="w-3 h-3" />
+                  重要性: {selectedNode.importance}
+                </div>
+                <div className="flex items-center gap-2">
+                  <Clock className="w-3 h-3" />
+                  访问次数: {selectedNode.accessCount}
+                </div>
+                <div className="flex items-center gap-2">
+                  <Tag className="w-3 h-3" />
+                  创建: {new Date(selectedNode.createdAt).toLocaleDateString()}
+                </div>
+              </div>
+ 
+              {/* 关联边统计 */}
+              <div className="mt-3 pt-3 border-t border-gray-200 dark:border-gray-700">
+                <div className="text-xs text-gray-500 dark:text-gray-400 mb-1">关联记忆:</div>
+                <div className="text-sm text-gray-700 dark:text-gray-200">
+                  {filteredEdges.filter(
+                    e => e.source === selectedNode.id || e.target === selectedNode.id
+                  ).length} 个
+                </div>
+              </div>
+            </motion.div>
+          )}
+        </AnimatePresence>
+ 
+        {/* 空状态 */}
+        {!isLoading && filteredNodes.length === 0 && (
+          <div className="absolute inset-0 flex items-center justify-center">
+            <div className="text-center text-gray-500">
+              <Tag className="w-12 h-12 mx-auto mb-2 opacity-50" />
+              <p>暂无记忆数据</p>
+              <p className="text-sm mt-1">开始对话后将自动记录记忆</p>
+            </div>
+          </div>
+        )}
+      </div>
+ 
+      {/* 状态栏 */}
+      <div className="flex items-center justify-between px-3 py-1 bg-gray-100 dark:bg-gray-800/50 rounded-b-lg text-xs text-gray-500 dark:text-gray-400">
+        <div className="flex items-center gap-4">
+          <span>节点: {filteredNodes.length}</span>
+          <span>关联: {filteredEdges.length}</span>
+        </div>
+        <div className="flex items-center gap-2">
+          {simulationRunning && (
+            <span className="flex items-center gap-1 text-green-400">
+              <RefreshCw className="w-3 h-3 animate-spin" />
+              布局中...
+            </span>
+          )}
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default MemoryGraph;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/MemoryPanel.tsx.html b/desktop/coverage/src/components/MemoryPanel.tsx.html new file mode 100644 index 0000000..2e0b146 --- /dev/null +++ b/desktop/coverage/src/components/MemoryPanel.tsx.html @@ -0,0 +1,1222 @@ + + + + + + Code coverage report for src/components/MemoryPanel.tsx + + + + + + + + + +
+
+

All files / src/components MemoryPanel.tsx

+
+ +
+ 0% + Statements + 0/309 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/309 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useCallback, useEffect, useState } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Brain, Search, Trash2, Download, Star, Tag, Clock,
+  ChevronDown, ChevronUp,
+} from 'lucide-react';
+import { cardHover, defaultTransition } from '../lib/animations';
+import { Button, Badge, EmptyState } from './ui';
+import {
+  intelligenceClient,
+  type MemoryEntry,
+  type MemoryType,
+  type MemoryStats,
+} from '../lib/intelligence-client';
+import { useChatStore } from '../store/chatStore';
+ 
+const TYPE_LABELS: Record<MemoryType, { label: string; emoji: string; color: string }> = {
+  fact: { label: '事实', emoji: '📋', color: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' },
+  preference: { label: '偏好', emoji: '⭐', color: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300' },
+  lesson: { label: '经验', emoji: '💡', color: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300' },
+  context: { label: '上下文', emoji: '📌', color: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300' },
+  task: { label: '任务', emoji: '📝', color: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300' },
+};
+ 
+export function MemoryPanel() {
+  const { currentAgent } = useChatStore();
+  const agentId = currentAgent?.id || 'zclaw-main';
+ 
+  const [memories, setMemories] = useState<MemoryEntry[]>([]);
+  const [stats, setStats] = useState<MemoryStats | null>(null);
+  const [searchQuery, setSearchQuery] = useState('');
+  const [filterType, setFilterType] = useState<MemoryType | 'all'>('all');
+  const [expandedId, setExpandedId] = useState<string | null>(null);
+  const [isExporting, setIsExporting] = useState(false);
+ 
+  const loadMemories = useCallback(async () => {
+    const typeFilter = filterType !== 'all' ? { type: filterType as MemoryType } : {};
+ 
+    if (searchQuery.trim()) {
+      const results = await intelligenceClient.memory.search({
+        agentId,
+        query: searchQuery,
+        limit: 50,
+        ...typeFilter,
+      });
+      setMemories(results);
+    } else {
+      const results = await intelligenceClient.memory.search({
+        agentId,
+        limit: 50,
+        ...typeFilter,
+      });
+      setMemories(results);
+    }
+ 
+    const s = await intelligenceClient.memory.stats();
+    setStats(s);
+  }, [agentId, searchQuery, filterType]);
+ 
+  useEffect(() => {
+    loadMemories();
+  }, [loadMemories]);
+ 
+  const handleDelete = async (id: string) => {
+    await intelligenceClient.memory.delete(id);
+    loadMemories();
+  };
+ 
+  const handleExport = async () => {
+    setIsExporting(true);
+    try {
+      const memories = await intelligenceClient.memory.export();
+      const filtered = memories.filter(m => m.agentId === agentId);
+      const md = filtered.map(m =>
+        `## [${m.type}] ${m.content}\n` +
+        `- 重要度: ${m.importance}\n` +
+        `- 标签: ${m.tags.join(', ') || '无'}\n` +
+        `- 创建时间: ${m.createdAt}\n`
+      ).join('\n---\n\n');
+      const blob = new Blob([md || '# 无记忆数据'], { type: 'text/markdown' });
+      const url = URL.createObjectURL(blob);
+      const a = document.createElement('a');
+      a.href = url;
+      a.download = `zclaw-memory-${agentId}-${new Date().toISOString().slice(0, 10)}.md`;
+      a.click();
+      URL.revokeObjectURL(url);
+    } finally {
+      setIsExporting(false);
+    }
+  };
+ 
+  const handlePrune = async () => {
+    // Find old, low-importance memories and delete them
+    const memories = await intelligenceClient.memory.search({
+      agentId,
+      minImportance: 0,
+      limit: 1000,
+    });
+    const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;
+    const toDelete = memories.filter(m =>
+      new Date(m.createdAt).getTime() < thirtyDaysAgo && m.importance < 3
+    );
+    for (const m of toDelete) {
+      await intelligenceClient.memory.delete(m.id);
+    }
+    if (toDelete.length > 0) {
+      loadMemories();
+    }
+  };
+ 
+  return (
+    <div className="space-y-3">
+      {/* Stats */}
+      <motion.div
+        whileHover={cardHover}
+        transition={defaultTransition}
+        className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-3 shadow-sm"
+      >
+        <div className="flex items-center justify-between mb-2">
+          <h3 className="text-sm font-semibold text-gray-900 dark:text-gray-100 flex items-center gap-1.5">
+            <Brain className="w-4 h-4 text-orange-500" />
+            Agent 记忆
+          </h3>
+          <div className="flex gap-1">
+            <Button
+              variant="ghost"
+              size="sm"
+              onClick={handleExport}
+              disabled={isExporting}
+              title="导出记忆"
+              aria-label="Export memories"
+              className="p-1"
+            >
+              <Download className="w-3.5 h-3.5" />
+            </Button>
+            <Button
+              variant="ghost"
+              size="sm"
+              onClick={handlePrune}
+              title="清理旧记忆"
+              aria-label="Prune old memories"
+              className="p-1"
+            >
+              <Trash2 className="w-3.5 h-3.5" />
+            </Button>
+          </div>
+        </div>
+ 
+        {stats && (
+          <div className="grid grid-cols-3 gap-2 text-center">
+            <div className="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-1.5">
+              <div className="text-lg font-bold text-orange-600">{stats.totalEntries}</div>
+              <div className="text-[10px] text-gray-500">总记忆</div>
+            </div>
+            <div className="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-1.5">
+              <div className="text-lg font-bold text-blue-600">{stats.byType['fact'] || 0}</div>
+              <div className="text-[10px] text-gray-500">事实</div>
+            </div>
+            <div className="bg-gray-50 dark:bg-gray-700/50 rounded-lg p-1.5">
+              <div className="text-lg font-bold text-amber-600">{stats.byType['preference'] || 0}</div>
+              <div className="text-[10px] text-gray-500">偏好</div>
+            </div>
+          </div>
+        )}
+      </motion.div>
+ 
+      {/* Search & Filter */}
+      <div className="space-y-2">
+        <div className="relative">
+          <Search className="absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400" />
+          <input
+            type="text"
+            value={searchQuery}
+            onChange={(e) => setSearchQuery(e.target.value)}
+            placeholder="搜索记忆..."
+            className="w-full text-sm border border-gray-200 dark:border-gray-600 rounded-lg pl-8 pr-3 py-1.5 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"
+          />
+        </div>
+        <div className="flex gap-1 flex-wrap">
+          <FilterChip
+            label="全部"
+            active={filterType === 'all'}
+            onClick={() => setFilterType('all')}
+          />
+          {(Object.keys(TYPE_LABELS) as MemoryType[]).map((type) => (
+            <FilterChip
+              key={type}
+              label={`${TYPE_LABELS[type].emoji} ${TYPE_LABELS[type].label}`}
+              active={filterType === type}
+              onClick={() => setFilterType(type)}
+            />
+          ))}
+        </div>
+      </div>
+ 
+      {/* Memory List */}
+      <div className="space-y-2">
+        {memories.length > 0 ? (
+          <AnimatePresence initial={false}>
+            {memories.map((entry) => (
+              <MemoryCard
+                key={entry.id}
+                entry={entry}
+                expanded={expandedId === entry.id}
+                onToggle={() => setExpandedId(expandedId === entry.id ? null : entry.id)}
+                onDelete={() => handleDelete(entry.id)}
+              />
+            ))}
+          </AnimatePresence>
+        ) : (
+          <EmptyState
+            icon={<Brain className="w-8 h-8" />}
+            title={searchQuery ? '未找到匹配的记忆' : '暂无记忆'}
+            description={searchQuery ? '尝试不同的搜索词' : '与 Agent 交流后,记忆会自动积累'}
+            className="py-6"
+          />
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+function MemoryCard({
+  entry,
+  expanded,
+  onToggle,
+  onDelete,
+}: {
+  entry: MemoryEntry;
+  expanded: boolean;
+  onToggle: () => void;
+  onDelete: () => void;
+}) {
+  const typeInfo = TYPE_LABELS[entry.type];
+  const importanceStars = Math.round(entry.importance / 2);
+  const timeAgo = getTimeAgo(entry.createdAt);
+ 
+  return (
+    <motion.div
+      layout
+      initial={{ opacity: 0, y: 8 }}
+      animate={{ opacity: 1, y: 0 }}
+      exit={{ opacity: 0, y: -8 }}
+      className="rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 shadow-sm overflow-hidden"
+    >
+      <div
+        className="px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"
+        onClick={onToggle}
+      >
+        <div className="flex items-start gap-2">
+          <span className={`text-[10px] font-medium px-1.5 py-0.5 rounded-full ${typeInfo.color}`}>
+            {typeInfo.emoji} {typeInfo.label}
+          </span>
+          <div className="flex-1 min-w-0">
+            <p className="text-sm text-gray-800 dark:text-gray-200 line-clamp-2">{entry.content}</p>
+          </div>
+          {expanded ? (
+            <ChevronUp className="w-3.5 h-3.5 text-gray-400 flex-shrink-0 mt-0.5" />
+          ) : (
+            <ChevronDown className="w-3.5 h-3.5 text-gray-400 flex-shrink-0 mt-0.5" />
+          )}
+        </div>
+ 
+        <div className="flex items-center gap-3 mt-1.5 text-[10px] text-gray-500 dark:text-gray-400">
+          <span className="flex items-center gap-0.5">
+            <Star className="w-3 h-3" />
+            {'★'.repeat(importanceStars)}{'☆'.repeat(5 - importanceStars)}
+          </span>
+          <span className="flex items-center gap-0.5">
+            <Clock className="w-3 h-3" />
+            {timeAgo}
+          </span>
+          {entry.tags.length > 0 && (
+            <span className="flex items-center gap-0.5">
+              <Tag className="w-3 h-3" />
+              {entry.tags.slice(0, 2).join(', ')}
+            </span>
+          )}
+        </div>
+      </div>
+ 
+      <AnimatePresence>
+        {expanded && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            transition={{ duration: 0.2 }}
+            className="border-t border-gray-100 dark:border-gray-700"
+          >
+            <div className="px-3 py-2 space-y-2 text-xs">
+              <div className="grid grid-cols-2 gap-2">
+                <div>
+                  <span className="text-gray-500">重要性</span>
+                  <span className="ml-1 font-medium">{entry.importance}/10</span>
+                </div>
+                <div>
+                  <span className="text-gray-500">来源</span>
+                  <span className="ml-1 font-medium">{entry.source === 'auto' ? '自动' : entry.source === 'user' ? '用户' : '反思'}</span>
+                </div>
+                <div>
+                  <span className="text-gray-500">访问</span>
+                  <span className="ml-1 font-medium">{entry.accessCount}次</span>
+                </div>
+                <div>
+                  <span className="text-gray-500">创建</span>
+                  <span className="ml-1 font-medium">{new Date(entry.createdAt).toLocaleDateString('zh-CN')}</span>
+                </div>
+              </div>
+              {entry.tags.length > 0 && (
+                <div className="flex flex-wrap gap-1">
+                  {entry.tags.map((tag) => (
+                    <Badge key={tag} variant="default">{tag}</Badge>
+                  ))}
+                </div>
+              )}
+              <div className="flex justify-end">
+                <Button
+                  variant="ghost"
+                  size="sm"
+                  onClick={(e: React.MouseEvent) => {
+                    e.stopPropagation();
+                    onDelete();
+                  }}
+                  className="text-red-500 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-900/20 text-xs px-2 py-1"
+                >
+                  <Trash2 className="w-3 h-3 mr-1" />
+                  删除
+                </Button>
+              </div>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </motion.div>
+  );
+}
+ 
+function FilterChip({
+  label,
+  active,
+  onClick,
+}: {
+  label: string;
+  active: boolean;
+  onClick: () => void;
+}) {
+  return (
+    <button
+      onClick={onClick}
+      className={`text-[10px] px-2 py-0.5 rounded-full border transition-colors ${
+        active
+          ? 'bg-orange-100 border-orange-300 text-orange-700 dark:bg-orange-900/30 dark:border-orange-700 dark:text-orange-300'
+          : 'bg-gray-50 border-gray-200 text-gray-600 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-400'
+      }`}
+    >
+      {label}
+    </button>
+  );
+}
+ 
+function getTimeAgo(isoDate: string): string {
+  const now = Date.now();
+  const then = new Date(isoDate).getTime();
+  const diffMs = now - then;
+ 
+  const minutes = Math.floor(diffMs / 60_000);
+  if (minutes < 1) return '刚刚';
+  if (minutes < 60) return `${minutes}分钟前`;
+ 
+  const hours = Math.floor(minutes / 60);
+  if (hours < 24) return `${hours}小时前`;
+ 
+  const days = Math.floor(hours / 24);
+  if (days < 30) return `${days}天前`;
+ 
+  const months = Math.floor(days / 30);
+  return `${months}个月前`;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/MessageSearch.tsx.html b/desktop/coverage/src/components/MessageSearch.tsx.html new file mode 100644 index 0000000..1f8582a --- /dev/null +++ b/desktop/coverage/src/components/MessageSearch.tsx.html @@ -0,0 +1,1477 @@ + + + + + + Code coverage report for src/components/MessageSearch.tsx + + + + + + + + + +
+
+

All files / src/components MessageSearch.tsx

+
+ +
+ 0% + Statements + 0/341 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/341 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { Search, X, ChevronUp, ChevronDown, Clock, User, Filter } from 'lucide-react';
+import { Button } from './ui';
+import { useChatStore, Message } from '../store/chatStore';
+ 
+export interface SearchFilters {
+  sender: 'all' | 'user' | 'assistant';
+  timeRange: 'all' | 'today' | 'week' | 'month';
+}
+ 
+export interface SearchResult {
+  message: Message;
+  matchIndices: Array<{ start: number; end: number }>;
+}
+ 
+interface MessageSearchProps {
+  onNavigateToMessage: (messageId: string) => void;
+}
+ 
+const SEARCH_HISTORY_KEY = 'zclaw-search-history';
+const MAX_HISTORY_ITEMS = 10;
+ 
+export function MessageSearch({ onNavigateToMessage }: MessageSearchProps) {
+  const { messages } = useChatStore();
+ 
+  const [isOpen, setIsOpen] = useState(false);
+  const [query, setQuery] = useState('');
+  const [filters, setFilters] = useState<SearchFilters>({
+    sender: 'all',
+    timeRange: 'all',
+  });
+  const [currentMatchIndex, setCurrentMatchIndex] = useState(0);
+  const [showFilters, setShowFilters] = useState(false);
+  const [searchHistory, setSearchHistory] = useState<string[]>([]);
+  const inputRef = useRef<HTMLInputElement>(null);
+ 
+  // Load search history from localStorage
+  useEffect(() => {
+    try {
+      const saved = localStorage.getItem(SEARCH_HISTORY_KEY);
+      if (saved) {
+        setSearchHistory(JSON.parse(saved));
+      }
+    } catch {
+      // Ignore parse errors
+    }
+  }, []);
+ 
+  // Save search query to history
+  const saveToHistory = useCallback((searchQuery: string) => {
+    if (!searchQuery.trim()) return;
+ 
+    setSearchHistory((prev) => {
+      const filtered = prev.filter((item) => item !== searchQuery);
+      const updated = [searchQuery, ...filtered].slice(0, MAX_HISTORY_ITEMS);
+      try {
+        localStorage.setItem(SEARCH_HISTORY_KEY, JSON.stringify(updated));
+      } catch {
+        // Ignore storage errors
+      }
+      return updated;
+    });
+  }, []);
+ 
+  // Filter messages by time range
+  const filterByTimeRange = useCallback((message: Message, timeRange: SearchFilters['timeRange']): boolean => {
+    if (timeRange === 'all') return true;
+ 
+    const messageTime = new Date(message.timestamp).getTime();
+    const now = Date.now();
+    const day = 24 * 60 * 60 * 1000;
+ 
+    switch (timeRange) {
+      case 'today':
+        return messageTime >= now - day;
+      case 'week':
+        return messageTime >= now - 7 * day;
+      case 'month':
+        return messageTime >= now - 30 * day;
+      default:
+        return true;
+    }
+  }, []);
+ 
+  // Filter messages by sender
+  const filterBySender = useCallback((message: Message, sender: SearchFilters['sender']): boolean => {
+    if (sender === 'all') return true;
+    if (sender === 'user') return message.role === 'user';
+    if (sender === 'assistant') return message.role === 'assistant' || message.role === 'tool';
+    return true;
+  }, []);
+ 
+  // Search messages and find matches
+  const searchResults = useMemo((): SearchResult[] => {
+    if (!query.trim()) return [];
+ 
+    const searchTerms = query.toLowerCase().split(/\s+/).filter(Boolean);
+    if (searchTerms.length === 0) return [];
+ 
+    const results: SearchResult[] = [];
+ 
+    for (const message of messages) {
+      // Apply filters
+      if (!filterBySender(message, filters.sender)) continue;
+      if (!filterByTimeRange(message, filters.timeRange)) continue;
+ 
+      const content = message.content.toLowerCase();
+      const matchIndices: Array<{ start: number; end: number }> = [];
+ 
+      // Find all matches
+      for (const term of searchTerms) {
+        let startIndex = 0;
+        while (true) {
+          const index = content.indexOf(term, startIndex);
+          if (index === -1) break;
+          matchIndices.push({ start: index, end: index + term.length });
+          startIndex = index + 1;
+        }
+      }
+ 
+      if (matchIndices.length > 0) {
+        // Sort and merge overlapping matches
+        matchIndices.sort((a, b) => a.start - b.start);
+        const merged: Array<{ start: number; end: number }> = [];
+        for (const match of matchIndices) {
+          if (merged.length === 0 || merged[merged.length - 1].end < match.start) {
+            merged.push(match);
+          } else {
+            merged[merged.length - 1].end = Math.max(merged[merged.length - 1].end, match.end);
+          }
+        }
+        results.push({ message, matchIndices: merged });
+      }
+    }
+ 
+    return results;
+  }, [query, messages, filters, filterBySender, filterByTimeRange]);
+ 
+  // Navigate to previous match
+  const handlePrevious = useCallback(() => {
+    if (searchResults.length === 0) return;
+    setCurrentMatchIndex((prev) =>
+      prev > 0 ? prev - 1 : searchResults.length - 1
+    );
+    const result = searchResults[currentMatchIndex > 0 ? currentMatchIndex - 1 : searchResults.length - 1];
+    onNavigateToMessage(result.message.id);
+  }, [searchResults, currentMatchIndex, onNavigateToMessage]);
+ 
+  // Navigate to next match
+  const handleNext = useCallback(() => {
+    if (searchResults.length === 0) return;
+    setCurrentMatchIndex((prev) =>
+      prev < searchResults.length - 1 ? prev + 1 : 0
+    );
+    const result = searchResults[currentMatchIndex < searchResults.length - 1 ? currentMatchIndex + 1 : 0];
+    onNavigateToMessage(result.message.id);
+  }, [searchResults, currentMatchIndex, onNavigateToMessage]);
+ 
+  // Handle keyboard shortcuts
+  useEffect(() => {
+    const handleKeyDown = (e: KeyboardEvent) => {
+      // Ctrl+F or Cmd+F to open search
+      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {
+        e.preventDefault();
+        setIsOpen((prev) => !prev);
+        setTimeout(() => inputRef.current?.focus(), 100);
+      }
+ 
+      // Escape to close search
+      if (e.key === 'Escape' && isOpen) {
+        setIsOpen(false);
+        setQuery('');
+      }
+ 
+      // Enter to navigate to next match
+      if (e.key === 'Enter' && isOpen && searchResults.length > 0) {
+        if (e.shiftKey) {
+          handlePrevious();
+        } else {
+          handleNext();
+        }
+      }
+    };
+ 
+    window.addEventListener('keydown', handleKeyDown);
+    return () => window.removeEventListener('keydown', handleKeyDown);
+  }, [isOpen, searchResults.length, handlePrevious, handleNext]);
+ 
+  // Reset current match index when results change
+  useEffect(() => {
+    setCurrentMatchIndex(0);
+  }, [searchResults.length]);
+ 
+  // Handle search submit
+  const handleSubmit = (e: React.FormEvent) => {
+    e.preventDefault();
+    if (query.trim()) {
+      saveToHistory(query.trim());
+      if (searchResults.length > 0) {
+        onNavigateToMessage(searchResults[0].message.id);
+      }
+    }
+  };
+ 
+  // Clear search
+  const handleClear = () => {
+    setQuery('');
+    inputRef.current?.focus();
+  };
+ 
+  // Toggle search panel
+  const toggleSearch = () => {
+    setIsOpen((prev) => !prev);
+    if (!isOpen) {
+      setTimeout(() => inputRef.current?.focus(), 100);
+    }
+  };
+ 
+  return (
+    <>
+      {/* Search toggle button */}
+      <Button
+        variant="ghost"
+        size="sm"
+        onClick={toggleSearch}
+        className={`flex items-center gap-1.5 ${isOpen ? 'text-orange-600 dark:text-orange-400 bg-orange-50 dark:bg-orange-900/20' : 'text-gray-500 dark:text-gray-400 hover:text-gray-600 dark:hover:text-gray-300'}`}
+        title="Search messages (Ctrl+F)"
+        aria-label="Search messages"
+        aria-expanded={isOpen}
+      >
+        <Search className="w-3.5 h-3.5" />
+        <span className="hidden sm:inline">Search</span>
+      </Button>
+ 
+      {/* Search panel */}
+      <AnimatePresence>
+        {isOpen && (
+          <motion.div
+            initial={{ opacity: 0, height: 0 }}
+            animate={{ opacity: 1, height: 'auto' }}
+            exit={{ opacity: 0, height: 0 }}
+            transition={{ duration: 0.2 }}
+            className="border-b border-gray-100 dark:border-gray-800 bg-gray-50 dark:bg-gray-800/50 overflow-hidden"
+          >
+            <div className="px-4 py-3">
+              <form onSubmit={handleSubmit} className="flex items-center gap-2">
+                {/* Search input */}
+                <div className="flex-1 relative">
+                  <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
+                  <input
+                    ref={inputRef}
+                    type="text"
+                    value={query}
+                    onChange={(e) => setQuery(e.target.value)}
+                    placeholder="Search messages..."
+                    className="w-full pl-9 pr-8 py-2 text-sm bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500 dark:focus:ring-orange-400 focus:border-transparent"
+                    aria-label="Search query"
+                  />
+                  {query && (
+                    <button
+                      type="button"
+                      onClick={handleClear}
+                      className="absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+                      aria-label="Clear search"
+                    >
+                      <X className="w-4 h-4" />
+                    </button>
+                  )}
+                </div>
+ 
+                {/* Filter toggle */}
+                <Button
+                  type="button"
+                  variant={showFilters ? 'secondary' : 'ghost'}
+                  size="sm"
+                  onClick={() => setShowFilters((prev) => !prev)}
+                  className="flex items-center gap-1"
+                  aria-label="Toggle filters"
+                  aria-expanded={showFilters}
+                >
+                  <Filter className="w-4 h-4" />
+                  <span className="hidden sm:inline">Filters</span>
+                </Button>
+ 
+                {/* Navigation buttons */}
+                {searchResults.length > 0 && (
+                  <div className="flex items-center gap-1">
+                    <span className="text-xs text-gray-500 dark:text-gray-400 px-2">
+                      {currentMatchIndex + 1} / {searchResults.length}
+                    </span>
+                    <Button
+                      type="button"
+                      variant="ghost"
+                      size="sm"
+                      onClick={handlePrevious}
+                      className="p-1.5"
+                      aria-label="Previous match"
+                    >
+                      <ChevronUp className="w-4 h-4" />
+                    </Button>
+                    <Button
+                      type="button"
+                      variant="ghost"
+                      size="sm"
+                      onClick={handleNext}
+                      className="p-1.5"
+                      aria-label="Next match"
+                    >
+                      <ChevronDown className="w-4 h-4" />
+                    </Button>
+                  </div>
+                )}
+              </form>
+ 
+              {/* Filters panel */}
+              <AnimatePresence>
+                {showFilters && (
+                  <motion.div
+                    initial={{ opacity: 0, height: 0 }}
+                    animate={{ opacity: 1, height: 'auto' }}
+                    exit={{ opacity: 0, height: 0 }}
+                    className="mt-3 pt-3 border-t border-gray-200 dark:border-gray-700"
+                  >
+                    <div className="flex flex-wrap gap-4">
+                      {/* Sender filter */}
+                      <div className="flex items-center gap-2">
+                        <label className="text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+                          <User className="w-3.5 h-3.5" />
+                          Sender:
+                        </label>
+                        <select
+                          value={filters.sender}
+                          onChange={(e) => setFilters((prev) => ({ ...prev, sender: e.target.value as SearchFilters['sender'] }))}
+                          className="text-xs bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-orange-500"
+                        >
+                          <option value="all">All</option>
+                          <option value="user">User</option>
+                          <option value="assistant">Assistant</option>
+                        </select>
+                      </div>
+ 
+                      {/* Time range filter */}
+                      <div className="flex items-center gap-2">
+                        <label className="text-xs text-gray-500 dark:text-gray-400 flex items-center gap-1">
+                          <Clock className="w-3.5 h-3.5" />
+                          Time:
+                        </label>
+                        <select
+                          value={filters.timeRange}
+                          onChange={(e) => setFilters((prev) => ({ ...prev, timeRange: e.target.value as SearchFilters['timeRange'] }))}
+                          className="text-xs bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-orange-500"
+                        >
+                          <option value="all">All time</option>
+                          <option value="today">Today</option>
+                          <option value="week">This week</option>
+                          <option value="month">This month</option>
+                        </select>
+                      </div>
+                    </div>
+                  </motion.div>
+                )}
+              </AnimatePresence>
+ 
+              {/* Search history */}
+              {!query && searchHistory.length > 0 && (
+                <div className="mt-2">
+                  <div className="text-xs text-gray-400 dark:text-gray-500 mb-1">Recent searches:</div>
+                  <div className="flex flex-wrap gap-1">
+                    {searchHistory.slice(0, 5).map((item, index) => (
+                      <button
+                        key={index}
+                        type="button"
+                        onClick={() => setQuery(item)}
+                        className="text-xs px-2 py-1 bg-white dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-600 transition-colors"
+                      >
+                        {item}
+                      </button>
+                    ))}
+                  </div>
+                </div>
+              )}
+ 
+              {/* No results message */}
+              {query && searchResults.length === 0 && (
+                <div className="mt-2 text-xs text-gray-500 dark:text-gray-400 text-center py-2">
+                  No messages found matching "{query}"
+                </div>
+              )}
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </>
+  );
+}
+ 
+// Utility function to highlight search matches in text
+export function highlightSearchMatches(
+  text: string,
+  query: string,
+  highlightClassName: string = 'bg-yellow-200 dark:bg-yellow-700/50 rounded px-0.5'
+): React.ReactNode[] {
+  if (!query.trim()) return [text];
+ 
+  const searchTerms = query.toLowerCase().split(/\s+/).filter(Boolean);
+  if (searchTerms.length === 0) return [text];
+ 
+  const lowerText = text.toLowerCase();
+  const matches: Array<{ start: number; end: number }> = [];
+ 
+  // Find all matches
+  for (const term of searchTerms) {
+    let startIndex = 0;
+    while (true) {
+      const index = lowerText.indexOf(term, startIndex);
+      if (index === -1) break;
+      matches.push({ start: index, end: index + term.length });
+      startIndex = index + 1;
+    }
+  }
+ 
+  if (matches.length === 0) return [text];
+ 
+  // Sort and merge overlapping matches
+  matches.sort((a, b) => a.start - b.start);
+  const merged: Array<{ start: number; end: number }> = [];
+  for (const match of matches) {
+    if (merged.length === 0 || merged[merged.length - 1].end < match.start) {
+      merged.push({ ...match });
+    } else {
+      merged[merged.length - 1].end = Math.max(merged[merged.length - 1].end, match.end);
+    }
+  }
+ 
+  // Build highlighted result
+  const result: React.ReactNode[] = [];
+  let lastIndex = 0;
+ 
+  for (let i = 0; i < merged.length; i++) {
+    const match = merged[i];
+ 
+    // Text before match
+    if (match.start > lastIndex) {
+      result.push(text.slice(lastIndex, match.start));
+    }
+ 
+    // Highlighted match
+    result.push(
+      <mark key={i} className={highlightClassName}>
+        {text.slice(match.start, match.end)}
+      </mark>
+    );
+ 
+    lastIndex = match.end;
+  }
+ 
+  // Remaining text
+  if (lastIndex < text.length) {
+    result.push(text.slice(lastIndex));
+  }
+ 
+  return result;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/OfflineIndicator.tsx.html b/desktop/coverage/src/components/OfflineIndicator.tsx.html new file mode 100644 index 0000000..f9b2365 --- /dev/null +++ b/desktop/coverage/src/components/OfflineIndicator.tsx.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/components/OfflineIndicator.tsx + + + + + + + + + +
+
+

All files / src/components OfflineIndicator.tsx

+
+ +
+ 0% + Statements + 0/249 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/249 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * OfflineIndicator Component
+ *
+ * Displays offline mode status, pending message count, and reconnection info.
+ * Shows a prominent banner when the app is offline with visual feedback.
+ */
+ 
+import { useState, useEffect } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  WifiOff,
+  CloudOff,
+  RefreshCw,
+  Clock,
+  AlertCircle,
+  CheckCircle,
+  Send,
+  X,
+  ChevronDown,
+  ChevronUp,
+} from 'lucide-react';
+import { useOfflineStore, type QueuedMessage } from '../store/offlineStore';
+import { useConnectionStore } from '../store/connectionStore';
+ 
+interface OfflineIndicatorProps {
+  /** Show compact version (minimal) */
+  compact?: boolean;
+  /** Show pending messages list */
+  showQueue?: boolean;
+  /** Additional CSS classes */
+  className?: string;
+  /** Callback when reconnect button is clicked */
+  onReconnect?: () => void;
+}
+ 
+/**
+ * Format relative time
+ */
+function formatRelativeTime(timestamp: number): string {
+  const seconds = Math.floor((Date.now() - timestamp) / 1000);
+ 
+  if (seconds < 60) return '刚刚';
+  if (seconds < 3600) return `${Math.floor(seconds / 60)}分钟前`;
+  if (seconds < 86400) return `${Math.floor(seconds / 3600)}小时前`;
+  return `${Math.floor(seconds / 86400)}天前`;
+}
+ 
+/**
+ * Format reconnect delay for display
+ */
+function formatReconnectDelay(delay: number): string {
+  if (delay < 1000) return '立即';
+  if (delay < 60000) return `${Math.ceil(delay / 1000)}秒`;
+  return `${Math.ceil(delay / 60000)}分钟`;
+}
+ 
+/**
+ * Truncate message content for display
+ */
+function truncateContent(content: string, maxLength: number = 50): string {
+  if (content.length <= maxLength) return content;
+  return content.slice(0, maxLength) + '...';
+}
+ 
+/**
+ * Full offline indicator with banner, queue, and reconnect info
+ */
+export function OfflineIndicator({
+  compact = false,
+  showQueue = true,
+  className = '',
+  onReconnect,
+}: OfflineIndicatorProps) {
+  const {
+    isOffline,
+    isReconnecting,
+    reconnectAttempt,
+    nextReconnectDelay,
+    queuedMessages,
+    cancelReconnect,
+  } = useOfflineStore();
+ 
+  const connect = useConnectionStore((s) => s.connect);
+ 
+  const [showMessageQueue, setShowMessageQueue] = useState(false);
+  const [countdown, setCountdown] = useState<number | null>(null);
+ 
+  // Countdown timer for reconnection
+  useEffect(() => {
+    if (!isReconnecting || !nextReconnectDelay) {
+      setCountdown(null);
+      return;
+    }
+ 
+    const endTime = Date.now() + nextReconnectDelay;
+    setCountdown(nextReconnectDelay);
+ 
+    const interval = setInterval(() => {
+      const remaining = Math.max(0, endTime - Date.now());
+      setCountdown(remaining);
+ 
+      if (remaining === 0) {
+        clearInterval(interval);
+      }
+    }, 1000);
+ 
+    return () => clearInterval(interval);
+  }, [isReconnecting, nextReconnectDelay]);
+ 
+  // Handle manual reconnect
+  const handleReconnect = async () => {
+    onReconnect?.();
+    try {
+      await connect();
+    } catch (err) {
+      console.error('[OfflineIndicator] Manual reconnect failed:', err);
+    }
+  };
+ 
+  const pendingCount = queuedMessages.filter(
+    (m) => m.status === 'pending' || m.status === 'failed'
+  ).length;
+ 
+  // Don't show if online and no pending messages
+  if (!isOffline && pendingCount === 0) {
+    return null;
+  }
+ 
+  // Compact version for headers/toolbars
+  if (compact) {
+    return (
+      <div className={`flex items-center gap-2 ${className}`}>
+        {isOffline ? (
+          <>
+            <CloudOff className="w-4 h-4 text-orange-500" />
+            <span className="text-sm text-orange-500 font-medium">
+              离线模式
+            </span>
+            {pendingCount > 0 && (
+              <span className="text-xs bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400 px-1.5 py-0.5 rounded">
+                {pendingCount} 条待发
+              </span>
+            )}
+          </>
+        ) : (
+          <>
+            <CheckCircle className="w-4 h-4 text-green-500" />
+            <span className="text-sm text-green-500">已恢复连接</span>
+            {pendingCount > 0 && (
+              <span className="text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 px-1.5 py-0.5 rounded">
+                发送中 {pendingCount} 条
+              </span>
+            )}
+          </>
+        )}
+      </div>
+    );
+  }
+ 
+  // Full banner version
+  return (
+    <AnimatePresence>
+      <motion.div
+        initial={{ opacity: 0, y: -20 }}
+        animate={{ opacity: 1, y: 0 }}
+        exit={{ opacity: 0, y: -20 }}
+        className={`${className}`}
+      >
+        {/* Main Banner */}
+        <div
+          className={`flex items-center gap-3 px-4 py-3 rounded-lg ${
+            isOffline
+              ? 'bg-orange-50 dark:bg-orange-900/20 border border-orange-200 dark:border-orange-800'
+              : 'bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800'
+          }`}
+        >
+          {/* Status Icon */}
+          <motion.div
+            animate={isReconnecting ? { rotate: 360 } : {}}
+            transition={
+              isReconnecting
+                ? { duration: 1, repeat: Infinity, ease: 'linear' }
+                : {}
+            }
+          >
+            {isOffline ? (
+              <WifiOff className="w-5 h-5 text-orange-500" />
+            ) : (
+              <CheckCircle className="w-5 h-5 text-green-500" />
+            )}
+          </motion.div>
+ 
+          {/* Status Text */}
+          <div className="flex-1">
+            <div
+              className={`text-sm font-medium ${
+                isOffline ? 'text-orange-700 dark:text-orange-400' : 'text-green-700 dark:text-green-400'
+              }`}
+            >
+              {isOffline ? '后端服务不可用' : '连接已恢复'}
+            </div>
+            <div className="text-xs text-gray-500 dark:text-gray-400">
+              {isReconnecting ? (
+                <>
+                  正在尝试重连 ({reconnectAttempt}次)
+                  {countdown !== null && (
+                    <span className="ml-2">
+                      {formatReconnectDelay(countdown)}后重试
+                    </span>
+                  )}
+                </>
+              ) : isOffline ? (
+                '消息将保存在本地,连接后自动发送'
+              ) : pendingCount > 0 ? (
+                `正在发送 ${pendingCount} 条排队消息...`
+              ) : (
+                '所有消息已同步'
+              )}
+            </div>
+          </div>
+ 
+          {/* Actions */}
+          <div className="flex items-center gap-2">
+            {isOffline && !isReconnecting && (
+              <button
+                onClick={handleReconnect}
+                className="flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-white bg-orange-500 hover:bg-orange-600 rounded-md transition-colors"
+              >
+                <RefreshCw className="w-4 h-4" />
+                重连
+              </button>
+            )}
+            {isReconnecting && (
+              <button
+                onClick={cancelReconnect}
+                className="flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-gray-600 dark:text-gray-300 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md transition-colors"
+              >
+                <X className="w-4 h-4" />
+                取消
+              </button>
+            )}
+            {showQueue && pendingCount > 0 && (
+              <button
+                onClick={() => setShowMessageQueue(!showMessageQueue)}
+                className="flex items-center gap-1 px-2 py-1 text-xs text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-colors"
+              >
+                {showMessageQueue ? (
+                  <ChevronUp className="w-4 h-4" />
+                ) : (
+                  <ChevronDown className="w-4 h-4" />
+                )}
+                {pendingCount} 条待发
+              </button>
+            )}
+          </div>
+        </div>
+ 
+        {/* Message Queue */}
+        <AnimatePresence>
+          {showMessageQueue && pendingCount > 0 && (
+            <motion.div
+              initial={{ opacity: 0, height: 0 }}
+              animate={{ opacity: 1, height: 'auto' }}
+              exit={{ opacity: 0, height: 0 }}
+              className="mt-2 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"
+            >
+              <div className="px-4 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700">
+                <span className="text-sm font-medium text-gray-700 dark:text-gray-300">
+                  排队消息
+                </span>
+              </div>
+              <div className="max-h-48 overflow-y-auto">
+                {queuedMessages
+                  .filter((m) => m.status === 'pending' || m.status === 'failed')
+                  .map((msg) => (
+                    <QueuedMessageItem key={msg.id} message={msg} />
+                  ))}
+              </div>
+            </motion.div>
+          )}
+        </AnimatePresence>
+      </motion.div>
+    </AnimatePresence>
+  );
+}
+ 
+/**
+ * Individual queued message item
+ */
+function QueuedMessageItem({ message }: { message: QueuedMessage }) {
+  const { removeMessage } = useOfflineStore();
+ 
+  const statusConfig = {
+    pending: { icon: Clock, color: 'text-gray-400', label: '等待中' },
+    sending: { icon: Send, color: 'text-blue-500', label: '发送中' },
+    failed: { icon: AlertCircle, color: 'text-red-500', label: '发送失败' },
+    sent: { icon: CheckCircle, color: 'text-green-500', label: '已发送' },
+  };
+ 
+  const config = statusConfig[message.status];
+  const StatusIcon = config.icon;
+ 
+  return (
+    <div className="flex items-start gap-3 px-4 py-2 border-b border-gray-100 dark:border-gray-800 last:border-b-0">
+      <StatusIcon className={`w-4 h-4 mt-0.5 ${config.color}`} />
+ 
+      <div className="flex-1 min-w-0">
+        <p className="text-sm text-gray-700 dark:text-gray-300 truncate">
+          {truncateContent(message.content)}
+        </p>
+        <div className="flex items-center gap-2 mt-1">
+          <span className="text-xs text-gray-400">
+            {formatRelativeTime(message.timestamp)}
+          </span>
+          {message.status === 'failed' && message.lastError && (
+            <span className="text-xs text-red-500">{message.lastError}</span>
+          )}
+        </div>
+      </div>
+ 
+      {message.status === 'failed' && (
+        <button
+          onClick={() => removeMessage(message.id)}
+          className="p-1 text-gray-400 hover:text-red-500 transition-colors"
+          title="删除消息"
+        >
+          <X className="w-4 h-4" />
+        </button>
+      )}
+    </div>
+  );
+}
+ 
+/**
+ * Minimal connection status indicator for headers
+ */
+export function ConnectionStatusBadge({ className = '' }: { className?: string }) {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const queuedMessages = useOfflineStore((s) => s.queuedMessages);
+ 
+  const pendingCount = queuedMessages.filter(
+    (m) => m.status === 'pending' || m.status === 'failed'
+  ).length;
+ 
+  const isConnected = connectionState === 'connected';
+ 
+  return (
+    <div className={`flex items-center gap-1.5 ${className}`}>
+      <span
+        className={`w-2 h-2 rounded-full ${
+          isConnected
+            ? 'bg-green-400'
+            : connectionState === 'reconnecting'
+            ? 'bg-orange-400 animate-pulse'
+            : 'bg-red-400'
+        }`}
+      />
+      <span
+        className={`text-xs ${
+          isConnected
+            ? 'text-green-500'
+            : connectionState === 'reconnecting'
+            ? 'text-orange-500'
+            : 'text-red-500'
+        }`}
+      >
+        {isConnected ? '在线' : connectionState === 'reconnecting' ? '重连中' : '离线'}
+      </span>
+      {pendingCount > 0 && (
+        <span className="text-xs bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400 px-1.5 py-0.5 rounded">
+          {pendingCount}
+        </span>
+      )}
+    </div>
+  );
+}
+ 
+export default OfflineIndicator;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/PersonalitySelector.tsx.html b/desktop/coverage/src/components/PersonalitySelector.tsx.html new file mode 100644 index 0000000..4103aed --- /dev/null +++ b/desktop/coverage/src/components/PersonalitySelector.tsx.html @@ -0,0 +1,487 @@ + + + + + + Code coverage report for src/components/PersonalitySelector.tsx + + + + + + + + + +
+
+

All files / src/components PersonalitySelector.tsx

+
+ +
+ 0% + Statements + 0/87 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/87 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * PersonalitySelector - Personality style selection component for Agent onboarding
+ *
+ * Displays personality options as selectable cards with icons and descriptions.
+ */
+import { motion } from 'framer-motion';
+import { Briefcase, Heart, Sparkles, Zap, Check } from 'lucide-react';
+import { cn } from '../lib/utils';
+import { PERSONALITY_OPTIONS } from '../lib/personality-presets';
+ 
+export interface PersonalitySelectorProps {
+  value?: string;
+  onChange: (personalityId: string) => void;
+  className?: string;
+}
+ 
+// Map icon names to components
+const iconMap: Record<string, React.ComponentType<{ className?: string }>> = {
+  Briefcase,
+  Heart,
+  Sparkles,
+  Zap,
+};
+ 
+export function PersonalitySelector({ value, onChange, className }: PersonalitySelectorProps) {
+  return (
+    <div className={cn('grid grid-cols-2 gap-3', className)}>
+      {PERSONALITY_OPTIONS.map((option) => {
+        const IconComponent = iconMap[option.icon] || Briefcase;
+        const isSelected = value === option.id;
+ 
+        return (
+          <motion.button
+            key={option.id}
+            type="button"
+            whileHover={{ scale: 1.02 }}
+            whileTap={{ scale: 0.98 }}
+            onClick={() => onChange(option.id)}
+            className={cn(
+              'relative p-4 rounded-xl border-2 text-left transition-all',
+              'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',
+              isSelected
+                ? 'border-primary bg-primary/5 dark:bg-primary/10'
+                : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600 bg-white dark:bg-gray-800'
+            )}
+          >
+            {/* Selection indicator */}
+            {isSelected && (
+              <motion.div
+                initial={{ scale: 0 }}
+                animate={{ scale: 1 }}
+                className="absolute top-2 right-2 w-5 h-5 bg-primary rounded-full flex items-center justify-center"
+              >
+                <Check className="w-3 h-3 text-white" />
+              </motion.div>
+            )}
+ 
+            {/* Icon */}
+            <div
+              className={cn(
+                'w-10 h-10 rounded-lg flex items-center justify-center mb-3',
+                isSelected
+                  ? 'bg-primary text-white'
+                  : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400'
+              )}
+            >
+              <IconComponent className="w-5 h-5" />
+            </div>
+ 
+            {/* Label */}
+            <h4 className="font-medium text-gray-900 dark:text-gray-100 mb-1">
+              {option.label}
+            </h4>
+ 
+            {/* Description */}
+            <p className="text-xs text-gray-500 dark:text-gray-400">
+              {option.description}
+            </p>
+ 
+            {/* Traits preview */}
+            <div className="mt-3 flex flex-wrap gap-1">
+              {option.traits.slice(0, 2).map((trait) => (
+                <span
+                  key={trait}
+                  className={cn(
+                    'px-2 py-0.5 text-xs rounded-full',
+                    isSelected
+                      ? 'bg-primary/10 text-primary'
+                      : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400'
+                  )}
+                >
+                  {trait}
+                </span>
+              ))}
+            </div>
+          </motion.button>
+        );
+      })}
+    </div>
+  );
+}
+ 
+// Export a compact version for display purposes
+export interface PersonalityBadgeProps {
+  personalityId?: string;
+  size?: 'sm' | 'md';
+  className?: string;
+}
+ 
+export function PersonalityBadge({ personalityId, size = 'sm', className }: PersonalityBadgeProps) {
+  if (!personalityId) return null;
+ 
+  const option = PERSONALITY_OPTIONS.find((p) => p.id === personalityId);
+  if (!option) return null;
+ 
+  const IconComponent = iconMap[option.icon] || Briefcase;
+  const sizeStyles = {
+    sm: 'px-2 py-1 text-xs',
+    md: 'px-3 py-1.5 text-sm',
+  };
+ 
+  return (
+    <span
+      className={cn(
+        'inline-flex items-center gap-1 rounded-full bg-primary/10 text-primary',
+        sizeStyles[size],
+        className
+      )}
+    >
+      <IconComponent className={size === 'sm' ? 'w-3 h-3' : 'w-4 h-4'} />
+      <span>{option.label}</span>
+    </span>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/PipelineResultPreview.tsx.html b/desktop/coverage/src/components/PipelineResultPreview.tsx.html new file mode 100644 index 0000000..7ea6016 --- /dev/null +++ b/desktop/coverage/src/components/PipelineResultPreview.tsx.html @@ -0,0 +1,1099 @@ + + + + + + Code coverage report for src/components/PipelineResultPreview.tsx + + + + + + + + + +
+
+

All files / src/components PipelineResultPreview.tsx

+
+ +
+ 0% + Statements + 0/218 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/218 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * PipelineResultPreview - Pipeline 执行结果预览组件
+ *
+ * 展示 Pipeline 执行完成后的结果,支持多种预览模式:
+ * - JSON 数据预览
+ * - Markdown 渲染
+ * - 文件下载列表
+ * - 课堂预览器(特定 Pipeline)
+ */
+ 
+import { useState } from 'react';
+import {
+  FileText,
+  Download,
+  ExternalLink,
+  Copy,
+  Check,
+  Code,
+  File,
+  Presentation,
+  FileSpreadsheet,
+  X,
+} from 'lucide-react';
+import { PipelineRunResponse } from '../lib/pipeline-client';
+import { useToast } from './ui/Toast';
+ 
+// === Types ===
+ 
+interface PipelineResultPreviewProps {
+  result: PipelineRunResponse;
+  pipelineId: string;
+  onClose?: () => void;
+}
+ 
+type PreviewMode = 'auto' | 'json' | 'markdown' | 'classroom' | 'files';
+ 
+// === Utility Functions ===
+ 
+function getFileIcon(filename: string): React.ReactNode {
+  const ext = filename.split('.').pop()?.toLowerCase();
+  switch (ext) {
+    case 'pptx':
+    case 'ppt':
+      return <Presentation className="w-5 h-5 text-orange-500" />;
+    case 'xlsx':
+    case 'xls':
+      return <FileSpreadsheet className="w-5 h-5 text-green-500" />;
+    case 'pdf':
+      return <FileText className="w-5 h-5 text-red-500" />;
+    case 'html':
+      return <Code className="w-5 h-5 text-blue-500" />;
+    case 'md':
+    case 'markdown':
+      return <FileText className="w-5 h-5 text-gray-500" />;
+    default:
+      return <File className="w-5 h-5 text-gray-400" />;
+  }
+}
+ 
+function formatFileSize(bytes: number): string {
+  if (bytes < 1024) return `${bytes} B`;
+  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
+  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
+}
+ 
+// === Sub-Components ===
+ 
+interface FileDownloadCardProps {
+  file: {
+    name: string;
+    url: string;
+    size?: number;
+  };
+}
+ 
+function FileDownloadCard({ file }: FileDownloadCardProps) {
+  const handleDownload = () => {
+    // Create download link
+    const link = document.createElement('a');
+    link.href = file.url;
+    link.download = file.name;
+    document.body.appendChild(link);
+    link.click();
+    document.body.removeChild(link);
+  };
+ 
+  return (
+    <div className="flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
+      {getFileIcon(file.name)}
+      <div className="flex-1 min-w-0">
+        <p className="text-sm font-medium text-gray-900 dark:text-white truncate">
+          {file.name}
+        </p>
+        {file.size && (
+          <p className="text-xs text-gray-500 dark:text-gray-400">
+            {formatFileSize(file.size)}
+          </p>
+        )}
+      </div>
+      <div className="flex items-center gap-2">
+        <button
+          onClick={() => window.open(file.url, '_blank')}
+          className="p-1.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
+          title="在新窗口打开"
+        >
+          <ExternalLink className="w-4 h-4" />
+        </button>
+        <button
+          onClick={handleDownload}
+          className="flex items-center gap-1 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white text-sm font-medium rounded-md transition-colors"
+        >
+          <Download className="w-4 h-4" />
+          下载
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+interface JsonPreviewProps {
+  data: unknown;
+}
+ 
+function JsonPreview({ data }: JsonPreviewProps) {
+  const [copied, setCopied] = useState(false);
+  const { toast } = useToast();
+ 
+  const jsonString = JSON.stringify(data, null, 2);
+ 
+  const handleCopy = async () => {
+    await navigator.clipboard.writeText(jsonString);
+    setCopied(true);
+    toast('已复制到剪贴板', 'success');
+    setTimeout(() => setCopied(false), 2000);
+  };
+ 
+  return (
+    <div className="relative">
+      <button
+        onClick={handleCopy}
+        className="absolute top-2 right-2 p-1.5 bg-gray-200 dark:bg-gray-700 rounded hover:bg-gray-300 dark:hover:bg-gray-600 transition-colors"
+        title="复制"
+      >
+        {copied ? <Check className="w-4 h-4 text-green-500" /> : <Copy className="w-4 h-4" />}
+      </button>
+      <pre className="p-4 bg-gray-900 text-gray-100 rounded-lg overflow-auto text-sm max-h-96">
+        {jsonString}
+      </pre>
+    </div>
+  );
+}
+ 
+interface MarkdownPreviewProps {
+  content: string;
+}
+ 
+function MarkdownPreview({ content }: MarkdownPreviewProps) {
+  // Simple markdown rendering (for production, use a proper markdown library)
+  const renderMarkdown = (md: string): string => {
+    return md
+      // Headers
+      .replace(/^### (.*$)/gim, '<h3 class="text-lg font-semibold mt-4 mb-2">$1</h3>')
+      .replace(/^## (.*$)/gim, '<h2 class="text-xl font-semibold mt-4 mb-2">$1</h2>')
+      .replace(/^# (.*$)/gim, '<h1 class="text-2xl font-bold mt-4 mb-2">$1</h1>')
+      // Bold
+      .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
+      // Italic
+      .replace(/\*(.*?)\*/g, '<em>$1</em>')
+      // Lists
+      .replace(/^- (.*$)/gim, '<li class="ml-4">$1</li>')
+      // Paragraphs
+      .replace(/\n\n/g, '</p><p class="my-2">')
+      // Line breaks
+      .replace(/\n/g, '<br>');
+  };
+ 
+  return (
+    <div
+      className="prose dark:prose-invert max-w-none p-4 bg-white dark:bg-gray-800 rounded-lg"
+      dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }}
+    />
+  );
+}
+ 
+// === Main Component ===
+ 
+export function PipelineResultPreview({
+  result,
+  pipelineId,
+  onClose,
+}: PipelineResultPreviewProps) {
+  const [mode, setMode] = useState<PreviewMode>('auto');
+ 
+  // Determine the best preview mode
+  const outputs = result.outputs as Record<string, unknown> | undefined;
+  const exportFiles = (outputs?.export_files as Array<{ name: string; url: string; size?: number }>) || [];
+ 
+  // Check if this is a classroom pipeline
+  const isClassroom = pipelineId === 'classroom-generator' || pipelineId.includes('classroom');
+ 
+  // Auto-detect preview mode
+  const autoMode: PreviewMode = isClassroom ? 'classroom' :
+    exportFiles.length > 0 ? 'files' :
+    typeof outputs === 'object' ? 'json' : 'json';
+ 
+  const activeMode = mode === 'auto' ? autoMode : mode;
+ 
+  // Render based on mode
+  const renderContent = () => {
+    switch (activeMode) {
+      case 'json':
+        return <JsonPreview data={outputs} />;
+ 
+      case 'markdown':
+        const mdContent = (outputs?.summary || outputs?.report || JSON.stringify(outputs, null, 2)) as string;
+        return <MarkdownPreview content={mdContent} />;
+ 
+      case 'classroom':
+        // Will be handled by ClassroomPreviewer component
+        return (
+          <div className="text-center py-8 text-gray-500">
+            <Presentation className="w-12 h-12 mx-auto mb-3 text-gray-400" />
+            <p>课堂预览功能正在开发中...</p>
+            <p className="text-sm mt-2">您可以在下方下载生成的文件</p>
+          </div>
+        );
+ 
+      default:
+        return <JsonPreview data={outputs} />;
+    }
+  };
+ 
+  return (
+    <div className="bg-white dark:bg-gray-900 rounded-lg shadow-xl max-w-3xl w-full max-h-[90vh] overflow-hidden">
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div>
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            Pipeline 执行完成
+          </h2>
+          <p className="text-sm text-gray-500 dark:text-gray-400">
+            {result.pipelineId} · {result.status === 'completed' ? '成功' : result.status}
+          </p>
+        </div>
+        {onClose && (
+          <button
+            onClick={onClose}
+            className="p-1 hover:bg-gray-100 dark:hover:bg-gray-800 rounded"
+          >
+            <X className="w-5 h-5 text-gray-500" />
+          </button>
+        )}
+      </div>
+ 
+      {/* Mode Tabs */}
+      <div className="flex items-center gap-2 p-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800">
+        <button
+          onClick={() => setMode('auto')}
+          className={`px-3 py-1.5 text-sm rounded-md transition-colors ${
+            mode === 'auto'
+              ? 'bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm'
+              : 'text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-gray-700'
+          }`}
+        >
+          自动
+        </button>
+        <button
+          onClick={() => setMode('json')}
+          className={`px-3 py-1.5 text-sm rounded-md transition-colors ${
+            mode === 'json'
+              ? 'bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm'
+              : 'text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-gray-700'
+          }`}
+        >
+          JSON
+        </button>
+        <button
+          onClick={() => setMode('markdown')}
+          className={`px-3 py-1.5 text-sm rounded-md transition-colors ${
+            mode === 'markdown'
+              ? 'bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm'
+              : 'text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-gray-700'
+          }`}
+        >
+          Markdown
+        </button>
+        {isClassroom && (
+          <button
+            onClick={() => setMode('classroom')}
+            className={`px-3 py-1.5 text-sm rounded-md transition-colors ${
+              mode === 'classroom'
+                ? 'bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm'
+                : 'text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-gray-700'
+            }`}
+          >
+            课堂预览
+          </button>
+        )}
+      </div>
+ 
+      {/* Content */}
+      <div className="p-4 overflow-auto max-h-96">
+        {renderContent()}
+      </div>
+ 
+      {/* Export Files */}
+      {exportFiles.length > 0 && (
+        <div className="p-4 border-t border-gray-200 dark:border-gray-700">
+          <h3 className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-3">
+            导出文件 ({exportFiles.length})
+          </h3>
+          <div className="space-y-2">
+            {exportFiles.map((file, index) => (
+              <FileDownloadCard key={index} file={file} />
+            ))}
+          </div>
+        </div>
+      )}
+ 
+      {/* Footer */}
+      <div className="flex items-center justify-end gap-3 p-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800">
+        <span className="text-xs text-gray-500 dark:text-gray-400">
+          执行时间: {new Date(result.startedAt).toLocaleString()}
+        </span>
+        {onClose && (
+          <button
+            onClick={onClose}
+            className="px-4 py-2 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md"
+          >
+            关闭
+          </button>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default PipelineResultPreview;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/PipelinesPanel.tsx.html b/desktop/coverage/src/components/PipelinesPanel.tsx.html new file mode 100644 index 0000000..292c84d --- /dev/null +++ b/desktop/coverage/src/components/PipelinesPanel.tsx.html @@ -0,0 +1,1648 @@ + + + + + + Code coverage report for src/components/PipelinesPanel.tsx + + + + + + + + + +
+
+

All files / src/components PipelinesPanel.tsx

+
+ +
+ 0% + Statements + 0/389 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/389 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * PipelinesPanel - Pipeline Discovery and Execution UI
+ *
+ * Displays available Pipelines (DSL-based workflows) with
+ * category filtering, search, and execution capabilities.
+ *
+ * Pipelines orchestrate Skills and Hands to accomplish complex tasks.
+ */
+ 
+import { useState } from 'react';
+import {
+  Play,
+  RefreshCw,
+  Search,
+  Loader2,
+  XCircle,
+  Package,
+  Filter,
+  X,
+} from 'lucide-react';
+import {
+  PipelineClient,
+  PipelineInfo,
+  PipelineRunResponse,
+  usePipelines,
+  validateInputs,
+  getDefaultForType,
+  formatInputType,
+} from '../lib/pipeline-client';
+import { useToast } from './ui/Toast';
+ 
+// === Category Badge Component ===
+ 
+const CATEGORY_CONFIG: Record<string, { label: string; className: string }> = {
+  education: { label: '教育', className: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400' },
+  marketing: { label: '营销', className: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400' },
+  legal: { label: '法律', className: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400' },
+  productivity: { label: '生产力', className: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400' },
+  research: { label: '研究', className: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400' },
+  sales: { label: '销售', className: 'bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400' },
+  hr: { label: '人力', className: 'bg-teal-100 text-teal-700 dark:bg-teal-900/30 dark:text-teal-400' },
+  finance: { label: '财务', className: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400' },
+  default: { label: '其他', className: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400' },
+};
+ 
+function CategoryBadge({ category }: { category: string }) {
+  const config = CATEGORY_CONFIG[category] || CATEGORY_CONFIG.default;
+  return (
+    <span className={`px-2 py-0.5 rounded text-xs font-medium ${config.className}`}>
+      {config.label}
+    </span>
+  );
+}
+ 
+// === Pipeline Card Component ===
+ 
+interface PipelineCardProps {
+  pipeline: PipelineInfo;
+  onRun: (pipeline: PipelineInfo) => void;
+}
+ 
+function PipelineCard({ pipeline, onRun }: PipelineCardProps) {
+  return (
+    <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4 hover:shadow-md transition-shadow">
+      <div className="flex items-start justify-between mb-3">
+        <div className="flex items-center gap-3">
+          <span className="text-2xl">{pipeline.icon}</span>
+          <div>
+            <h3 className="font-medium text-gray-900 dark:text-white">
+              {pipeline.displayName}
+            </h3>
+            <p className="text-sm text-gray-500 dark:text-gray-400">
+              {pipeline.id} · v{pipeline.version}
+            </p>
+          </div>
+        </div>
+        <CategoryBadge category={pipeline.category} />
+      </div>
+ 
+      <p className="text-sm text-gray-600 dark:text-gray-300 mb-3 line-clamp-2">
+        {pipeline.description}
+      </p>
+ 
+      {pipeline.tags.length > 0 && (
+        <div className="flex flex-wrap gap-1 mb-3">
+          {pipeline.tags.slice(0, 3).map((tag) => (
+            <span
+              key={tag}
+              className="px-1.5 py-0.5 bg-gray-100 dark:bg-gray-700 rounded text-xs text-gray-600 dark:text-gray-300"
+            >
+              {tag}
+            </span>
+          ))}
+          {pipeline.tags.length > 3 && (
+            <span className="px-1.5 py-0.5 text-xs text-gray-400">
+              +{pipeline.tags.length - 3}
+            </span>
+          )}
+        </div>
+      )}
+ 
+      <div className="flex items-center justify-between pt-2 border-t border-gray-100 dark:border-gray-700">
+        <span className="text-xs text-gray-400">
+          {pipeline.inputs.length} 个输入参数
+        </span>
+        <button
+          onClick={() => onRun(pipeline)}
+          className="flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white text-sm font-medium rounded-md transition-colors"
+        >
+          <Play className="w-4 h-4" />
+          运行
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+// === Pipeline Run Modal ===
+ 
+interface RunModalProps {
+  pipeline: PipelineInfo;
+  onClose: () => void;
+  onComplete: (result: PipelineRunResponse) => void;
+}
+ 
+function RunModal({ pipeline, onClose, onComplete }: RunModalProps) {
+  const [values, setValues] = useState<Record<string, unknown>>(() => {
+    const defaults: Record<string, unknown> = {};
+    pipeline.inputs.forEach((input) => {
+      defaults[input.name] = input.default ?? getDefaultForType(input.inputType);
+    });
+    return defaults;
+  });
+  const [errors, setErrors] = useState<string[]>([]);
+  const [running, setRunning] = useState(false);
+  const [progress, setProgress] = useState<PipelineRunResponse | null>(null);
+ 
+  const handleInputChange = (name: string, value: unknown) => {
+    setValues((prev) => ({ ...prev, [name]: value }));
+    setErrors([]);
+  };
+ 
+  const handleRun = async () => {
+    // Validate inputs
+    const validation = validateInputs(pipeline.inputs, values);
+    if (!validation.valid) {
+      setErrors(validation.errors);
+      return;
+    }
+ 
+    setRunning(true);
+    setProgress(null);
+ 
+    try {
+      const result = await PipelineClient.runAndWait(
+        { pipelineId: pipeline.id, inputs: values },
+        (p) => setProgress(p)
+      );
+ 
+      if (result.status === 'completed') {
+        onComplete(result);
+      } else if (result.error) {
+        setErrors([result.error]);
+      }
+    } catch (err) {
+      setErrors([err instanceof Error ? err.message : String(err)]);
+    } finally {
+      setRunning(false);
+    }
+  };
+ 
+  const renderInput = (input: typeof pipeline.inputs[0]) => {
+    const value = values[input.name];
+ 
+    switch (input.inputType) {
+      case 'string':
+      case 'text':
+        return input.inputType === 'text' ? (
+          <textarea
+            value={(value as string) || ''}
+            onChange={(e) => handleInputChange(input.name, e.target.value)}
+            placeholder={input.placeholder}
+            rows={3}
+            className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
+          />
+        ) : (
+          <input
+            type="text"
+            value={(value as string) || ''}
+            onChange={(e) => handleInputChange(input.name, e.target.value)}
+            placeholder={input.placeholder}
+            className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
+          />
+        );
+ 
+      case 'number':
+        return (
+          <input
+            type="number"
+            value={(value as number) ?? ''}
+            onChange={(e) => handleInputChange(input.name, e.target.valueAsNumber || 0)}
+            className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
+          />
+        );
+ 
+      case 'boolean':
+        return (
+          <label className="flex items-center gap-2">
+            <input
+              type="checkbox"
+              checked={(value as boolean) || false}
+              onChange={(e) => handleInputChange(input.name, e.target.checked)}
+              className="rounded border-gray-300 text-blue-600 focus:ring-blue-500"
+            />
+            <span className="text-sm text-gray-600 dark:text-gray-300">启用</span>
+          </label>
+        );
+ 
+      case 'select':
+        return (
+          <select
+            value={(value as string) || ''}
+            onChange={(e) => handleInputChange(input.name, e.target.value)}
+            className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
+          >
+            <option value="">请选择...</option>
+            {input.options.map((opt) => (
+              <option key={opt} value={opt}>
+                {opt}
+              </option>
+            ))}
+          </select>
+        );
+ 
+      case 'multi-select':
+        return (
+          <div className="space-y-2">
+            {input.options.map((opt) => (
+              <label key={opt} className="flex items-center gap-2">
+                <input
+                  type="checkbox"
+                  checked={((value as string[]) || []).includes(opt)}
+                  onChange={(e) => {
+                    const current = (value as string[]) || [];
+                    const updated = e.target.checked
+                      ? [...current, opt]
+                      : current.filter((v) => v !== opt);
+                    handleInputChange(input.name, updated);
+                  }}
+                  className="rounded border-gray-300 text-blue-600 focus:ring-blue-500"
+                />
+                <span className="text-sm text-gray-600 dark:text-gray-300">{opt}</span>
+              </label>
+            ))}
+          </div>
+        );
+ 
+      default:
+        return (
+          <input
+            type="text"
+            value={(value as string) || ''}
+            onChange={(e) => handleInputChange(input.name, e.target.value)}
+            placeholder={input.placeholder}
+            className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
+          />
+        );
+    }
+  };
+ 
+  return (
+    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
+      <div className="bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-lg w-full mx-4 max-h-[90vh] overflow-y-auto">
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+          <div className="flex items-center gap-3">
+            <span className="text-2xl">{pipeline.icon}</span>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                {pipeline.displayName}
+              </h2>
+              <p className="text-sm text-gray-500 dark:text-gray-400">
+                {pipeline.description}
+              </p>
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded"
+          >
+            <X className="w-5 h-5 text-gray-500" />
+          </button>
+        </div>
+ 
+        {/* Form */}
+        <div className="p-4 space-y-4">
+          {pipeline.inputs.map((input) => (
+            <div key={input.name}>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                {input.label}
+                {input.required && <span className="text-red-500 ml-1">*</span>}
+                <span className="text-xs text-gray-400 ml-2">
+                  ({formatInputType(input.inputType)})
+                </span>
+              </label>
+              {renderInput(input)}
+            </div>
+          ))}
+ 
+          {errors.length > 0 && (
+            <div className="p-3 bg-red-50 dark:bg-red-900/20 rounded-md">
+              {errors.map((error, i) => (
+                <p key={i} className="text-sm text-red-600 dark:text-red-400">
+                  {error}
+                </p>
+              ))}
+            </div>
+          )}
+ 
+          {/* Progress */}
+          {running && progress && (
+            <div className="p-3 bg-blue-50 dark:bg-blue-900/20 rounded-md">
+              <div className="flex items-center gap-2 mb-2">
+                <Loader2 className="w-4 h-4 animate-spin text-blue-600" />
+                <span className="text-sm font-medium text-blue-700 dark:text-blue-300">
+                  {progress.message || '运行中...'}
+                </span>
+              </div>
+              <div className="w-full bg-blue-200 dark:bg-blue-800 rounded-full h-2">
+                <div
+                  className="bg-blue-600 h-2 rounded-full transition-all"
+                  style={{ width: `${progress.percentage}%` }}
+                />
+              </div>
+            </div>
+          )}
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-3 p-4 border-t border-gray-200 dark:border-gray-700">
+          <button
+            onClick={onClose}
+            disabled={running}
+            className="px-4 py-2 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md disabled:opacity-50"
+          >
+            取消
+          </button>
+          <button
+            onClick={handleRun}
+            disabled={running}
+            className="flex items-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white font-medium rounded-md disabled:opacity-50"
+          >
+            {running ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                运行中...
+              </>
+            ) : (
+              <>
+                <Play className="w-4 h-4" />
+                开始运行
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// === Main Pipelines Panel ===
+ 
+export function PipelinesPanel() {
+  const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
+  const [searchQuery, setSearchQuery] = useState('');
+  const [selectedPipeline, setSelectedPipeline] = useState<PipelineInfo | null>(null);
+  const { toast } = useToast();
+ 
+  const { pipelines, loading, error, refresh } = usePipelines({
+    category: selectedCategory ?? undefined,
+  });
+ 
+  // Get unique categories
+  const categories = Array.from(
+    new Set(pipelines.map((p) => p.category).filter(Boolean))
+  );
+ 
+  // Filter pipelines by search
+  const filteredPipelines = searchQuery
+    ? pipelines.filter(
+        (p) =>
+          p.displayName.toLowerCase().includes(searchQuery.toLowerCase()) ||
+          p.description.toLowerCase().includes(searchQuery.toLowerCase()) ||
+          p.tags.some((t) => t.toLowerCase().includes(searchQuery.toLowerCase()))
+      )
+    : pipelines;
+ 
+  const handleRunPipeline = (pipeline: PipelineInfo) => {
+    setSelectedPipeline(pipeline);
+  };
+ 
+  const handleRunComplete = (result: PipelineRunResponse) => {
+    setSelectedPipeline(null);
+    if (result.status === 'completed') {
+      toast('Pipeline 执行完成', 'success');
+    } else {
+      toast(`Pipeline 执行失败: ${result.error}`, 'error');
+    }
+  };
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Package className="w-5 h-5 text-gray-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            Pipelines
+          </h2>
+          <span className="px-2 py-0.5 bg-gray-100 dark:bg-gray-700 rounded-full text-xs text-gray-600 dark:text-gray-300">
+            {pipelines.length}
+          </span>
+        </div>
+        <button
+          onClick={refresh}
+          disabled={loading}
+          className="flex items-center gap-1.5 px-3 py-1.5 text-sm text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md"
+        >
+          <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />
+          刷新
+        </button>
+      </div>
+ 
+      {/* Filters */}
+      <div className="p-4 border-b border-gray-200 dark:border-gray-700 space-y-3">
+        {/* Search */}
+        <div className="relative">
+          <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
+          <input
+            type="text"
+            placeholder="搜索 Pipelines..."
+            value={searchQuery}
+            onChange={(e) => setSearchQuery(e.target.value)}
+            className="w-full pl-9 pr-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white"
+          />
+        </div>
+ 
+        {/* Category filters */}
+        {categories.length > 0 && (
+          <div className="flex items-center gap-2 flex-wrap">
+            <Filter className="w-4 h-4 text-gray-400" />
+            <button
+              onClick={() => setSelectedCategory(null)}
+              className={`px-2 py-1 text-xs rounded-md transition-colors ${
+                selectedCategory === null
+                  ? 'bg-blue-600 text-white'
+                  : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600'
+              }`}
+            >
+              全部
+            </button>
+            {categories.map((cat) => (
+              <button
+                key={cat}
+                onClick={() => setSelectedCategory(cat)}
+                className={`px-2 py-1 text-xs rounded-md transition-colors ${
+                  selectedCategory === cat
+                    ? 'bg-blue-600 text-white'
+                    : 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600'
+                }`}
+              >
+                {CATEGORY_CONFIG[cat]?.label || cat}
+              </button>
+            ))}
+          </div>
+        )}
+      </div>
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4">
+        {loading ? (
+          <div className="flex items-center justify-center h-32">
+            <Loader2 className="w-6 h-6 animate-spin text-gray-400" />
+          </div>
+        ) : error ? (
+          <div className="text-center py-8 text-red-500">
+            <XCircle className="w-8 h-8 mx-auto mb-2" />
+            <p>{error}</p>
+          </div>
+        ) : filteredPipelines.length === 0 ? (
+          <div className="text-center py-8 text-gray-500">
+            <Package className="w-8 h-8 mx-auto mb-2" />
+            <p>没有找到 Pipeline</p>
+            {searchQuery && <p className="text-sm mt-1">尝试修改搜索条件</p>}
+          </div>
+        ) : (
+          <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
+            {filteredPipelines.map((pipeline) => (
+              <PipelineCard
+                key={pipeline.id}
+                pipeline={pipeline}
+                onRun={handleRunPipeline}
+              />
+            ))}
+          </div>
+        )}
+      </div>
+ 
+      {/* Run Modal */}
+      {selectedPipeline && (
+        <RunModal
+          pipeline={selectedPipeline}
+          onClose={() => setSelectedPipeline(null)}
+          onComplete={handleRunComplete}
+        />
+      )}
+    </div>
+  );
+}
+ 
+export default PipelinesPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ReflectionLog.tsx.html b/desktop/coverage/src/components/ReflectionLog.tsx.html new file mode 100644 index 0000000..910c745 --- /dev/null +++ b/desktop/coverage/src/components/ReflectionLog.tsx.html @@ -0,0 +1,2374 @@ + + + + + + Code coverage report for src/components/ReflectionLog.tsx + + + + + + + + + +
+
+

All files / src/components ReflectionLog.tsx

+
+ +
+ 0% + Statements + 0/564 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/564 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ReflectionLog - Self-reflection history and identity change approval UI
+ *
+ * Displays:
+ * - Reflection history (patterns, improvements)
+ * - Pending identity change proposals
+ * - Approve/reject identity modifications
+ * - Manual reflection trigger
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { useState, useEffect, useCallback, useMemo } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Brain,
+  Check,
+  X,
+  ChevronDown,
+  ChevronRight,
+  RefreshCw,
+  AlertTriangle,
+  TrendingUp,
+  TrendingDown,
+  Minus,
+  FileText,
+  History,
+  Play,
+  Settings,
+} from 'lucide-react';
+import {
+  intelligenceClient,
+  type ReflectionResult,
+  type IdentityChangeProposal,
+  type ReflectionConfig,
+  type PatternObservation,
+  type ImprovementSuggestion,
+} from '../lib/intelligence-client';
+ 
+// === Config Persistence ===
+ 
+const REFLECTION_CONFIG_KEY = 'zclaw-reflection-config';
+ 
+const DEFAULT_CONFIG: ReflectionConfig = {
+  trigger_after_conversations: 5,
+  allow_soul_modification: true,
+  require_approval: true,
+  use_llm: true,
+  llm_fallback_to_rules: true,
+};
+ 
+function loadConfig(): ReflectionConfig {
+  try {
+    const stored = localStorage.getItem(REFLECTION_CONFIG_KEY);
+    if (stored) {
+      const parsed = JSON.parse(stored);
+      return { ...DEFAULT_CONFIG, ...parsed };
+    }
+  } catch {
+    console.warn('[ReflectionLog] Failed to load config from localStorage');
+  }
+  return DEFAULT_CONFIG;
+}
+ 
+function saveConfig(config: ReflectionConfig): void {
+  try {
+    localStorage.setItem(REFLECTION_CONFIG_KEY, JSON.stringify(config));
+  } catch {
+    console.warn('[ReflectionLog] Failed to save config to localStorage');
+  }
+}
+ 
+// === Types ===
+ 
+interface ReflectionLogProps {
+  className?: string;
+  agentId?: string;
+  onProposalApprove?: (proposal: IdentityChangeProposal) => void;
+  onProposalReject?: (proposal: IdentityChangeProposal) => void;
+}
+ 
+// === Sentiment Config ===
+ 
+const SENTIMENT_CONFIG: Record<string, { icon: typeof TrendingUp; color: string; bgColor: string }> = {
+  positive: {
+    icon: TrendingUp,
+    color: 'text-green-600 dark:text-green-400',
+    bgColor: 'bg-green-100 dark:bg-green-900/30',
+  },
+  negative: {
+    icon: TrendingDown,
+    color: 'text-red-600 dark:text-red-400',
+    bgColor: 'bg-red-100 dark:bg-red-900/30',
+  },
+  neutral: {
+    icon: Minus,
+    color: 'text-gray-600 dark:text-gray-400',
+    bgColor: 'bg-gray-100 dark:bg-gray-800',
+  },
+};
+ 
+// === Priority Config ===
+ 
+const PRIORITY_CONFIG: Record<string, { color: string; bgColor: string }> = {
+  high: {
+    color: 'text-red-600 dark:text-red-400',
+    bgColor: 'bg-red-100 dark:bg-red-900/30',
+  },
+  medium: {
+    color: 'text-yellow-600 dark:text-yellow-400',
+    bgColor: 'bg-yellow-100 dark:bg-yellow-900/30',
+  },
+  low: {
+    color: 'text-blue-600 dark:text-blue-400',
+    bgColor: 'bg-blue-100 dark:bg-blue-900/30',
+  },
+};
+ 
+// === Field to File Mapping ===
+ 
+/**
+ * Maps reflection field names to identity file types.
+ * This ensures correct routing of identity change proposals.
+ */
+function mapFieldToFile(field: string): 'soul' | 'instructions' {
+  // Direct matches
+  if (field === 'soul' || field === 'instructions') {
+    return field;
+  }
+ 
+  // Known soul fields (core personality traits)
+  const soulFields = [
+    'personality',
+    'traits',
+    'values',
+    'identity',
+    'character',
+    'essence',
+    'core_behavior',
+  ];
+ 
+  // Known instructions fields (operational guidelines)
+  const instructionsFields = [
+    'guidelines',
+    'rules',
+    'behavior_rules',
+    'response_format',
+    'communication_guidelines',
+    'task_handling',
+  ];
+ 
+  const lowerField = field.toLowerCase();
+ 
+  // Check explicit mappings
+  if (soulFields.some((f) => lowerField.includes(f))) {
+    return 'soul';
+  }
+  if (instructionsFields.some((f) => lowerField.includes(f))) {
+    return 'instructions';
+  }
+ 
+  // Fallback heuristics
+  if (lowerField.includes('soul') || lowerField.includes('personality') || lowerField.includes('trait')) {
+    return 'soul';
+  }
+ 
+  // Default to instructions for operational changes
+  return 'instructions';
+}
+ 
+// === Components ===
+ 
+function SentimentBadge({ sentiment }: { sentiment: string }) {
+  const config = SENTIMENT_CONFIG[sentiment] || SENTIMENT_CONFIG.neutral;
+  const Icon = config.icon;
+  return (
+    <span
+      className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium ${config.bgColor} ${config.color}`}
+    >
+      <Icon className="w-3 h-3" />
+      {sentiment === 'positive' ? '积极' : sentiment === 'negative' ? '消极' : '中性'}
+    </span>
+  );
+}
+ 
+function PriorityBadge({ priority }: { priority: string }) {
+  const config = PRIORITY_CONFIG[priority] || PRIORITY_CONFIG.medium;
+  return (
+    <span
+      className={`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${config.bgColor} ${config.color}`}
+    >
+      {priority === 'high' ? '高' : priority === 'medium' ? '中' : '低'}
+    </span>
+  );
+}
+ 
+function PatternCard({ pattern }: { pattern: PatternObservation }) {
+  const [expanded, setExpanded] = useState(false);
+ 
+  return (
+    <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden">
+      <button
+        onClick={() => setExpanded(!expanded)}
+        className="w-full flex items-start gap-3 p-3 hover:bg-gray-50 dark:hover:bg-gray-800/30 transition-colors text-left"
+      >
+        <SentimentBadge sentiment={pattern.sentiment} />
+        <div className="flex-1 min-w-0">
+          <p className="text-sm text-gray-900 dark:text-gray-100">{pattern.observation}</p>
+          <p className="text-xs text-gray-500 dark:text-gray-400 mt-1">
+            出现频率: {pattern.frequency} 次
+          </p>
+        </div>
+        {expanded ? (
+          <ChevronDown className="w-4 h-4 text-gray-400 flex-shrink-0" />
+        ) : (
+          <ChevronRight className="w-4 h-4 text-gray-400 flex-shrink-0" />
+        )}
+      </button>
+ 
+      <AnimatePresence>
+        {expanded && pattern.evidence.length > 0 && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-t border-gray-200 dark:border-gray-700 p-3 bg-gray-50 dark:bg-gray-800/30"
+          >
+            <h5 className="text-xs font-medium text-gray-500 dark:text-gray-400 mb-2">证据</h5>
+            <ul className="space-y-1">
+              {pattern.evidence.map((ev, i) => (
+                <li key={i} className="text-xs text-gray-600 dark:text-gray-300 pl-2 border-l-2 border-gray-300 dark:border-gray-600">
+                  {ev}
+                </li>
+              ))}
+            </ul>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+function ImprovementCard({ improvement }: { improvement: ImprovementSuggestion }) {
+  return (
+    <div className="flex items-start gap-3 p-3 border border-gray-200 dark:border-gray-700 rounded-lg">
+      <div className="flex-1 min-w-0">
+        <div className="flex items-center gap-2 mb-1">
+          <span className="text-sm font-medium text-gray-900 dark:text-gray-100">
+            {improvement.area}
+          </span>
+          <PriorityBadge priority={improvement.priority} />
+        </div>
+        <p className="text-sm text-gray-600 dark:text-gray-300">{improvement.suggestion}</p>
+      </div>
+    </div>
+  );
+}
+ 
+function ProposalCard({
+  proposal,
+  onApprove,
+  onReject,
+}: {
+  proposal: IdentityChangeProposal;
+  onApprove: () => void;
+  onReject: () => void;
+}) {
+  const [expanded, setExpanded] = useState(false);
+ 
+  const fileName = proposal.file.split('/').pop() || proposal.file;
+  const fileType = fileName.toLowerCase().replace('.md', '').toUpperCase();
+ 
+  return (
+    <div className="border border-yellow-300 dark:border-yellow-700 rounded-lg overflow-hidden bg-yellow-50 dark:bg-yellow-900/20">
+      <div className="flex items-center gap-3 p-3">
+        <div className="w-8 h-8 rounded-lg bg-yellow-100 dark:bg-yellow-800 flex items-center justify-center">
+          <FileText className="w-4 h-4 text-yellow-600 dark:text-yellow-400" />
+        </div>
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2">
+            <span className="text-sm font-medium text-yellow-800 dark:text-yellow-200">
+              {fileType} 变更提议
+            </span>
+            <span className="px-1.5 py-0.5 text-xs bg-yellow-200 dark:bg-yellow-800 text-yellow-700 dark:text-yellow-300 rounded">
+              待审批
+            </span>
+          </div>
+          <p className="text-xs text-yellow-600 dark:text-yellow-400 truncate">
+            {proposal.reason}
+          </p>
+        </div>
+        <button
+          onClick={() => setExpanded(!expanded)}
+          className="p-1 text-yellow-600 dark:text-yellow-400 hover:bg-yellow-100 dark:hover:bg-yellow-800 rounded"
+        >
+          {expanded ? (
+            <ChevronDown className="w-4 h-4" />
+          ) : (
+            <ChevronRight className="w-4 h-4" />
+          )}
+        </button>
+      </div>
+ 
+      <AnimatePresence>
+        {expanded && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-t border-yellow-200 dark:border-yellow-700"
+          >
+            <div className="p-3 space-y-3">
+              <div>
+                <h5 className="text-xs font-medium text-yellow-700 dark:text-yellow-300 mb-1">
+                  当前内容
+                </h5>
+                <pre className="text-xs text-gray-600 dark:text-gray-300 bg-white dark:bg-gray-800 p-2 rounded overflow-x-auto whitespace-pre-wrap">
+                  {proposal.current_content.slice(0, 500)}
+                  {proposal.current_content.length > 500 && '...'}
+                </pre>
+              </div>
+              <div>
+                <h5 className="text-xs font-medium text-yellow-700 dark:text-yellow-300 mb-1">
+                  建议内容
+                </h5>
+                <pre className="text-xs text-gray-600 dark:text-gray-300 bg-white dark:bg-gray-800 p-2 rounded overflow-x-auto whitespace-pre-wrap">
+                  {proposal.suggested_content.slice(0, 500)}
+                  {proposal.suggested_content.length > 500 && '...'}
+                </pre>
+              </div>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+ 
+      <div className="flex justify-end gap-2 p-3 border-t border-yellow-200 dark:border-yellow-700">
+        <button
+          onClick={onReject}
+          className="flex items-center gap-1 px-3 py-1.5 text-sm text-gray-600 dark:text-gray-400 hover:text-red-600 dark:hover:text-red-400 transition-colors"
+        >
+          <X className="w-4 h-4" />
+          拒绝
+        </button>
+        <button
+          onClick={onApprove}
+          className="flex items-center gap-1 px-3 py-1.5 text-sm bg-green-500 hover:bg-green-600 text-white rounded-lg transition-colors"
+        >
+          <Check className="w-4 h-4" />
+          批准
+        </button>
+      </div>
+    </div>
+  );
+}
+ 
+function ReflectionEntry({
+  result,
+  isExpanded,
+  onToggle,
+}: {
+  result: ReflectionResult;
+  isExpanded: boolean;
+  onToggle: () => void;
+}) {
+  const positivePatterns = result.patterns.filter((p) => p.sentiment === 'positive').length;
+  const negativePatterns = result.patterns.filter((p) => p.sentiment === 'negative').length;
+ 
+  return (
+    <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden">
+      <button
+        onClick={onToggle}
+        className="w-full flex items-center gap-3 p-4 hover:bg-gray-50 dark:hover:bg-gray-800/30 transition-colors text-left"
+      >
+        <div className="w-10 h-10 rounded-lg bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center">
+          <Brain className="w-5 h-5 text-purple-500" />
+        </div>
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2 mb-1">
+            <span className="text-sm font-medium text-gray-900 dark:text-gray-100">
+              自我反思
+            </span>
+            <span className="text-xs text-gray-500 dark:text-gray-400">
+              {new Date(result.timestamp).toLocaleString('zh-CN')}
+            </span>
+          </div>
+          <div className="flex items-center gap-3 text-xs">
+            <span className="text-green-600 dark:text-green-400">
+              {positivePatterns} 积极
+            </span>
+            <span className="text-red-600 dark:text-red-400">
+              {negativePatterns} 消极
+            </span>
+            <span className="text-gray-500 dark:text-gray-400">
+              {result.improvements.length} 建议
+            </span>
+            {result.identity_proposals.length > 0 && (
+              <span className="text-yellow-600 dark:text-yellow-400">
+                {result.identity_proposals.length} 变更
+              </span>
+            )}
+          </div>
+        </div>
+        {isExpanded ? (
+          <ChevronDown className="w-4 h-4 text-gray-400" />
+        ) : (
+          <ChevronRight className="w-4 h-4 text-gray-400" />
+        )}
+      </button>
+ 
+      <AnimatePresence>
+        {isExpanded && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-t border-gray-200 dark:border-gray-700"
+          >
+            <div className="p-4 space-y-4">
+              {/* Patterns */}
+              {result.patterns.length > 0 && (
+                <div>
+                  <h4 className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">
+                    行为模式
+                  </h4>
+                  <div className="space-y-2">
+                    {result.patterns.map((pattern, i) => (
+                      <PatternCard key={i} pattern={pattern} />
+                    ))}
+                  </div>
+                </div>
+              )}
+ 
+              {/* Improvements */}
+              {result.improvements.length > 0 && (
+                <div>
+                  <h4 className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">
+                    改进建议
+                  </h4>
+                  <div className="space-y-2">
+                    {result.improvements.map((improvement, i) => (
+                      <ImprovementCard key={i} improvement={improvement} />
+                    ))}
+                  </div>
+                </div>
+              )}
+ 
+              {/* Meta */}
+              <div className="flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400 pt-2 border-t border-gray-200 dark:border-gray-700">
+                <span>新增记忆: {result.new_memories}</span>
+                <span>身份变更提议: {result.identity_proposals.length}</span>
+              </div>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function ReflectionLog({
+  className = '',
+  agentId = 'zclaw-main',
+  onProposalApprove,
+  onProposalReject,
+}: ReflectionLogProps) {
+  const [history, setHistory] = useState<ReflectionResult[]>([]);
+  const [pendingProposals, setPendingProposals] = useState<IdentityChangeProposal[]>([]);
+  const [expandedId, setExpandedId] = useState<string | null>(null);
+  const [isReflecting, setIsReflecting] = useState(false);
+  const [showConfig, setShowConfig] = useState(false);
+  const [config, setConfig] = useState<ReflectionConfig>(() => loadConfig());
+  const [error, setError] = useState<string | null>(null);
+ 
+  // Persist config changes
+  useEffect(() => {
+    saveConfig(config);
+  }, [config]);
+ 
+  // Load history and pending proposals
+  useEffect(() => {
+    const loadData = async () => {
+      try {
+        // Initialize reflection engine with config that allows soul modification
+        await intelligenceClient.reflection.init(config);
+ 
+        const loadedHistory = await intelligenceClient.reflection.getHistory();
+        setHistory([...loadedHistory].reverse()); // Most recent first
+ 
+        const proposals = await intelligenceClient.identity.getPendingProposals(agentId);
+        setPendingProposals(proposals);
+      } catch (error) {
+        console.error('[ReflectionLog] Failed to load data:', error);
+      }
+    };
+    loadData();
+  }, [agentId, config]);
+ 
+  const handleReflect = useCallback(async () => {
+    setIsReflecting(true);
+    setError(null);
+    try {
+      // Fetch recent memories for analysis
+      const memories = await intelligenceClient.memory.search({
+        agentId,
+        limit: 50, // Get enough memories for pattern analysis
+      });
+ 
+      // Convert to analysis format
+      const memoriesForAnalysis = memories.map((m) => ({
+        memory_type: m.type,
+        content: m.content,
+        importance: m.importance,
+        access_count: m.accessCount,
+        tags: m.tags,
+      }));
+ 
+      const result = await intelligenceClient.reflection.reflect(agentId, memoriesForAnalysis);
+      setHistory((prev) => [result, ...prev]);
+ 
+      // Convert reflection identity_proposals to actual identity proposals
+      // The reflection result contains proposals that need to be persisted
+      if (result.identity_proposals && result.identity_proposals.length > 0) {
+        for (const proposal of result.identity_proposals) {
+          try {
+            // Map field to file type with explicit mapping rules
+            const file = mapFieldToFile(proposal.field);
+ 
+            // Persist the proposal to the identity system
+            await intelligenceClient.identity.proposeChange(
+              agentId,
+              file,
+              proposal.proposed_value,
+              proposal.reason
+            );
+          } catch (err) {
+            console.warn('[ReflectionLog] Failed to create identity proposal:', err);
+          }
+        }
+ 
+        // Refresh pending proposals from the identity system
+        const proposals = await intelligenceClient.identity.getPendingProposals(agentId);
+        setPendingProposals(proposals);
+      }
+    } catch (err) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      console.error('[ReflectionLog] Reflection failed:', err);
+      setError(`反思失败: ${errorMessage}`);
+    } finally {
+      setIsReflecting(false);
+    }
+  }, [agentId]);
+ 
+  const handleApproveProposal = useCallback(
+    async (proposal: IdentityChangeProposal) => {
+      await intelligenceClient.identity.approveProposal(proposal.id);
+      setPendingProposals((prev: IdentityChangeProposal[]) => prev.filter((p: IdentityChangeProposal) => p.id !== proposal.id));
+      onProposalApprove?.(proposal);
+    },
+    [onProposalApprove]
+  );
+ 
+  const handleRejectProposal = useCallback(
+    async (proposal: IdentityChangeProposal) => {
+      await intelligenceClient.identity.rejectProposal(proposal.id);
+      setPendingProposals((prev: IdentityChangeProposal[]) => prev.filter((p: IdentityChangeProposal) => p.id !== proposal.id));
+      onProposalReject?.(proposal);
+    },
+    [onProposalReject]
+  );
+ 
+  const stats = useMemo(() => {
+    const totalReflections = history.length;
+    const totalPatterns = history.reduce((sum: number, r: ReflectionResult) => sum + r.patterns.length, 0);
+    const totalImprovements = history.reduce((sum: number, r: ReflectionResult) => sum + r.improvements.length, 0);
+    const totalIdentityChanges = history.reduce((sum: number, r: ReflectionResult) => sum + r.identity_proposals.length, 0);
+    return { totalReflections, totalPatterns, totalImprovements, totalIdentityChanges };
+  }, [history]);
+ 
+  return (
+    <div className={`flex flex-col h-full ${className}`}>
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Brain className="w-5 h-5 text-purple-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-gray-100">反思日志</h2>
+        </div>
+        <div className="flex items-center gap-2">
+          <button
+            onClick={() => setShowConfig(!showConfig)}
+            className="p-1.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
+            title="配置"
+          >
+            <Settings className="w-4 h-4" />
+          </button>
+          <button
+            onClick={handleReflect}
+            disabled={isReflecting}
+            className="flex items-center gap-1 px-3 py-1.5 text-sm bg-purple-500 hover:bg-purple-600 disabled:bg-gray-300 disabled:cursor-not-allowed text-white rounded-lg transition-colors"
+          >
+            {isReflecting ? (
+              <RefreshCw className="w-4 h-4 animate-spin" />
+            ) : (
+              <Play className="w-4 h-4" />
+            )}
+            反思
+          </button>
+        </div>
+      </div>
+ 
+      {/* Stats Bar */}
+      <div className="flex items-center gap-4 px-4 py-2 bg-gray-50 dark:bg-gray-800/50 border-b border-gray-200 dark:border-gray-700 text-xs">
+        <span className="text-gray-500 dark:text-gray-400">
+          反思: <span className="font-medium text-gray-900 dark:text-gray-100">{stats.totalReflections}</span>
+        </span>
+        <span className="text-purple-600 dark:text-purple-400">
+          模式: <span className="font-medium">{stats.totalPatterns}</span>
+        </span>
+        <span className="text-blue-600 dark:text-blue-400">
+          建议: <span className="font-medium">{stats.totalImprovements}</span>
+        </span>
+        <span className="text-yellow-600 dark:text-yellow-400">
+          变更: <span className="font-medium">{stats.totalIdentityChanges}</span>
+        </span>
+      </div>
+ 
+      {/* Error Banner */}
+      <AnimatePresence>
+        {error && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="overflow-hidden"
+          >
+            <div className="flex items-center justify-between gap-2 px-4 py-2 bg-red-50 dark:bg-red-900/20 border-b border-red-200 dark:border-red-800">
+              <div className="flex items-center gap-2 text-red-700 dark:text-red-300 text-sm">
+                <AlertTriangle className="w-4 h-4" />
+                <span>{error}</span>
+              </div>
+              <button
+                onClick={() => setError(null)}
+                className="p-1 text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-200"
+              >
+                <X className="w-4 h-4" />
+              </button>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+ 
+      {/* Config Panel */}
+      <AnimatePresence>
+        {showConfig && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-b border-gray-200 dark:border-gray-700 overflow-hidden"
+          >
+            <div className="p-4 bg-gray-50 dark:bg-gray-800/50 space-y-3">
+              <div className="flex items-center justify-between">
+                <span className="text-sm text-gray-700 dark:text-gray-300">对话后触发反思</span>
+                <input
+                  type="number"
+                  min="1"
+                  max="20"
+                  value={config.trigger_after_conversations || 5}
+                  onChange={(e) =>
+                    setConfig((prev) => ({ ...prev, trigger_after_conversations: parseInt(e.target.value) || 5 }))
+                  }
+                  className="w-16 px-2 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100"
+                />
+              </div>
+              <div className="flex items-center justify-between">
+                <span className="text-sm text-gray-700 dark:text-gray-300">允许修改 SOUL.md</span>
+                <button
+                  onClick={() => setConfig((prev) => ({ ...prev, allow_soul_modification: !prev.allow_soul_modification }))}
+                  className={`relative w-9 h-5 rounded-full transition-colors ${
+                    config.allow_soul_modification ? 'bg-purple-500' : 'bg-gray-300 dark:bg-gray-600'
+                  }`}
+                >
+                  <motion.div
+                    animate={{ x: config.allow_soul_modification ? 18 : 0 }}
+                    className="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow"
+                  />
+                </button>
+              </div>
+              <div className="flex items-center justify-between">
+                <span className="text-sm text-gray-700 dark:text-gray-300">变更需审批</span>
+                <button
+                  onClick={() => setConfig((prev) => ({ ...prev, require_approval: !prev.require_approval }))}
+                  className={`relative w-9 h-5 rounded-full transition-colors ${
+                    config.require_approval ? 'bg-purple-500' : 'bg-gray-300 dark:bg-gray-600'
+                  }`}
+                >
+                  <motion.div
+                    animate={{ x: config.require_approval ? 18 : 0 }}
+                    className="absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full shadow"
+                  />
+                </button>
+              </div>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-4">
+        {/* Pending Proposals */}
+        {pendingProposals.length > 0 && (
+          <div className="space-y-3">
+            <h3 className="flex items-center gap-2 text-sm font-medium text-yellow-700 dark:text-yellow-300">
+              <AlertTriangle className="w-4 h-4" />
+              待审批变更 ({pendingProposals.length})
+            </h3>
+            {pendingProposals.map((proposal) => (
+              <ProposalCard
+                key={proposal.id}
+                proposal={proposal}
+                onApprove={() => handleApproveProposal(proposal)}
+                onReject={() => handleRejectProposal(proposal)}
+              />
+            ))}
+          </div>
+        )}
+ 
+        {/* History */}
+        <div className="space-y-3">
+          <h3 className="flex items-center gap-2 text-sm font-medium text-gray-500 dark:text-gray-400">
+            <History className="w-4 h-4" />
+            反思历史
+          </h3>
+ 
+          {history.length === 0 ? (
+            <div className="flex flex-col items-center justify-center py-8 text-gray-500 dark:text-gray-400">
+              <Brain className="w-8 h-8 mb-2 opacity-50" />
+              <p className="text-sm">暂无反思记录</p>
+              <button
+                onClick={handleReflect}
+                className="mt-2 text-purple-500 hover:text-purple-600 text-sm"
+              >
+                触发第一次反思
+              </button>
+            </div>
+          ) : (
+            history.map((result) => (
+              <ReflectionEntry
+                key={result.timestamp}
+                result={result}
+                isExpanded={expandedId === result.timestamp}
+                onToggle={() => setExpandedId((prev) => (prev === result.timestamp ? null : result.timestamp))}
+              />
+            ))
+          )}
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default ReflectionLog;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/RightPanel.tsx.html b/desktop/coverage/src/components/RightPanel.tsx.html new file mode 100644 index 0000000..7a9bcbb --- /dev/null +++ b/desktop/coverage/src/components/RightPanel.tsx.html @@ -0,0 +1,2482 @@ + + + + + + Code coverage report for src/components/RightPanel.tsx + + + + + + + + + +
+
+

All files / src/components RightPanel.tsx

+
+ +
+ 0% + Statements + 0/622 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/622 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ReactNode, useEffect, useMemo, useState } from 'react';
+import { motion } from 'framer-motion';
+import { getStoredGatewayUrl } from '../lib/gateway-client';
+import { useConnectionStore } from '../store/connectionStore';
+import { useAgentStore, type PluginStatus } from '../store/agentStore';
+import { useConfigStore } from '../store/configStore';
+import { toChatAgent, useChatStore, type CodeBlock } from '../store/chatStore';
+import {
+  Wifi, WifiOff, Bot, BarChart3, Plug, RefreshCw,
+  MessageSquare, Cpu, FileText, User, Activity, Brain,
+  Shield, Sparkles, GraduationCap, List, Network, Dna
+} from 'lucide-react';
+ 
+// === Helper to extract code blocks from markdown content ===
+function extractCodeBlocksFromContent(content: string): CodeBlock[] {
+  const blocks: CodeBlock[] = [];
+  const regex = /```(\w*)\n([\s\S]*?)```/g;
+  let match;
+ 
+  while ((match = regex.exec(content)) !== null) {
+    const language = match[1] || 'text';
+    const codeContent = match[2].trim();
+ 
+    // Try to extract filename from first line comment
+    let filename: string | undefined;
+    let actualContent = codeContent;
+ 
+    // Check for filename patterns like "# filename.py" or "// filename.js"
+    const firstLine = codeContent.split('\n')[0];
+    const filenameMatch = firstLine.match(/^(?:#|\/\/|\/\*|<!--)\s*([^\s]+\.\w+)/);
+    if (filenameMatch) {
+      filename = filenameMatch[1];
+      actualContent = codeContent.split('\n').slice(1).join('\n').trim();
+    }
+ 
+    blocks.push({
+      language,
+      filename,
+      content: actualContent,
+    });
+  }
+ 
+  return blocks;
+}
+ 
+// === Tab Button Component ===
+function TabButton({
+  active,
+  onClick,
+  icon,
+  label,
+}: {
+  active: boolean;
+  onClick: () => void;
+  icon: ReactNode;
+  label: string;
+}) {
+  return (
+    <button
+      onClick={onClick}
+      className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-medium transition-colors ${
+        active
+          ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300'
+          : 'text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-gray-700 dark:hover:text-gray-300'
+      }`}
+    >
+      {icon}
+      <span>{label}</span>
+    </button>
+  );
+}
+import { MemoryPanel } from './MemoryPanel';
+import { MemoryGraph } from './MemoryGraph';
+import { ReflectionLog } from './ReflectionLog';
+import { AutonomyConfig } from './AutonomyConfig';
+import { ActiveLearningPanel } from './ActiveLearningPanel';
+import { IdentityChangeProposalPanel } from './IdentityChangeProposal';
+import { CodeSnippetPanel, type CodeSnippet } from './CodeSnippetPanel';
+import { cardHover, defaultTransition } from '../lib/animations';
+import { Button, Badge } from './ui';
+import { getPersonalityById } from '../lib/personality-presets';
+import { silentErrorHandler } from '../lib/error-utils';
+ 
+export function RightPanel() {
+  // Connection store
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const gatewayVersion = useConnectionStore((s) => s.gatewayVersion);
+  const error = useConnectionStore((s) => s.error);
+  const connect = useConnectionStore((s) => s.connect);
+ 
+  // Agent store
+  const clones = useAgentStore((s) => s.clones);
+  const usageStats = useAgentStore((s) => s.usageStats);
+  const pluginStatus = useAgentStore((s) => s.pluginStatus);
+  const loadClones = useAgentStore((s) => s.loadClones);
+  const loadUsageStats = useAgentStore((s) => s.loadUsageStats);
+  const loadPluginStatus = useAgentStore((s) => s.loadPluginStatus);
+  const updateClone = useAgentStore((s) => s.updateClone);
+ 
+  // Config store
+  const workspaceInfo = useConfigStore((s) => s.workspaceInfo);
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+ 
+  const { messages, currentModel, currentAgent, setCurrentAgent } = useChatStore();
+  const [activeTab, setActiveTab] = useState<'status' | 'files' | 'agent' | 'memory' | 'reflection' | 'autonomy' | 'learning' | 'evolution'>('status');
+  const [memoryViewMode, setMemoryViewMode] = useState<'list' | 'graph'>('list');
+  const [isEditingAgent, setIsEditingAgent] = useState(false);
+  const [agentDraft, setAgentDraft] = useState<AgentDraft | null>(null);
+ 
+  const connected = connectionState === 'connected';
+  const selectedClone = useMemo(
+    () => clones.find((clone) => clone.id === currentAgent?.id),
+    [clones, currentAgent?.id]
+  );
+  const focusAreas = selectedClone?.scenarios?.length ? selectedClone.scenarios : ['coding', 'writing', 'research', 'product', 'data'];
+  const bootstrapFiles = selectedClone?.bootstrapFiles || [];
+  const gatewayUrl = quickConfig.gatewayUrl || getStoredGatewayUrl();
+ 
+  useEffect(() => {
+    if (!selectedClone || isEditingAgent) return;
+    setAgentDraft(createAgentDraft(selectedClone, currentModel));
+  }, [selectedClone, currentModel, isEditingAgent]);
+ 
+  // Load data when connected
+  useEffect(() => {
+    if (connected) {
+      loadClones();
+      loadUsageStats();
+      loadPluginStatus();
+    }
+  }, [connected]);
+ 
+  const handleReconnect = () => {
+    connect().catch(silentErrorHandler('RightPanel'));
+  };
+ 
+  const handleStartEdit = () => {
+    if (!selectedClone) return;
+    setAgentDraft(createAgentDraft(selectedClone, currentModel));
+    setIsEditingAgent(true);
+  };
+ 
+  const handleCancelEdit = () => {
+    if (selectedClone) {
+      setAgentDraft(createAgentDraft(selectedClone, currentModel));
+    }
+    setIsEditingAgent(false);
+  };
+ 
+  const handleSaveAgent = async () => {
+    if (!selectedClone || !agentDraft || !agentDraft.name.trim()) return;
+    const updatedClone = await updateClone(selectedClone.id, {
+      name: agentDraft.name.trim(),
+      role: agentDraft.role.trim() || undefined,
+      nickname: agentDraft.nickname.trim() || undefined,
+      model: agentDraft.model.trim() || undefined,
+      scenarios: agentDraft.scenarios.split(',').map((item) => item.trim()).filter(Boolean),
+      workspaceDir: agentDraft.workspaceDir.trim() || undefined,
+      userName: agentDraft.userName.trim() || undefined,
+      userRole: agentDraft.userRole.trim() || undefined,
+      restrictFiles: agentDraft.restrictFiles,
+      privacyOptIn: agentDraft.privacyOptIn,
+    });
+    if (updatedClone) {
+      setCurrentAgent(toChatAgent(updatedClone));
+      setAgentDraft(createAgentDraft(updatedClone, updatedClone.model || currentModel));
+      setIsEditingAgent(false);
+    }
+  };
+ 
+  const userMsgCount = messages.filter(m => m.role === 'user').length;
+  const assistantMsgCount = messages.filter(m => m.role === 'assistant').length;
+  const toolCallCount = messages.filter(m => m.role === 'tool').length;
+  const runtimeSummary = connected ? '已连接' : connectionState === 'connecting' ? '连接中...' : connectionState === 'reconnecting' ? '重连中...' : '未连接';
+  const userNameDisplay = selectedClone?.userName || quickConfig.userName || 'User';
+  const userAddressing = selectedClone?.nickname || selectedClone?.userName || quickConfig.userName || 'User';
+  const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone || '系统时区';
+ 
+  // Extract code blocks from all messages (both from codeBlocks property and content parsing)
+  const codeSnippets = useMemo((): CodeSnippet[] => {
+    const snippets: CodeSnippet[] = [];
+    let globalIndex = 0;
+ 
+    for (let msgIdx = 0; msgIdx < messages.length; msgIdx++) {
+      const msg = messages[msgIdx];
+ 
+      // First, add any existing codeBlocks from the message
+      if (msg.codeBlocks && msg.codeBlocks.length > 0) {
+        for (const block of msg.codeBlocks) {
+          snippets.push({
+            id: `${msg.id}-codeblock-${globalIndex}`,
+            block,
+            messageIndex: msgIdx,
+          });
+          globalIndex++;
+        }
+      }
+ 
+      // Then, extract code blocks from the message content
+      if (msg.content) {
+        const extractedBlocks = extractCodeBlocksFromContent(msg.content);
+        for (const block of extractedBlocks) {
+          snippets.push({
+            id: `${msg.id}-extracted-${globalIndex}`,
+            block,
+            messageIndex: msgIdx,
+          });
+          globalIndex++;
+        }
+      }
+    }
+ 
+    return snippets;
+  }, [messages]);
+ 
+  return (
+    <aside className="w-full bg-white dark:bg-gray-900 flex flex-col">
+      {/* 顶部工具栏 - Tab 栏 */}
+      <div className="border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+        {/* 主 Tab 行 */}
+        <div className="flex items-center px-2 pt-2 gap-1">
+          <TabButton
+            active={activeTab === 'status'}
+            onClick={() => setActiveTab('status')}
+            icon={<Activity className="w-4 h-4" />}
+            label="状态"
+          />
+          <TabButton
+            active={activeTab === 'agent'}
+            onClick={() => setActiveTab('agent')}
+            icon={<User className="w-4 h-4" />}
+            label="Agent"
+          />
+          <TabButton
+            active={activeTab === 'files'}
+            onClick={() => setActiveTab('files')}
+            icon={<FileText className="w-4 h-4" />}
+            label="文件"
+          />
+          <TabButton
+            active={activeTab === 'memory'}
+            onClick={() => setActiveTab('memory')}
+            icon={<Brain className="w-4 h-4" />}
+            label="记忆"
+          />
+        </div>
+        {/* 第二行 Tab */}
+        <div className="flex items-center px-2 pb-2 gap-1">
+          <TabButton
+            active={activeTab === 'reflection'}
+            onClick={() => setActiveTab('reflection')}
+            icon={<Sparkles className="w-4 h-4" />}
+            label="反思"
+          />
+          <TabButton
+            active={activeTab === 'autonomy'}
+            onClick={() => setActiveTab('autonomy')}
+            icon={<Shield className="w-4 h-4" />}
+            label="自主"
+          />
+          <TabButton
+            active={activeTab === 'learning'}
+            onClick={() => setActiveTab('learning')}
+            icon={<GraduationCap className="w-4 h-4" />}
+            label="学习"
+          />
+          <TabButton
+            active={activeTab === 'evolution'}
+            onClick={() => setActiveTab('evolution')}
+            icon={<Dna className="w-4 h-4" />}
+            label="演化"
+          />
+        </div>
+      </div>
+ 
+      {/* 消息统计 */}
+      <div className="px-4 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between text-xs">
+        <div className="flex items-center gap-2 text-gray-500 dark:text-gray-400">
+          <BarChart3 className="w-3.5 h-3.5" />
+          <span>{messages.length} 条消息</span>
+          <span className="text-gray-300 dark:text-gray-600">|</span>
+          <span>{userMsgCount} 用户 / {assistantMsgCount} 助手</span>
+        </div>
+        <div className={`flex items-center gap-1 ${connected ? 'text-emerald-500' : 'text-gray-400'}`}>
+          {connected ? <Wifi className="w-3.5 h-3.5" /> : <WifiOff className="w-3.5 h-3.5" />}
+          <span>{runtimeSummary}</span>
+        </div>
+      </div>
+ 
+      <div className="flex-1 overflow-y-auto custom-scrollbar p-4 space-y-4">
+        {activeTab === 'memory' ? (
+          <div className="space-y-3">
+            {/* 视图切换 */}
+            <div className="flex items-center gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg">
+              <button
+                onClick={() => setMemoryViewMode('list')}
+                className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-medium transition-colors ${
+                  memoryViewMode === 'list'
+                    ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 shadow-sm'
+                    : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'
+                }`}
+              >
+                <List className="w-3.5 h-3.5" />
+                列表
+              </button>
+              <button
+                onClick={() => setMemoryViewMode('graph')}
+                className={`flex items-center gap-1.5 px-3 py-1.5 rounded-md text-xs font-medium transition-colors ${
+                  memoryViewMode === 'graph'
+                    ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 shadow-sm'
+                    : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'
+                }`}
+              >
+                <Network className="w-3.5 h-3.5" />
+                图谱
+              </button>
+            </div>
+ 
+            {/* 内容区域 */}
+            {memoryViewMode === 'list' ? (
+              <MemoryPanel />
+            ) : (
+              <div className="h-[400px] rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700">
+                <MemoryGraph />
+              </div>
+            )}
+          </div>
+        ) : activeTab === 'reflection' ? (
+          <ReflectionLog />
+        ) : activeTab === 'autonomy' ? (
+          <AutonomyConfig />
+        ) : activeTab === 'learning' ? (
+          <ActiveLearningPanel />
+        ) : activeTab === 'evolution' ? (
+          <IdentityChangeProposalPanel />
+        ) : activeTab === 'agent' ? (
+          <div className="space-y-4">
+            <motion.div
+              whileHover={cardHover}
+              transition={defaultTransition}
+              className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4 shadow-sm"
+            >
+              <div className="flex items-start justify-between gap-3">
+                <div className="flex items-center gap-3">
+                  <div className="w-12 h-12 rounded-full bg-gradient-to-br from-orange-400 to-red-500 flex items-center justify-center text-white text-lg font-semibold">
+                    {selectedClone?.emoji ? (
+                      <span className="text-2xl">{selectedClone.emoji}</span>
+                    ) : (
+                      <span>🦞</span>
+                    )}
+                  </div>
+                  <div>
+                    <div className="text-base font-semibold text-gray-900 dark:text-gray-100 flex items-center gap-2">
+                      {selectedClone?.name || currentAgent?.name || '全能助手'}
+                      {selectedClone?.personality ? (
+                        <Badge variant="default" className="text-xs ml-1">
+                          {getPersonalityById(selectedClone.personality)?.label || selectedClone.personality}
+                        </Badge>
+                      ) : (
+                        <Badge variant="default" className="text-xs ml-1">
+                          友好亲切
+                        </Badge>
+                      )}
+                    </div>
+                    <div className="text-sm text-gray-500 dark:text-gray-400">{selectedClone?.role || '全能型 AI 助手'}</div>
+                  </div>
+                </div>
+                {selectedClone ? (
+                  isEditingAgent ? (
+                    <div className="flex gap-2">
+                      <Button
+                        variant="outline"
+                        size="sm"
+                        onClick={handleCancelEdit}
+                        aria-label="Cancel edit"
+                      >
+                        Cancel
+                      </Button>
+                      <Button
+                        variant="primary"
+                        size="sm"
+                        onClick={() => { handleSaveAgent().catch(silentErrorHandler('RightPanel')); }}
+                        aria-label="Save edit"
+                      >
+                        Save
+                      </Button>
+                    </div>
+                  ) : (
+                    <Button
+                      variant="outline"
+                      size="sm"
+                      onClick={handleStartEdit}
+                      aria-label="Edit Agent"
+                    >
+                      Edit
+                    </Button>
+                  )
+                ) : null}
+              </div>
+            </motion.div>
+ 
+            <motion.div
+              whileHover={cardHover}
+              transition={defaultTransition}
+              className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4 shadow-sm"
+            >
+              <div className="text-sm font-semibold text-gray-900 dark:text-gray-100 mb-3">About Me</div>
+              {isEditingAgent && agentDraft ? (
+                <div className="space-y-2">
+                  <AgentInput label="Name" value={agentDraft.name} onChange={(value) => setAgentDraft({ ...agentDraft, name: value })} />
+                  <AgentInput label="Role" value={agentDraft.role} onChange={(value) => setAgentDraft({ ...agentDraft, role: value })} />
+                  <AgentInput label="Nickname" value={agentDraft.nickname} onChange={(value) => setAgentDraft({ ...agentDraft, nickname: value })} />
+                  <AgentInput label="Model" value={agentDraft.model} onChange={(value) => setAgentDraft({ ...agentDraft, model: value })} />
+                </div>
+              ) : (
+                <div className="space-y-3 text-sm">
+                  <AgentRow label="Role" value={selectedClone?.role || '全能型 AI 助手'} />
+                  <AgentRow label="Nickname" value={selectedClone?.nickname || '小龙'} />
+                  <AgentRow label="Model" value={selectedClone?.model || currentModel} />
+                  <AgentRow label="Emoji" value={selectedClone?.emoji || '🦞'} />
+                </div>
+              )}
+            </motion.div>
+ 
+            <motion.div
+              whileHover={cardHover}
+              transition={defaultTransition}
+              className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4 shadow-sm"
+            >
+              <div className="text-sm font-semibold text-gray-900 dark:text-gray-100 mb-3">You in My Eyes</div>
+              {isEditingAgent && agentDraft ? (
+                <div className="space-y-2">
+                  <AgentInput label="Name" value={agentDraft.userName} onChange={(value) => setAgentDraft({ ...agentDraft, userName: value })} />
+                  <AgentInput label="Role" value={agentDraft.userRole} onChange={(value) => setAgentDraft({ ...agentDraft, userRole: value })} />
+                  <AgentInput label="Scenarios" value={agentDraft.scenarios} onChange={(value) => setAgentDraft({ ...agentDraft, scenarios: value })} placeholder="coding, research" />
+                  <AgentInput label="Workspace" value={agentDraft.workspaceDir} onChange={(value) => setAgentDraft({ ...agentDraft, workspaceDir: value })} />
+                  <AgentToggle label="File Restriction" checked={agentDraft.restrictFiles} onChange={(value) => setAgentDraft({ ...agentDraft, restrictFiles: value })} />
+                  <AgentToggle label="Opt-in Program" checked={agentDraft.privacyOptIn} onChange={(value) => setAgentDraft({ ...agentDraft, privacyOptIn: value })} />
+                </div>
+              ) : (
+                <div className="space-y-3 text-sm">
+                  <AgentRow label="Name" value={userNameDisplay} />
+                  <AgentRow label="Addressing" value={userAddressing} />
+                  <AgentRow label="Timezone" value={localTimezone} />
+                  <div className="flex gap-4">
+                    <div className="w-16 text-gray-500 dark:text-gray-400">Focus</div>
+                    <div className="flex-1 flex flex-wrap gap-2">
+                      {focusAreas.map((item) => (
+                        <Badge key={item} variant="default">{item}</Badge>
+                      ))}
+                    </div>
+                  </div>
+                  <AgentRow label="Workspace" value={selectedClone?.workspaceDir || workspaceInfo?.path || '~/.openfang/zclaw-workspace'} />
+                  <AgentRow label="Resolved" value={selectedClone?.workspaceResolvedPath || workspaceInfo?.resolvedPath || '-'} />
+                  <AgentRow label="File Restriction" value={selectedClone?.restrictFiles ? 'Enabled' : 'Disabled'} />
+                  <AgentRow label="Opt-in" value={selectedClone?.privacyOptIn ? 'Joined' : 'Not joined'} />
+                </div>
+              )}
+            </motion.div>
+ 
+            <motion.div
+              whileHover={cardHover}
+              transition={defaultTransition}
+              className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4 shadow-sm"
+            >
+              <div className="flex items-center justify-between mb-3">
+                <div className="text-sm font-semibold text-gray-900 dark:text-gray-100">Bootstrap Files</div>
+                <Badge variant={selectedClone?.bootstrapReady ? 'success' : 'default'}>
+                  {selectedClone?.bootstrapReady ? 'Generated' : 'Not generated'}
+                </Badge>
+              </div>
+              <div className="space-y-2 text-sm">
+                {bootstrapFiles.length > 0 ? bootstrapFiles.map((file) => (
+                  <div key={file.name} className="rounded-lg border border-gray-100 dark:border-gray-700 bg-gray-50 dark:bg-gray-700/50 px-3 py-2">
+                    <div className="flex items-center justify-between gap-3">
+                      <span className="font-medium text-gray-800 dark:text-gray-200">{file.name}</span>
+                      <Badge variant={file.exists ? 'success' : 'error'}>
+                        {file.exists ? 'Exists' : 'Missing'}
+                      </Badge>
+                    </div>
+                    <div className="mt-1 text-xs text-gray-500 dark:text-gray-400 break-all">{file.path}</div>
+                  </div>
+                )) : (
+                  <p className="text-sm text-gray-500 dark:text-gray-400">No bootstrap files generated for this Agent.</p>
+                )}
+              </div>
+            </motion.div>
+          </div>
+        ) : activeTab === 'files' ? (
+          <div className="p-4">
+            <CodeSnippetPanel snippets={codeSnippets} />
+          </div>
+        ) : (
+          <>
+        {/* Gateway 连接状态 */}
+        <motion.div
+          whileHover={cardHover}
+          transition={defaultTransition}
+          className={`rounded-lg border p-3 ${connected ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800' : 'bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700'}`}
+        >
+          <div className="flex items-center justify-between mb-2">
+            <div className="flex items-center gap-2">
+              {connected ? (
+                <Wifi className="w-4 h-4 text-green-600 dark:text-green-400" />
+              ) : (
+                <WifiOff className="w-4 h-4 text-gray-500 dark:text-gray-400" />
+              )}
+              <Badge variant={connected ? 'success' : 'default'}>
+                Gateway {connected ? 'Connected' : connectionState === 'connecting' ? 'Connecting...' : connectionState === 'reconnecting' ? 'Reconnecting...' : 'Disconnected'}
+              </Badge>
+            </div>
+            {connected && (
+              <Button
+                variant="ghost"
+                size="sm"
+                onClick={() => { loadUsageStats(); loadPluginStatus(); loadClones(); }}
+                className="p-1 text-gray-500 hover:text-orange-500"
+                title="Refresh data"
+                aria-label="Refresh data"
+              >
+                <RefreshCw className="w-3.5 h-3.5" />
+              </Button>
+            )}
+          </div>
+          <div className="space-y-1 text-xs">
+            <div className="flex justify-between">
+              <span className="text-gray-500">地址</span>
+              <span className="text-gray-700 font-mono">{gatewayUrl}</span>
+            </div>
+            {gatewayVersion && (
+              <div className="flex justify-between">
+                <span className="text-gray-500">版本</span>
+                <span className="text-gray-700">{gatewayVersion}</span>
+              </div>
+            )}
+            <div className="flex justify-between">
+              <span className="text-gray-500">当前模型</span>
+              <span className="text-orange-600 font-medium">{currentModel}</span>
+            </div>
+          </div>
+          {!connected && connectionState !== 'connecting' && (
+            <div className="mt-2">
+              <Button
+                variant="primary"
+                size="sm"
+                onClick={handleReconnect}
+                className="w-full"
+              >
+                Connect Gateway
+              </Button>
+            </div>
+          )}
+          {error && (
+            <p className="mt-2 text-xs text-red-500 truncate" title={error}>{error}</p>
+          )}
+        </motion.div>
+ 
+        {/* 当前会话 */}
+        <motion.div
+          whileHover={cardHover}
+          transition={defaultTransition}
+          className="bg-gray-50 rounded-lg border border-gray-100 p-3"
+        >
+          <h3 className="text-xs font-semibold text-gray-700 mb-2 flex items-center gap-1.5">
+            <MessageSquare className="w-3.5 h-3.5" />
+            当前会话
+          </h3>
+          <div className="space-y-1.5 text-xs">
+            <div className="flex justify-between">
+              <span className="text-gray-500">用户消息</span>
+              <span className="font-medium text-gray-900">{userMsgCount}</span>
+            </div>
+            <div className="flex justify-between">
+              <span className="text-gray-500">助手回复</span>
+              <span className="font-medium text-gray-900">{assistantMsgCount}</span>
+            </div>
+            <div className="flex justify-between">
+              <span className="text-gray-500">工具调用</span>
+              <span className="font-medium text-gray-900">{toolCallCount}</span>
+            </div>
+            <div className="flex justify-between">
+              <span className="text-gray-500">总消息数</span>
+              <span className="font-medium text-orange-600">{messages.length}</span>
+            </div>
+          </div>
+        </motion.div>
+ 
+        {/* 分身 */}
+        <motion.div
+          whileHover={cardHover}
+          transition={defaultTransition}
+          className="bg-gray-50 rounded-lg border border-gray-100 p-3"
+        >
+          <h3 className="text-xs font-semibold text-gray-700 mb-2 flex items-center gap-1.5">
+            <Bot className="w-3.5 h-3.5" />
+            分身状态
+          </h3>
+          {clones.length > 0 ? (
+            <div className="space-y-1.5">
+              {clones.slice(0, 5).map(c => (
+                <div key={c.id} className="flex items-center gap-2 text-xs">
+                  <div className="w-5 h-5 bg-gradient-to-br from-orange-400 to-red-500 rounded-md flex items-center justify-center text-white text-[10px]">
+                    <Bot className="w-3 h-3" />
+                  </div>
+                  <span className="text-gray-700 truncate">{c.name}</span>
+                </div>
+              ))}
+              {clones.length > 5 && (
+                <p className="text-xs text-gray-500">+{clones.length - 5} 个分身</p>
+              )}
+            </div>
+          ) : (
+            <p className="text-xs text-gray-500">
+              {connected ? '暂无分身,在左侧栏创建' : '连接后可用'}
+            </p>
+          )}
+        </motion.div>
+ 
+        {/* 用量统计 */}
+        {usageStats && (
+          <motion.div
+            whileHover={cardHover}
+            transition={defaultTransition}
+            className="bg-gray-50 rounded-lg border border-gray-100 p-3"
+          >
+            <h3 className="text-xs font-semibold text-gray-700 mb-2 flex items-center gap-1.5">
+              <BarChart3 className="w-3.5 h-3.5" />
+              用量统计
+            </h3>
+            <div className="space-y-1.5 text-xs">
+              <div className="flex justify-between">
+                <span className="text-gray-500">总会话数</span>
+                <span className="font-medium text-gray-900">{usageStats.totalSessions}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-gray-500">总消息数</span>
+                <span className="font-medium text-gray-900">{usageStats.totalMessages}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-gray-500">总 Token</span>
+                <span className="font-medium text-gray-900">{usageStats.totalTokens.toLocaleString()}</span>
+              </div>
+            </div>
+          </motion.div>
+        )}
+ 
+        {/* 插件状态 */}
+        {pluginStatus.length > 0 && (
+          <motion.div
+            whileHover={cardHover}
+            transition={defaultTransition}
+            className="bg-gray-50 rounded-lg border border-gray-100 p-3"
+          >
+            <h3 className="text-xs font-semibold text-gray-700 mb-2 flex items-center gap-1.5">
+              <Plug className="w-3.5 h-3.5" />
+              插件 ({pluginStatus.length})
+            </h3>
+            <div className="space-y-1 text-xs">
+              {pluginStatus.map((p: PluginStatus, i: number) => (
+                <div key={i} className="flex justify-between">
+                  <span className="text-gray-600 truncate">{p.name || p.id}</span>
+                  <span className={p.status === 'active' ? 'text-green-600' : 'text-gray-500'}>
+                    {p.status === 'active' ? '运行中' : '已停止'}
+                  </span>
+                </div>
+              ))}
+            </div>
+          </motion.div>
+        )}
+ 
+        {/* 系统信息 */}
+        <motion.div
+          whileHover={cardHover}
+          transition={defaultTransition}
+          className="bg-gray-50 rounded-lg border border-gray-100 p-3"
+        >
+          <h3 className="text-xs font-semibold text-gray-700 mb-2 flex items-center gap-1.5">
+            <Cpu className="w-3.5 h-3.5" />
+            运行概览
+          </h3>
+          <div className="space-y-1.5 text-xs">
+            <div className="flex justify-between">
+              <span className="text-gray-500">连接状态</span>
+              <span className="text-gray-700">{runtimeSummary}</span>
+            </div>
+            <div className="flex justify-between">
+              <span className="text-gray-500">Gateway 版本</span>
+              <span className="text-gray-700">{gatewayVersion || '-'}</span>
+            </div>
+            <div className="flex justify-between">
+              <span className="text-gray-500">已加载分身</span>
+              <span className="text-gray-700">{clones.length}</span>
+            </div>
+            <div className="flex justify-between">
+              <span className="text-gray-500">已加载插件</span>
+              <span className="text-gray-700">{pluginStatus.length}</span>
+            </div>
+          </div>
+        </motion.div>
+          </>
+        )}
+      </div>
+ 
+    </aside>
+  );
+}
+ 
+function AgentRow({ label, value }: { label: string; value: string }) {
+  return (
+    <div className="flex gap-4">
+      <div className="w-16 text-gray-500">{label}</div>
+      <div className="flex-1 text-gray-700 break-all">{value}</div>
+    </div>
+  );
+}
+ 
+type AgentDraft = {
+  name: string;
+  role: string;
+  nickname: string;
+  model: string;
+  scenarios: string;
+  workspaceDir: string;
+  userName: string;
+  userRole: string;
+  restrictFiles: boolean;
+  privacyOptIn: boolean;
+};
+ 
+function createAgentDraft(
+  clone: {
+    name: string;
+    role?: string;
+    nickname?: string;
+    model?: string;
+    scenarios?: string[];
+    workspaceDir?: string;
+    userName?: string;
+    userRole?: string;
+    restrictFiles?: boolean;
+    privacyOptIn?: boolean;
+  },
+  currentModel: string
+): AgentDraft {
+  return {
+    name: clone.name || '',
+    role: clone.role || '',
+    nickname: clone.nickname || '',
+    model: clone.model || currentModel,
+    scenarios: clone.scenarios?.join(', ') || '',
+    workspaceDir: clone.workspaceDir || '~/.openfang/zclaw-workspace',
+    userName: clone.userName || '',
+    userRole: clone.userRole || '',
+    restrictFiles: clone.restrictFiles ?? true,
+    privacyOptIn: clone.privacyOptIn ?? false,
+  };
+}
+ 
+function AgentInput({
+  label,
+  value,
+  onChange,
+  placeholder,
+}: {
+  label: string;
+  value: string;
+  onChange: (value: string) => void;
+  placeholder?: string;
+}) {
+  return (
+    <label className="block">
+      <div className="text-xs text-gray-500 mb-1">{label}</div>
+      <input
+        type="text"
+        value={value}
+        onChange={(e) => onChange(e.target.value)}
+        placeholder={placeholder}
+        className="w-full text-sm border border-gray-200 rounded-lg px-3 py-2 focus:outline-none"
+      />
+    </label>
+  );
+}
+ 
+function AgentToggle({
+  label,
+  checked,
+  onChange,
+}: {
+  label: string;
+  checked: boolean;
+  onChange: (value: boolean) => void;
+}) {
+  return (
+    <label className="flex items-center justify-between text-sm text-gray-700 border border-gray-100 rounded-lg px-3 py-2">
+      <span>{label}</span>
+      <input type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked)} />
+    </label>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ScenarioTags.tsx.html b/desktop/coverage/src/components/ScenarioTags.tsx.html new file mode 100644 index 0000000..e56170e --- /dev/null +++ b/desktop/coverage/src/components/ScenarioTags.tsx.html @@ -0,0 +1,610 @@ + + + + + + Code coverage report for src/components/ScenarioTags.tsx + + + + + + + + + +
+
+

All files / src/components ScenarioTags.tsx

+
+ +
+ 0% + Statements + 0/114 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/114 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ScenarioTags - Scenario selection component for Agent onboarding
+ *
+ * Displays scenario options as clickable tags for multi-selection.
+ */
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Code,
+  PenLine,
+  Package,
+  BarChart,
+  Palette,
+  Server,
+  Search,
+  Megaphone,
+  MoreHorizontal,
+  Check,
+} from 'lucide-react';
+import { cn } from '../lib/utils';
+import { SCENARIO_TAGS } from '../lib/personality-presets';
+ 
+export interface ScenarioTagsProps {
+  value: string[];
+  onChange: (scenarios: string[]) => void;
+  className?: string;
+  maxSelections?: number;
+}
+ 
+// Map icon names to components
+const iconMap: Record<string, React.ComponentType<{ className?: string }>> = {
+  Code,
+  PenLine,
+  Package,
+  BarChart,
+  Palette,
+  Server,
+  Search,
+  Megaphone,
+  MoreHorizontal,
+};
+ 
+export function ScenarioTags({
+  value,
+  onChange,
+  className,
+  maxSelections = 5,
+}: ScenarioTagsProps) {
+  const toggleScenario = (scenarioId: string) => {
+    if (value.includes(scenarioId)) {
+      // Remove scenario
+      onChange(value.filter((id) => id !== scenarioId));
+    } else {
+      // Add scenario (if under max)
+      if (value.length < maxSelections) {
+        onChange([...value, scenarioId]);
+      }
+    }
+  };
+ 
+  return (
+    <div className={cn('space-y-3', className)}>
+      {/* Tags Grid */}
+      <div className="flex flex-wrap gap-2">
+        <AnimatePresence mode="popLayout">
+          {SCENARIO_TAGS.map((tag) => {
+            const IconComponent = iconMap[tag.icon] || Code;
+            const isSelected = value.includes(tag.id);
+            const isDisabled = !isSelected && value.length >= maxSelections;
+ 
+            return (
+              <motion.button
+                key={tag.id}
+                type="button"
+                layout
+                initial={{ opacity: 0, scale: 0.9 }}
+                animate={{ opacity: 1, scale: 1 }}
+                exit={{ opacity: 0, scale: 0.9 }}
+                transition={{ duration: 0.15 }}
+                onClick={() => toggleScenario(tag.id)}
+                disabled={isDisabled}
+                className={cn(
+                  'inline-flex items-center gap-1.5 px-3 py-2 rounded-lg text-sm font-medium transition-all',
+                  'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-1',
+                  isSelected && 'bg-primary text-white shadow-sm',
+                  !isSelected &&
+                    !isDisabled &&
+                    'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700',
+                  isDisabled && 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-800'
+                )}
+              >
+                {isSelected ? (
+                  <Check className="w-4 h-4" />
+                ) : (
+                  <IconComponent className="w-4 h-4" />
+                )}
+                <span>{tag.label}</span>
+              </motion.button>
+            );
+          })}
+        </AnimatePresence>
+      </div>
+ 
+      {/* Selection Info */}
+      <div className="flex items-center justify-between text-xs text-gray-500 dark:text-gray-400">
+        <span>
+          已选择 {value.length}/{maxSelections} 个场景
+        </span>
+        {value.length > 0 && (
+          <button
+            type="button"
+            onClick={() => onChange([])}
+            className="text-primary hover:underline"
+          >
+            清空选择
+          </button>
+        )}
+      </div>
+ 
+      {/* Selected Scenarios Preview */}
+      {value.length > 0 && (
+        <motion.div
+          initial={{ opacity: 0, y: 5 }}
+          animate={{ opacity: 1, y: 0 }}
+          className="p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg"
+        >
+          <p className="text-xs text-gray-500 dark:text-gray-400 mb-2">将专注于:</p>
+          <div className="flex flex-wrap gap-1">
+            {value.map((id) => {
+              const tag = SCENARIO_TAGS.find((t) => t.id === id);
+              if (!tag) return null;
+              return (
+                <span
+                  key={id}
+                  className="inline-flex items-center gap-1 px-2 py-0.5 bg-primary/10 text-primary rounded text-xs"
+                >
+                  {tag.label}
+                </span>
+              );
+            })}
+          </div>
+        </motion.div>
+      )}
+    </div>
+  );
+}
+ 
+// Export a display-only version for showing selected scenarios
+export interface ScenarioBadgesProps {
+  scenarios?: string[];
+  className?: string;
+}
+ 
+export function ScenarioBadges({ scenarios, className }: ScenarioBadgesProps) {
+  if (!scenarios || scenarios.length === 0) return null;
+ 
+  return (
+    <div className={cn('flex flex-wrap gap-1', className)}>
+      {scenarios.map((id) => {
+        const tag = SCENARIO_TAGS.find((t) => t.id === id);
+        if (!tag) return null;
+        const IconComponent = iconMap[tag.icon] || Code;
+ 
+        return (
+          <span
+            key={id}
+            className="inline-flex items-center gap-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 rounded text-xs"
+          >
+            <IconComponent className="w-3 h-3" />
+            {tag.label}
+          </span>
+        );
+      })}
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SchedulerPanel.tsx.html b/desktop/coverage/src/components/SchedulerPanel.tsx.html new file mode 100644 index 0000000..d3ed2ea --- /dev/null +++ b/desktop/coverage/src/components/SchedulerPanel.tsx.html @@ -0,0 +1,3043 @@ + + + + + + Code coverage report for src/components/SchedulerPanel.tsx + + + + + + + + + +
+
+

All files / src/components SchedulerPanel.tsx

+
+ +
+ 0% + Statements + 0/743 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/743 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * SchedulerPanel - OpenFang Scheduler UI
+ *
+ * Displays scheduled jobs, event triggers, workflows, and run history.
+ *
+ * Design based on OpenFang Dashboard v0.4.0
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore } from '../store/handStore';
+import { useWorkflowStore, type Workflow } from '../store/workflowStore';
+import { useAgentStore } from '../store/agentStore';
+import { useConfigStore } from '../store/configStore';
+import { WorkflowEditor } from './WorkflowEditor';
+import { WorkflowHistory } from './WorkflowHistory';
+import { TriggersPanel } from './TriggersPanel';
+import {
+  Clock,
+  Zap,
+  History,
+  Plus,
+  RefreshCw,
+  Loader2,
+  Calendar,
+  X,
+  AlertCircle,
+  CheckCircle,
+  GitBranch,
+  Play,
+} from 'lucide-react';
+ 
+// === Tab Types ===
+ 
+type TabType = 'scheduled' | 'triggers' | 'workflows' | 'history';
+ 
+// === Schedule Type ===
+ 
+type ScheduleType = 'cron' | 'interval' | 'once';
+type TargetType = 'agent' | 'hand' | 'workflow';
+ 
+// === Form State Interface ===
+ 
+interface JobFormData {
+  name: string;
+  scheduleType: ScheduleType;
+  cronExpression: string;
+  intervalValue: number;
+  intervalUnit: 'minutes' | 'hours' | 'days';
+  runOnceDate: string;
+  runOnceTime: string;
+  targetType: TargetType;
+  targetId: string;
+  description: string;
+  enabled: boolean;
+}
+ 
+const initialFormData: JobFormData = {
+  name: '',
+  scheduleType: 'cron',
+  cronExpression: '',
+  intervalValue: 30,
+  intervalUnit: 'minutes',
+  runOnceDate: '',
+  runOnceTime: '',
+  targetType: 'hand',
+  targetId: '',
+  description: '',
+  enabled: true,
+};
+ 
+// === Tab Button Component ===
+ 
+function TabButton({
+  active,
+  onClick,
+  icon: Icon,
+  label,
+}: {
+  active: boolean;
+  onClick: () => void;
+  icon: React.ComponentType<{ className?: string }>;
+  label: string;
+}) {
+  return (
+    <button
+      onClick={onClick}
+      className={`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${
+        active
+          ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
+          : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white'
+      }`}
+    >
+      <Icon className="w-3.5 h-3.5" />
+      {label}
+    </button>
+  );
+}
+ 
+// === Empty State Component ===
+ 
+function EmptyState({
+  icon: Icon,
+  title,
+  description,
+  actionLabel,
+  onAction,
+}: {
+  icon: React.ComponentType<{ className?: string }>;
+  title: string;
+  description: string;
+  actionLabel?: string;
+  onAction?: () => void;
+}) {
+  return (
+    <div className="text-center py-8">
+      <div className="w-12 h-12 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center mx-auto mb-3">
+        <Icon className="w-6 h-6 text-gray-400" />
+      </div>
+      <p className="text-sm text-gray-500 dark:text-gray-400 mb-2">{title}</p>
+      <p className="text-xs text-gray-400 dark:text-gray-500 mb-4 max-w-sm mx-auto">
+        {description}
+      </p>
+      {actionLabel && onAction && (
+        <button
+          onClick={onAction}
+          className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
+        >
+          <Plus className="w-4 h-4" />
+          {actionLabel}
+        </button>
+      )}
+    </div>
+  );
+}
+ 
+// === Create Job Modal Component ===
+ 
+interface CreateJobModalProps {
+  isOpen: boolean;
+  onClose: () => void;
+  onSuccess: () => void;
+}
+ 
+function CreateJobModal({ isOpen, onClose, onSuccess }: CreateJobModalProps) {
+  // Store state - use domain stores
+  const hands = useHandStore((s) => s.hands);
+  const workflows = useWorkflowStore((s) => s.workflows);
+  const clones = useAgentStore((s) => s.clones);
+  const createScheduledTask = useConfigStore((s) => s.createScheduledTask);
+  const loadHands = useHandStore((s) => s.loadHands);
+  const loadWorkflows = useWorkflowStore((s) => s.loadWorkflows);
+  const loadClones = useAgentStore((s) => s.loadClones);
+  const [formData, setFormData] = useState<JobFormData>(initialFormData);
+  const [errors, setErrors] = useState<Record<string, string>>({});
+  const [isSubmitting, setIsSubmitting] = useState(false);
+  const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');
+  const [errorMessage, setErrorMessage] = useState('');
+ 
+  // Load available targets on mount
+  useEffect(() => {
+    if (isOpen) {
+      loadHands();
+      loadWorkflows();
+      loadClones();
+    }
+  }, [isOpen, loadHands, loadWorkflows, loadClones]);
+ 
+  // Reset form when modal opens
+  useEffect(() => {
+    if (isOpen) {
+      setFormData(initialFormData);
+      setErrors({});
+      setSubmitStatus('idle');
+      setErrorMessage('');
+    }
+  }, [isOpen]);
+ 
+  // Generate schedule string based on type
+  const generateScheduleString = useCallback((): string => {
+    switch (formData.scheduleType) {
+      case 'cron':
+        return formData.cronExpression;
+      case 'interval': {
+        const unitMap = { minutes: 'm', hours: 'h', days: 'd' };
+        return `every ${formData.intervalValue}${unitMap[formData.intervalUnit]}`;
+      }
+      case 'once': {
+        if (formData.runOnceDate && formData.runOnceTime) {
+          return `once ${formData.runOnceDate}T${formData.runOnceTime}`;
+        }
+        return '';
+      }
+      default:
+        return '';
+    }
+  }, [formData]);
+ 
+  // Validate form
+  const validateForm = useCallback((): boolean => {
+    const newErrors: Record<string, string> = {};
+ 
+    if (!formData.name.trim()) {
+      newErrors.name = '任务名称不能为空';
+    }
+ 
+    switch (formData.scheduleType) {
+      case 'cron':
+        if (!formData.cronExpression.trim()) {
+          newErrors.cronExpression = 'Cron 表达式不能为空';
+        } else if (!isValidCron(formData.cronExpression)) {
+          newErrors.cronExpression = 'Cron 表达式格式无效';
+        }
+        break;
+      case 'interval':
+        if (formData.intervalValue <= 0) {
+          newErrors.intervalValue = '间隔时间必须大于 0';
+        }
+        break;
+      case 'once':
+        if (!formData.runOnceDate) {
+          newErrors.runOnceDate = '请选择执行日期';
+        }
+        if (!formData.runOnceTime) {
+          newErrors.runOnceTime = '请选择执行时间';
+        }
+        break;
+    }
+ 
+    if (!formData.targetId) {
+      newErrors.targetId = '请选择要执行的目标';
+    }
+ 
+    setErrors(newErrors);
+    return Object.keys(newErrors).length === 0;
+  }, [formData]);
+ 
+  // Simple cron expression validator
+  const isValidCron = (expression: string): boolean => {
+    // Basic validation: 5 or 6 fields separated by spaces
+    const parts = expression.trim().split(/\s+/);
+    return parts.length >= 5 && parts.length <= 6;
+  };
+ 
+  // Handle form submission
+  const handleSubmit = async (e: React.FormEvent) => {
+    e.preventDefault();
+ 
+    if (!validateForm()) {
+      return;
+    }
+ 
+    setIsSubmitting(true);
+    setSubmitStatus('idle');
+    setErrorMessage('');
+ 
+    try {
+      const schedule = generateScheduleString();
+      await createScheduledTask({
+        name: formData.name.trim(),
+        schedule,
+        scheduleType: formData.scheduleType,
+        target: {
+          type: formData.targetType,
+          id: formData.targetId,
+        },
+        description: formData.description.trim() || undefined,
+        enabled: formData.enabled,
+      });
+ 
+      setSubmitStatus('success');
+      setTimeout(() => {
+        onSuccess();
+        onClose();
+      }, 1500);
+    } catch (err) {
+      setSubmitStatus('error');
+      setErrorMessage(err instanceof Error ? err.message : '创建任务失败');
+    } finally {
+      setIsSubmitting(false);
+    }
+  };
+ 
+  // Update form field
+  const updateField = <K extends keyof JobFormData>(field: K, value: JobFormData[K]) => {
+    setFormData(prev => ({ ...prev, [field]: value }));
+    // Clear error when field is updated
+    if (errors[field]) {
+      setErrors(prev => {
+        const newErrors = { ...prev };
+        delete newErrors[field];
+        return newErrors;
+      });
+    }
+  };
+ 
+  // Get available targets based on type
+  const getAvailableTargets = (): Array<{ id: string; name?: string }> => {
+    switch (formData.targetType) {
+      case 'agent':
+        return clones.map(c => ({ id: c.id, name: c.name }));
+      case 'hand':
+        return hands.map(h => ({ id: h.id, name: h.name }));
+      case 'workflow':
+        return workflows.map(w => ({ id: w.id, name: w.name }));
+      default:
+        return [];
+    }
+  };
+ 
+  if (!isOpen) return null;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <div className="flex items-center gap-3">
+            <div className="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center">
+              <Clock className="w-4 h-4 text-blue-600 dark:text-blue-400" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                新建定时任务
+              </h2>
+              <p className="text-xs text-gray-500 dark:text-gray-400">
+                创建一个定时执行的任务
+              </p>
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors"
+          >
+            <X className="w-5 h-5" />
+          </button>
+        </div>
+ 
+        {/* Form */}
+        <form onSubmit={handleSubmit} className="flex-1 overflow-y-auto p-4 space-y-4">
+          {/* Task Name */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              任务名称 <span className="text-red-500">*</span>
+            </label>
+            <input
+              type="text"
+              value={formData.name}
+              onChange={(e) => updateField('name', e.target.value)}
+              placeholder="例如: 每日数据同步"
+              className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 ${
+                errors.name ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+              }`}
+            />
+            {errors.name && (
+              <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                <AlertCircle className="w-3 h-3" />
+                {errors.name}
+              </p>
+            )}
+          </div>
+ 
+          {/* Schedule Type */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              调度类型 <span className="text-red-500">*</span>
+            </label>
+            <div className="flex gap-2">
+              {[
+                { value: 'cron', label: 'Cron 表达式' },
+                { value: 'interval', label: '固定间隔' },
+                { value: 'once', label: '执行一次' },
+              ].map((option) => (
+                <button
+                  key={option.value}
+                  type="button"
+                  onClick={() => updateField('scheduleType', option.value as ScheduleType)}
+                  className={`flex-1 px-3 py-2 text-sm rounded-lg border transition-colors ${
+                    formData.scheduleType === option.value
+                      ? 'bg-blue-600 text-white border-blue-600'
+                      : 'bg-white dark:bg-gray-900 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:border-blue-500'
+                  }`}
+                >
+                  {option.label}
+                </button>
+              ))}
+            </div>
+          </div>
+ 
+          {/* Cron Expression */}
+          {formData.scheduleType === 'cron' && (
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                Cron 表达式 <span className="text-red-500">*</span>
+              </label>
+              <input
+                type="text"
+                value={formData.cronExpression}
+                onChange={(e) => updateField('cronExpression', e.target.value)}
+                placeholder="0 9 * * * (每天 9:00)"
+                className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono ${
+                  errors.cronExpression ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                }`}
+              />
+              {errors.cronExpression && (
+                <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                  <AlertCircle className="w-3 h-3" />
+                  {errors.cronExpression}
+                </p>
+              )}
+              <p className="mt-1 text-xs text-gray-400">
+                格式: 分 时 日 月 周 (例如: 0 9 * * * 表示每天 9:00)
+              </p>
+            </div>
+          )}
+ 
+          {/* Interval Settings */}
+          {formData.scheduleType === 'interval' && (
+            <div className="flex gap-2">
+              <div className="flex-1">
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  间隔时间 <span className="text-red-500">*</span>
+                </label>
+                <input
+                  type="number"
+                  min="1"
+                  value={formData.intervalValue}
+                  onChange={(e) => updateField('intervalValue', parseInt(e.target.value) || 0)}
+                  className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 ${
+                    errors.intervalValue ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                  }`}
+                />
+                {errors.intervalValue && (
+                  <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                    <AlertCircle className="w-3 h-3" />
+                    {errors.intervalValue}
+                  </p>
+                )}
+              </div>
+              <div className="w-32">
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  单位
+                </label>
+                <select
+                  value={formData.intervalUnit}
+                  onChange={(e) => updateField('intervalUnit', e.target.value as 'minutes' | 'hours' | 'days')}
+                  className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+                >
+                  <option value="minutes">分钟</option>
+                  <option value="hours">小时</option>
+                  <option value="days">天</option>
+                </select>
+              </div>
+            </div>
+          )}
+ 
+          {/* Run Once Settings */}
+          {formData.scheduleType === 'once' && (
+            <div className="flex gap-2">
+              <div className="flex-1">
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  执行日期 <span className="text-red-500">*</span>
+                </label>
+                <input
+                  type="date"
+                  value={formData.runOnceDate}
+                  onChange={(e) => updateField('runOnceDate', e.target.value)}
+                  className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 ${
+                    errors.runOnceDate ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                  }`}
+                />
+                {errors.runOnceDate && (
+                  <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                    <AlertCircle className="w-3 h-3" />
+                    {errors.runOnceDate}
+                  </p>
+                )}
+              </div>
+              <div className="flex-1">
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  执行时间 <span className="text-red-500">*</span>
+                </label>
+                <input
+                  type="time"
+                  value={formData.runOnceTime}
+                  onChange={(e) => updateField('runOnceTime', e.target.value)}
+                  className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 ${
+                    errors.runOnceTime ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+                  }`}
+                />
+                {errors.runOnceTime && (
+                  <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                    <AlertCircle className="w-3 h-3" />
+                    {errors.runOnceTime}
+                  </p>
+                )}
+              </div>
+            </div>
+          )}
+ 
+          {/* Target Selection */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              执行目标类型
+            </label>
+            <div className="flex gap-2">
+              {[
+                { value: 'hand', label: 'Hand' },
+                { value: 'workflow', label: 'Workflow' },
+                { value: 'agent', label: 'Agent' },
+              ].map((option) => (
+                <button
+                  key={option.value}
+                  type="button"
+                  onClick={() => {
+                    updateField('targetType', option.value as TargetType);
+                    updateField('targetId', ''); // Reset target when type changes
+                  }}
+                  className={`flex-1 px-3 py-2 text-sm rounded-lg border transition-colors ${
+                    formData.targetType === option.value
+                      ? 'bg-blue-600 text-white border-blue-600'
+                      : 'bg-white dark:bg-gray-900 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600 hover:border-blue-500'
+                  }`}
+                >
+                  {option.label}
+                </button>
+              ))}
+            </div>
+          </div>
+ 
+          {/* Target Selection Dropdown */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              选择目标 <span className="text-red-500">*</span>
+            </label>
+            <select
+              value={formData.targetId}
+              onChange={(e) => updateField('targetId', e.target.value)}
+              className={`w-full px-3 py-2 text-sm border rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500 ${
+                errors.targetId ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'
+              }`}
+            >
+              <option value="">-- 请选择 --</option>
+              {getAvailableTargets().map((target) => (
+                <option key={target.id} value={target.id}>
+                  {target.name || target.id}
+                </option>
+              ))}
+            </select>
+            {errors.targetId && (
+              <p className="mt-1 text-xs text-red-500 flex items-center gap-1">
+                <AlertCircle className="w-3 h-3" />
+                {errors.targetId}
+              </p>
+            )}
+            {getAvailableTargets().length === 0 && (
+              <p className="mt-1 text-xs text-gray-400">
+                当前没有可用的 {formData.targetType === 'hand' ? 'Hands' : formData.targetType === 'workflow' ? 'Workflows' : 'Agents'}
+              </p>
+            )}
+          </div>
+ 
+          {/* Description */}
+          <div>
+            <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+              任务描述
+            </label>
+            <textarea
+              value={formData.description}
+              onChange={(e) => updateField('description', e.target.value)}
+              placeholder="可选的任务描述..."
+              rows={2}
+              className="w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-none"
+            />
+          </div>
+ 
+          {/* Enabled Toggle */}
+          <div className="flex items-center gap-2">
+            <input
+              type="checkbox"
+              id="enabled"
+              checked={formData.enabled}
+              onChange={(e) => updateField('enabled', e.target.checked)}
+              className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"
+            />
+            <label htmlFor="enabled" className="text-sm text-gray-700 dark:text-gray-300">
+              创建后立即启用
+            </label>
+          </div>
+ 
+          {/* Status Messages */}
+          {submitStatus === 'success' && (
+            <div className="flex items-center gap-2 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg text-green-700 dark:text-green-400">
+              <CheckCircle className="w-5 h-5 flex-shrink-0" />
+              <span className="text-sm">任务创建成功!</span>
+            </div>
+          )}
+          {submitStatus === 'error' && (
+            <div className="flex items-center gap-2 p-3 bg-red-50 dark:bg-red-900/20 rounded-lg text-red-700 dark:text-red-400">
+              <AlertCircle className="w-5 h-5 flex-shrink-0" />
+              <span className="text-sm">{errorMessage}</span>
+            </div>
+          )}
+        </form>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <button
+            type="button"
+            onClick={onClose}
+            disabled={isSubmitting}
+            className="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors disabled:opacity-50"
+          >
+            取消
+          </button>
+          <button
+            type="submit"
+            form="job-form"
+            onClick={handleSubmit}
+            disabled={isSubmitting || submitStatus === 'success'}
+            className="px-4 py-2 text-sm text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors disabled:opacity-50 flex items-center gap-2"
+          >
+            {isSubmitting ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                创建中...
+              </>
+            ) : (
+              <>
+                <Plus className="w-4 h-4" />
+                创建任务
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// === Main SchedulerPanel Component ===
+ 
+export function SchedulerPanel() {
+  // Store state - use domain stores
+  const scheduledTasks = useConfigStore((s) => s.scheduledTasks);
+  const loadScheduledTasks = useConfigStore((s) => s.loadScheduledTasks);
+  const workflows = useWorkflowStore((s) => s.workflows);
+  const loadWorkflows = useWorkflowStore((s) => s.loadWorkflows);
+  const createWorkflow = useWorkflowStore((s) => s.createWorkflow);
+  const executeWorkflow = useWorkflowStore((s) => s.triggerWorkflow);
+  const isLoading = useHandStore((s) => s.isLoading) || useWorkflowStore((s) => s.isLoading) || useConfigStore((s) => s.isLoading);
+  const [activeTab, setActiveTab] = useState<TabType>('scheduled');
+  const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
+  const [isWorkflowEditorOpen, setIsWorkflowEditorOpen] = useState(false);
+  const [editingWorkflow, setEditingWorkflow] = useState<Workflow | undefined>(undefined);
+  const [selectedWorkflow, setSelectedWorkflow] = useState<Workflow | null>(null);
+  const [isSavingWorkflow, setIsSavingWorkflow] = useState(false);
+ 
+  useEffect(() => {
+    loadScheduledTasks();
+    loadWorkflows();
+  }, [loadScheduledTasks, loadWorkflows]);
+ 
+  const handleCreateJob = useCallback(() => {
+    setIsCreateModalOpen(true);
+  }, []);
+ 
+  const handleCreateSuccess = useCallback(() => {
+    loadScheduledTasks();
+  }, [loadScheduledTasks]);
+ 
+  // Workflow handlers
+  const handleCreateWorkflow = useCallback(() => {
+    setEditingWorkflow(undefined);
+    setIsWorkflowEditorOpen(true);
+  }, []);
+ 
+  const handleEditWorkflow = useCallback((workflow: Workflow) => {
+    setEditingWorkflow(workflow);
+    setIsWorkflowEditorOpen(true);
+  }, []);
+ 
+  const handleViewWorkflowHistory = useCallback((workflow: Workflow) => {
+    setSelectedWorkflow(workflow);
+  }, []);
+ 
+  const handleSaveWorkflow = useCallback(async (data: {
+    name: string;
+    description?: string;
+    steps: Array<{
+      handName: string;
+      name?: string;
+      params?: Record<string, unknown>;
+      condition?: string;
+    }>;
+  }) => {
+    setIsSavingWorkflow(true);
+    try {
+      if (editingWorkflow) {
+        // Update existing workflow
+        console.log('Update workflow:', editingWorkflow.id, data);
+      } else {
+        // Create new workflow
+        await createWorkflow(data);
+      }
+      setIsWorkflowEditorOpen(false);
+      setEditingWorkflow(undefined);
+      await loadWorkflows();
+    } catch (error) {
+      console.error('Failed to save workflow:', error);
+      throw error;
+    } finally {
+      setIsSavingWorkflow(false);
+    }
+  }, [editingWorkflow, createWorkflow, loadWorkflows]);
+ 
+  const handleExecuteWorkflow = useCallback(async (workflowId: string) => {
+    try {
+      await executeWorkflow(workflowId);
+      await loadWorkflows();
+    } catch (error) {
+      console.error('Failed to execute workflow:', error);
+    }
+  }, [executeWorkflow, loadWorkflows]);
+ 
+  if (isLoading && scheduledTasks.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <Loader2 className="w-6 h-6 animate-spin mx-auto text-gray-400 mb-2" />
+        <p className="text-sm text-gray-500 dark:text-gray-400">
+          加载调度器中...
+        </p>
+      </div>
+    );
+  }
+ 
+  return (
+    <>
+      <div className="space-y-4">
+        {/* Header */}
+        <div className="flex items-start justify-between gap-4">
+          <div>
+            <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+              调度器
+            </h2>
+            <p className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+              管理定时任务和事件触发器
+            </p>
+          </div>
+          <button
+            onClick={() => loadScheduledTasks()}
+            disabled={isLoading}
+            className="text-sm text-blue-600 dark:text-blue-400 hover:underline flex items-center gap-1 disabled:opacity-50"
+          >
+            {isLoading ? (
+              <Loader2 className="w-3.5 h-3.5 animate-spin" />
+            ) : (
+              <RefreshCw className="w-3.5 h-3.5" />
+            )}
+            刷新
+          </button>
+        </div>
+ 
+        {/* Tab Navigation */}
+        <div className="flex items-center justify-between">
+          <div className="flex items-center bg-gray-100 dark:bg-gray-800 rounded-lg p-1">
+            <TabButton
+              active={activeTab === 'scheduled'}
+              onClick={() => setActiveTab('scheduled')}
+              icon={Clock}
+              label="定时任务"
+            />
+            <TabButton
+              active={activeTab === 'triggers'}
+              onClick={() => setActiveTab('triggers')}
+              icon={Zap}
+              label="事件触发器"
+            />
+            <TabButton
+              active={activeTab === 'workflows'}
+              onClick={() => setActiveTab('workflows')}
+              icon={GitBranch}
+              label="工作流"
+            />
+            <TabButton
+              active={activeTab === 'history'}
+              onClick={() => setActiveTab('history')}
+              icon={History}
+              label="运行历史"
+            />
+          </div>
+          {activeTab === 'scheduled' && (
+            <button
+              onClick={handleCreateJob}
+              className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
+            >
+              <Plus className="w-4 h-4" />
+              新建任务
+            </button>
+          )}
+          {activeTab === 'workflows' && (
+            <button
+              onClick={handleCreateWorkflow}
+              className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
+            >
+              <Plus className="w-4 h-4" />
+              新建工作流
+            </button>
+          )}
+        </div>
+ 
+        {/* Tab Content */}
+        {activeTab === 'scheduled' && (
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+            {scheduledTasks.length === 0 ? (
+              <EmptyState
+                icon={Calendar}
+                title="暂无定时任务"
+                description="创建一个定时任务来定期运行代理。"
+                actionLabel="创建定时任务"
+                onAction={handleCreateJob}
+              />
+            ) : (
+              <div className="space-y-2">
+                {scheduledTasks.map((task) => (
+                  <div
+                    key={task.id}
+                    className="flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-900 rounded-lg"
+                  >
+                    <div className="flex items-center gap-3">
+                      <div className="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center">
+                        <Clock className="w-4 h-4 text-blue-600 dark:text-blue-400" />
+                      </div>
+                      <div>
+                        <div className="font-medium text-gray-900 dark:text-white">
+                          {task.name}
+                        </div>
+                        <div className="text-xs text-gray-500 dark:text-gray-400">
+                          {task.schedule}
+                        </div>
+                      </div>
+                    </div>
+                    <div className="flex items-center gap-2">
+                      <span
+                        className={`px-2 py-0.5 rounded text-xs ${
+                          task.status === 'active'
+                            ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'
+                            : task.status === 'paused'
+                            ? 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400'
+                            : 'bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400'
+                        }`}
+                      >
+                        {task.status === 'active' ? '运行中' : task.status === 'paused' ? '已暂停' : task.status}
+                      </span>
+                    </div>
+                  </div>
+                ))}
+              </div>
+            )}
+          </div>
+        )}
+ 
+        {activeTab === 'triggers' && (
+          <TriggersPanel />
+        )}
+ 
+        {/* Workflows Tab */}
+        {activeTab === 'workflows' && (
+          selectedWorkflow ? (
+            <WorkflowHistory
+              workflow={selectedWorkflow}
+              onBack={() => setSelectedWorkflow(null)}
+            />
+          ) : (
+            <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+              {workflows.length === 0 ? (
+                <EmptyState
+                  icon={GitBranch}
+                  title="暂无工作流"
+                  description="工作流可以将多个 Hand 组合成自动化流程,实现复杂的任务编排。"
+                  actionLabel="创建工作流"
+                  onAction={handleCreateWorkflow}
+                />
+              ) : (
+                <div className="space-y-2">
+                  {workflows.map((workflow) => (
+                    <div
+                      key={workflow.id}
+                      className="flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-900 rounded-lg"
+                    >
+                      <div className="flex items-center gap-3">
+                        <div className="w-8 h-8 bg-purple-100 dark:bg-purple-900/30 rounded-lg flex items-center justify-center">
+                          <GitBranch className="w-4 h-4 text-purple-600 dark:text-purple-400" />
+                        </div>
+                        <div>
+                          <div className="font-medium text-gray-900 dark:text-white">
+                            {workflow.name}
+                          </div>
+                          <div className="text-xs text-gray-500 dark:text-gray-400">
+                            {workflow.description || '无描述'}
+                          </div>
+                        </div>
+                      </div>
+                      <div className="flex items-center gap-2">
+                        {workflow.steps && (
+                          <span className="text-xs text-gray-500 dark:text-gray-400">
+                            {workflow.steps} 步骤
+                          </span>
+                        )}
+                        <button
+                          onClick={() => handleExecuteWorkflow(workflow.id)}
+                          className="p-1.5 text-green-600 hover:bg-green-50 dark:hover:bg-green-900/20 rounded"
+                          title="执行"
+                        >
+                          <Play className="w-4 h-4" />
+                        </button>
+                        <button
+                          onClick={() => handleEditWorkflow(workflow)}
+                          className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded"
+                          title="编辑"
+                        >
+                          <GitBranch className="w-4 h-4" />
+                        </button>
+                        <button
+                          onClick={() => handleViewWorkflowHistory(workflow)}
+                          className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded"
+                          title="历史"
+                        >
+                          <History className="w-4 h-4" />
+                        </button>
+                      </div>
+                    </div>
+                  ))}
+                  <button
+                    onClick={handleCreateWorkflow}
+                    className="w-full flex items-center justify-center gap-2 p-3 border-2 border-dashed border-gray-200 dark:border-gray-700 rounded-lg text-gray-500 dark:text-gray-400 hover:border-blue-500 hover:text-blue-500 dark:hover:border-blue-400 dark:hover:text-blue-400 transition-colors"
+                  >
+                    <Plus className="w-4 h-4" />
+                    创建新工作流
+                  </button>
+                </div>
+              )}
+            </div>
+          )
+        )}
+ 
+        {activeTab === 'history' && (
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+            <EmptyState
+              icon={History}
+              title="暂无运行历史"
+              description="当定时任务或事件触发器执行时,运行记录将显示在这里,包括状态和日志。"
+            />
+          </div>
+        )}
+      </div>
+ 
+      {/* Create Job Modal */}
+      <CreateJobModal
+        isOpen={isCreateModalOpen}
+        onClose={() => setIsCreateModalOpen(false)}
+        onSuccess={handleCreateSuccess}
+      />
+ 
+      {/* Workflow Editor Modal */}
+      <WorkflowEditor
+        workflow={editingWorkflow}
+        isOpen={isWorkflowEditorOpen}
+        onClose={() => {
+          setIsWorkflowEditorOpen(false);
+          setEditingWorkflow(undefined);
+        }}
+        onSave={handleSaveWorkflow}
+        isSaving={isSavingWorkflow}
+      />
+    </>
+  );
+}
+ 
+export default SchedulerPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SecurityLayersPanel.tsx.html b/desktop/coverage/src/components/SecurityLayersPanel.tsx.html new file mode 100644 index 0000000..4065d47 --- /dev/null +++ b/desktop/coverage/src/components/SecurityLayersPanel.tsx.html @@ -0,0 +1,2263 @@ + + + + + + Code coverage report for src/components/SecurityLayersPanel.tsx + + + + + + + + + +
+
+

All files / src/components SecurityLayersPanel.tsx

+
+ +
+ 0% + Statements + 0/584 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/584 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect } from 'react';
+import {
+  Shield,
+  ShieldCheck,
+  ShieldAlert,
+  ShieldX,
+  ChevronDown,
+  ChevronRight,
+  Key,
+  Users,
+  Gauge,
+  Clock,
+  LockKeyhole,
+  FileText,
+  CheckCircle2,
+  Box,
+  Globe,
+  Cpu,
+  DoorOpen as Gate,
+  MessageSquareWarning,
+  Filter,
+  Radar,
+  Siren,
+  RefreshCw,
+  Lock,
+  Wifi,
+  WifiOff,
+} from 'lucide-react';
+import type { SecurityLayer, SecurityStatus } from '../store/securityStore';
+import { useSecurityStore } from '../store/securityStore';
+import { useConnectionStore } from '../store/connectionStore';
+ 
+// OpenFang 16-layer security architecture definitions
+export const SECURITY_LAYERS: Array<{
+  id: string;
+  name: string;
+  nameZh: string;
+  description: string;
+  category: 'input' | 'auth' | 'authz' | 'rate' | 'session' | 'encryption' | 'audit' | 'integrity' | 'sandbox' | 'network' | 'resource' | 'capability' | 'prompt' | 'output' | 'anomaly' | 'incident';
+  icon: React.ComponentType<{ className?: string }>;
+}> = [
+  {
+    id: 'input.validation',
+    name: 'Input Validation Layer',
+    nameZh: '输入验证',
+    description: 'Validates and sanitizes all user inputs to prevent injection attacks and malformed data.',
+    category: 'input',
+    icon: Filter,
+  },
+  {
+    id: 'auth.identity',
+    name: 'Authentication Layer',
+    nameZh: '身份认证',
+    description: 'Ed25519 cryptographic authentication with JWT tokens for secure identity verification.',
+    category: 'auth',
+    icon: Key,
+  },
+  {
+    id: 'auth.rbac',
+    name: 'Authorization Layer (RBAC)',
+    nameZh: '权限控制',
+    description: 'Role-based access control with fine-grained permissions and capability gates.',
+    category: 'authz',
+    icon: Users,
+  },
+  {
+    id: 'rate.limit',
+    name: 'Rate Limiting Layer',
+    nameZh: '速率限制',
+    description: 'Prevents abuse by limiting request frequency per user, IP, and endpoint.',
+    category: 'rate',
+    icon: Gauge,
+  },
+  {
+    id: 'session.management',
+    name: 'Session Management Layer',
+    nameZh: '会话管理',
+    description: 'Secure session handling with automatic expiration, rotation, and invalidation.',
+    category: 'session',
+    icon: Clock,
+  },
+  {
+    id: 'encryption',
+    name: 'Encryption Layer',
+    nameZh: '数据加密',
+    description: 'End-to-end encryption for data at rest and in transit using AES-256-GCM.',
+    category: 'encryption',
+    icon: LockKeyhole,
+  },
+  {
+    id: 'audit.logging',
+    name: 'Audit Logging Layer',
+    nameZh: '审计日志',
+    description: 'Merkle hash chain audit logging for tamper-evident operation records.',
+    category: 'audit',
+    icon: FileText,
+  },
+  {
+    id: 'integrity',
+    name: 'Integrity Verification Layer',
+    nameZh: '完整性验证',
+    description: 'Cryptographic verification of code and data integrity using SHA-256 hashes.',
+    category: 'integrity',
+    icon: CheckCircle2,
+  },
+  {
+    id: 'sandbox',
+    name: 'Sandbox Isolation Layer',
+    nameZh: '沙箱隔离',
+    description: 'Isolated execution environments for untrusted code and operations.',
+    category: 'sandbox',
+    icon: Box,
+  },
+  {
+    id: 'network.security',
+    name: 'Network Security Layer',
+    nameZh: '网络安全',
+    description: 'TLS 1.3 encryption, firewall rules, and network segmentation.',
+    category: 'network',
+    icon: Globe,
+  },
+  {
+    id: 'resource.limits',
+    name: 'Resource Limits Layer',
+    nameZh: '资源限制',
+    description: 'Memory, CPU, and I/O limits to prevent resource exhaustion attacks.',
+    category: 'resource',
+    icon: Cpu,
+  },
+  {
+    id: 'capability.gates',
+    name: 'Capability Gates Layer',
+    nameZh: '能力门控',
+    description: 'Explicit permission gates for sensitive operations like file access and network calls.',
+    category: 'capability',
+    icon: Gate,
+  },
+  {
+    id: 'prompt.defense',
+    name: 'Prompt Injection Defense',
+    nameZh: '提示注入防御',
+    description: 'Detects and mitigates prompt injection and jailbreak attempts.',
+    category: 'prompt',
+    icon: MessageSquareWarning,
+  },
+  {
+    id: 'output.filter',
+    name: 'Output Filtering Layer',
+    nameZh: '输出过滤',
+    description: 'Filters sensitive information from outputs and enforces content policies.',
+    category: 'output',
+    icon: Filter,
+  },
+  {
+    id: 'anomaly.detection',
+    name: 'Anomaly Detection Layer',
+    nameZh: '异常检测',
+    description: 'ML-based detection of unusual patterns and potential security threats.',
+    category: 'anomaly',
+    icon: Radar,
+  },
+  {
+    id: 'incident.response',
+    name: 'Incident Response Layer',
+    nameZh: '事件响应',
+    description: 'Automated incident detection, alerting, and response orchestration.',
+    category: 'incident',
+    icon: Siren,
+  },
+];
+ 
+// Category groupings for UI organization
+const LAYER_CATEGORIES = {
+  perimeter: {
+    label: 'Perimeter Defense',
+    labelZh: '边界防护',
+    layers: ['input.validation', 'network.security', 'rate.limit'],
+  },
+  identity: {
+    label: 'Identity & Access',
+    labelZh: '身份与访问',
+    layers: ['auth.identity', 'auth.rbac', 'session.management'],
+  },
+  data: {
+    label: 'Data Protection',
+    labelZh: '数据保护',
+    layers: ['encryption', 'integrity', 'output.filter'],
+  },
+  execution: {
+    label: 'Execution Safety',
+    labelZh: '执行安全',
+    layers: ['sandbox', 'resource.limits', 'capability.gates', 'prompt.defense'],
+  },
+  monitoring: {
+    label: 'Monitoring & Response',
+    labelZh: '监控与响应',
+    layers: ['audit.logging', 'anomaly.detection', 'incident.response'],
+  },
+} as const;
+ 
+interface LayerStatus {
+  status: 'active' | 'warning' | 'inactive';
+  details?: string;
+}
+ 
+function getLayerStatus(layer: SecurityLayer): LayerStatus {
+  if (layer.enabled) {
+    return { status: 'active', details: layer.description };
+  }
+  return { status: 'inactive', details: layer.description };
+}
+ 
+function getStatusIcon(status: 'active' | 'warning' | 'inactive') {
+  switch (status) {
+    case 'active':
+      return <ShieldCheck className="w-4 h-4 text-green-500" />;
+    case 'warning':
+      return <ShieldAlert className="w-4 h-4 text-yellow-500" />;
+    case 'inactive':
+      return <ShieldX className="w-4 h-4 text-red-400" />;
+  }
+}
+ 
+function getStatusColor(status: 'active' | 'warning' | 'inactive') {
+  switch (status) {
+    case 'active':
+      return 'bg-green-50 border-green-200 text-green-700';
+    case 'warning':
+      return 'bg-yellow-50 border-yellow-200 text-yellow-700';
+    case 'inactive':
+      return 'bg-gray-50 border-gray-200 text-gray-500';
+  }
+}
+ 
+interface LayerRowProps {
+  layerDef: typeof SECURITY_LAYERS[0];
+  status: LayerStatus;
+  expanded: boolean;
+  onToggle: () => void;
+}
+ 
+function LayerRow({ layerDef, status, expanded, onToggle }: LayerRowProps) {
+  const Icon = layerDef.icon;
+ 
+  return (
+    <div className={`rounded-lg border transition-all ${getStatusColor(status.status)}`}>
+      <button
+        onClick={onToggle}
+        className="w-full flex items-center gap-3 px-3 py-2.5 text-left"
+      >
+        <Icon className="w-4 h-4 flex-shrink-0" />
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2">
+            <span className="text-sm font-medium truncate">{layerDef.nameZh}</span>
+            <span className="text-xs opacity-60 truncate">{layerDef.name}</span>
+          </div>
+        </div>
+        {getStatusIcon(status.status)}
+        {expanded ? (
+          <ChevronDown className="w-4 h-4 opacity-50" />
+        ) : (
+          <ChevronRight className="w-4 h-4 opacity-50" />
+        )}
+      </button>
+      {expanded && (
+        <div className="px-3 pb-3 pt-0">
+          <p className="text-xs leading-relaxed opacity-80">{layerDef.description}</p>
+          {status.details && status.details !== layerDef.description && (
+            <p className="text-xs mt-1 opacity-60">{status.details}</p>
+          )}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+interface CategorySectionProps {
+  categoryKey: keyof typeof LAYER_CATEGORIES;
+  layers: SecurityLayer[];
+  expandedLayers: Set<string>;
+  onToggleLayer: (id: string) => void;
+}
+ 
+function CategorySection({
+  categoryKey,
+  layers,
+  expandedLayers,
+  onToggleLayer,
+}: CategorySectionProps) {
+  const category = LAYER_CATEGORIES[categoryKey];
+  const categoryLayers = category.layers
+    .map((id) => SECURITY_LAYERS.find((l) => l.id === id))
+    .filter(Boolean)
+    .map((layerDef) => {
+      const apiLayer = layers.find((l) => l.name === layerDef!.id);
+      return {
+        def: layerDef!,
+        status: getLayerStatus(apiLayer || { name: layerDef!.id, enabled: false }),
+      };
+    });
+ 
+  const activeCount = categoryLayers.filter((l) => l.status.status === 'active').length;
+  const totalCount = categoryLayers.length;
+ 
+  return (
+    <div className="space-y-2">
+      <div className="flex items-center justify-between px-1">
+        <span className="text-xs font-medium text-gray-600">{category.labelZh}</span>
+        <span className={`text-xs ${activeCount === totalCount ? 'text-green-600' : 'text-gray-400'}`}>
+          {activeCount}/{totalCount}
+        </span>
+      </div>
+      <div className="space-y-1.5">
+        {categoryLayers.map(({ def, status }) => (
+          <LayerRow
+            key={def.id}
+            layerDef={def}
+            status={status}
+            expanded={expandedLayers.has(def.id)}
+            onToggle={() => onToggleLayer(def.id)}
+          />
+        ))}
+      </div>
+    </div>
+  );
+}
+ 
+interface SecurityLayersPanelProps {
+  status: SecurityStatus;
+  className?: string;
+}
+ 
+export function SecurityLayersPanel({ status, className = '' }: SecurityLayersPanelProps) {
+  const [expandedLayers, setExpandedLayers] = useState<Set<string>>(new Set());
+  const [expandedCategories, setExpandedCategories] = useState<Set<string>>(
+    new Set(Object.keys(LAYER_CATEGORIES))
+  );
+ 
+  const toggleLayer = (id: string) => {
+    setExpandedLayers((prev) => {
+      const next = new Set(prev);
+      if (next.has(id)) {
+        next.delete(id);
+      } else {
+        next.add(id);
+      }
+      return next;
+    });
+  };
+ 
+  const toggleCategory = (key: string) => {
+    setExpandedCategories((prev) => {
+      const next = new Set(prev);
+      if (next.has(key)) {
+        next.delete(key);
+      } else {
+        next.add(key);
+      }
+      return next;
+    });
+  };
+ 
+  // Calculate security score
+  const activeLayers = status.layers.filter((l) => l.enabled).length;
+  const totalLayers = SECURITY_LAYERS.length;
+  const score = Math.round((activeLayers / totalLayers) * 100);
+ 
+  return (
+    <div className={`space-y-4 ${className}`}>
+      {/* Security Score Circle */}
+      <div className="flex items-center justify-center py-4">
+        <div className="relative w-32 h-32">
+          <svg className="w-full h-full transform -rotate-90" viewBox="0 0 100 100">
+            {/* Background circle */}
+            <circle
+              cx="50"
+              cy="50"
+              r="45"
+              fill="none"
+              stroke="currentColor"
+              strokeWidth="8"
+              className="text-gray-100"
+            />
+            {/* Progress circle */}
+            <circle
+              cx="50"
+              cy="50"
+              r="45"
+              fill="none"
+              stroke="currentColor"
+              strokeWidth="8"
+              strokeLinecap="round"
+              strokeDasharray={`${score * 2.83} 283`}
+              className={
+                score >= 90
+                  ? 'text-green-500'
+                  : score >= 70
+                  ? 'text-blue-500'
+                  : score >= 50
+                  ? 'text-yellow-500'
+                  : 'text-red-500'
+              }
+            />
+          </svg>
+          <div className="absolute inset-0 flex flex-col items-center justify-center">
+            <span
+              className={`text-3xl font-bold ${
+                score >= 90
+                  ? 'text-green-600'
+                  : score >= 70
+                  ? 'text-blue-600'
+                  : score >= 50
+                  ? 'text-yellow-600'
+                  : 'text-red-600'
+              }`}
+            >
+              {score}
+            </span>
+            <span className="text-xs text-gray-500">Security Score</span>
+          </div>
+        </div>
+      </div>
+ 
+      {/* Summary Stats */}
+      <div className="grid grid-cols-3 gap-3 px-1">
+        <div className="text-center">
+          <div className="text-lg font-semibold text-green-600">{activeLayers}</div>
+          <div className="text-xs text-gray-500">Active</div>
+        </div>
+        <div className="text-center">
+          <div className="text-lg font-semibold text-yellow-600">
+            {status.layers.filter((l) => !l.enabled).length}
+          </div>
+          <div className="text-xs text-gray-500">Inactive</div>
+        </div>
+        <div className="text-center">
+          <div className="text-lg font-semibold text-gray-600">{totalLayers}</div>
+          <div className="text-xs text-gray-500">Total</div>
+        </div>
+      </div>
+ 
+      {/* Category Sections */}
+      <div className="space-y-4">
+        {(Object.keys(LAYER_CATEGORIES) as Array<keyof typeof LAYER_CATEGORIES>).map(
+          (categoryKey) => (
+            <div key={categoryKey} className="bg-gray-50 rounded-lg p-3">
+              <button
+                onClick={() => toggleCategory(categoryKey)}
+                className="w-full flex items-center justify-between mb-2"
+              >
+                <div className="flex items-center gap-2">
+                  <Shield className="w-4 h-4 text-gray-500" />
+                  <span className="text-sm font-medium text-gray-700">
+                    {LAYER_CATEGORIES[categoryKey].labelZh}
+                  </span>
+                </div>
+                {expandedCategories.has(categoryKey) ? (
+                  <ChevronDown className="w-4 h-4 text-gray-400" />
+                ) : (
+                  <ChevronRight className="w-4 h-4 text-gray-400" />
+                )}
+              </button>
+              {expandedCategories.has(categoryKey) && (
+                <CategorySection
+                  categoryKey={categoryKey}
+                  layers={status.layers}
+                  expandedLayers={expandedLayers}
+                  onToggleLayer={toggleLayer}
+                />
+              )}
+            </div>
+          )
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+// Utility function to calculate security score
+export function calculateSecurityScore(layers: SecurityLayer[]): number {
+  const activeCount = layers.filter((l) => l.enabled).length;
+  return Math.round((activeCount / SECURITY_LAYERS.length) * 100);
+}
+ 
+// ZCLAW 默认安全状态(独立于 OpenFang)
+export function getDefaultSecurityStatus(): SecurityStatus {
+  // ZCLAW 默认启用的安全层
+  const defaultEnabledLayers = [
+    'input.validation',
+    'auth.identity',
+    'session.management',
+    'encryption',
+    'audit.logging',
+    'integrity',
+    'sandbox',
+    'network.security',
+    'capability.gates',
+    'prompt.defense',
+    'output.filter',
+    'anomaly.detection',
+  ];
+ 
+  const layers: SecurityLayer[] = SECURITY_LAYERS.map((layer) => ({
+    name: layer.id,
+    enabled: defaultEnabledLayers.includes(layer.id),
+    description: layer.description,
+  }));
+ 
+  const enabledCount = layers.filter((l) => l.enabled).length;
+ 
+  return {
+    layers,
+    enabledCount,
+    totalCount: layers.length,
+    securityLevel: enabledCount >= 12 ? 'critical' : enabledCount >= 8 ? 'high' : 'medium',
+  };
+}
+ 
+// === 独立安全状态面板组件 ===
+ 
+interface SecurityStatusPanelProps {
+  className?: string;
+}
+ 
+export function SecurityStatusPanel({ className = '' }: SecurityStatusPanelProps) {
+  const securityStatus = useSecurityStore((s) => s.securityStatus);
+  const securityStatusLoading = useSecurityStore((s) => s.securityStatusLoading);
+  const loadSecurityStatus = useSecurityStore((s) => s.loadSecurityStatus);
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const [localStatus, setLocalStatus] = useState<SecurityStatus>(getDefaultSecurityStatus());
+  const [refreshing, setRefreshing] = useState(false);
+ 
+  const connected = connectionState === 'connected';
+ 
+  // 加载安全状态
+  useEffect(() => {
+    if (connected) {
+      loadSecurityStatus();
+    }
+  }, [connected, loadSecurityStatus]);
+ 
+  // 当从 API 获取到安全状态时,使用 API 数据,否则使用本地默认状态
+  const displayStatus = connected && securityStatus ? securityStatus : localStatus;
+ 
+  const handleRefresh = async () => {
+    setRefreshing(true);
+    try {
+      if (connected) {
+        await loadSecurityStatus();
+      } else {
+        // 如果没有连接,刷新本地状态
+        setLocalStatus(getDefaultSecurityStatus());
+      }
+    } finally {
+      setRefreshing(false);
+    }
+  };
+ 
+  const score = calculateSecurityScore(displayStatus.layers);
+ 
+  return (
+    <div className={`space-y-4 ${className}`}>
+      {/* 头部 */}
+      <div className="flex items-center justify-between">
+        <div className="flex items-center gap-2">
+          <Shield className="w-5 h-5 text-blue-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">安全状态</h2>
+        </div>
+        <div className="flex items-center gap-2">
+          <span className={`text-xs flex items-center gap-1 ${connected ? 'text-green-600' : 'text-gray-400'}`}>
+            {connected ? <Wifi className="w-3 h-3" /> : <WifiOff className="w-3 h-3" />}
+            {connected ? '已连接' : '本地模式'}
+          </span>
+          <button
+            onClick={handleRefresh}
+            disabled={refreshing || securityStatusLoading}
+            className="p-1.5 text-gray-400 hover:text-blue-500 rounded-md transition-colors disabled:opacity-50"
+            title="刷新安全状态"
+          >
+            <RefreshCw className={`w-4 h-4 ${refreshing || securityStatusLoading ? 'animate-spin' : ''}`} />
+          </button>
+        </div>
+      </div>
+ 
+      {/* 安全评分 */}
+      <div className="flex items-center justify-center py-4">
+        <div className="relative w-28 h-28">
+          <svg className="w-full h-full transform -rotate-90" viewBox="0 0 100 100">
+            <circle
+              cx="50"
+              cy="50"
+              r="45"
+              fill="none"
+              stroke="currentColor"
+              strokeWidth="8"
+              className="text-gray-100 dark:text-gray-700"
+            />
+            <circle
+              cx="50"
+              cy="50"
+              r="45"
+              fill="none"
+              stroke="currentColor"
+              strokeWidth="8"
+              strokeLinecap="round"
+              strokeDasharray={`${score * 2.83} 283`}
+              className={
+                score >= 90
+                  ? 'text-green-500'
+                  : score >= 70
+                  ? 'text-blue-500'
+                  : score >= 50
+                  ? 'text-yellow-500'
+                  : 'text-red-500'
+              }
+            />
+          </svg>
+          <div className="absolute inset-0 flex flex-col items-center justify-center">
+            <span
+              className={`text-2xl font-bold ${
+                score >= 90
+                  ? 'text-green-600'
+                  : score >= 70
+                  ? 'text-blue-600'
+                  : score >= 50
+                  ? 'text-yellow-600'
+                  : 'text-red-600'
+              }`}
+            >
+              {score}
+            </span>
+            <span className="text-[10px] text-gray-500">安全评分</span>
+          </div>
+        </div>
+      </div>
+ 
+      {/* 状态统计 */}
+      <div className="grid grid-cols-3 gap-3">
+        <div className="bg-green-50 dark:bg-green-900/20 rounded-lg p-3 text-center">
+          <div className="text-lg font-semibold text-green-600">
+            {displayStatus.layers.filter((l) => l.enabled).length}
+          </div>
+          <div className="text-xs text-green-600">已启用</div>
+        </div>
+        <div className="bg-yellow-50 dark:bg-yellow-900/20 rounded-lg p-3 text-center">
+          <div className="text-lg font-semibold text-yellow-600">
+            {displayStatus.layers.filter((l) => !l.enabled).length}
+          </div>
+          <div className="text-xs text-yellow-600">未启用</div>
+        </div>
+        <div className="bg-gray-50 dark:bg-gray-800 rounded-lg p-3 text-center">
+          <div className="text-lg font-semibold text-gray-600">
+            {displayStatus.totalCount}
+          </div>
+          <div className="text-xs text-gray-500">总层数</div>
+        </div>
+      </div>
+ 
+      {/* 安全等级 */}
+      <div className={`rounded-lg p-3 border ${
+        displayStatus.securityLevel === 'critical'
+          ? 'bg-green-50 border-green-200'
+          : displayStatus.securityLevel === 'high'
+          ? 'bg-blue-50 border-blue-200'
+          : 'bg-yellow-50 border-yellow-200'
+      }`}>
+        <div className="flex items-center gap-2">
+          <Lock className={`w-4 h-4 ${
+            displayStatus.securityLevel === 'critical'
+              ? 'text-green-600'
+              : displayStatus.securityLevel === 'high'
+              ? 'text-blue-600'
+              : 'text-yellow-600'
+          }`} />
+          <span className={`text-sm font-medium ${
+            displayStatus.securityLevel === 'critical'
+              ? 'text-green-700'
+              : displayStatus.securityLevel === 'high'
+              ? 'text-blue-700'
+              : 'text-yellow-700'
+          }`}>
+            {displayStatus.securityLevel === 'critical'
+              ? '最高安全等级'
+              : displayStatus.securityLevel === 'high'
+              ? '高安全等级'
+              : '中等安全等级'}
+          </span>
+        </div>
+        <p className="text-xs text-gray-500 mt-1">
+          {!connected && 'ZCLAW 默认安全配置。连接 OpenFang 后可获取完整安全状态。'}
+        </p>
+      </div>
+ 
+      {/* 快速查看安全层 */}
+      <div className="space-y-2">
+        <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wider">安全层概览</h3>
+        <div className="flex flex-wrap gap-1.5">
+          {SECURITY_LAYERS.slice(0, 8).map((layer) => {
+            const isEnabled = displayStatus.layers.find((l) => l.name === layer.id)?.enabled ?? false;
+            const Icon = layer.icon;
+            return (
+              <div
+                key={layer.id}
+                className={`flex items-center gap-1 px-2 py-1 rounded-md text-xs ${
+                  isEnabled
+                    ? 'bg-green-50 text-green-700'
+                    : 'bg-gray-100 text-gray-500'
+                }`}
+                title={layer.nameZh}
+              >
+                <Icon className="w-3 h-3" />
+                <span className="hidden sm:inline">{layer.nameZh}</span>
+              </div>
+            );
+          })}
+          <div className="flex items-center gap-1 px-2 py-1 rounded-md text-xs bg-gray-50 text-gray-400">
+            <span>+8 层</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// Export layer definitions for use in other components
+export { SECURITY_LAYERS as SECURITY_LAYERS_DEFINITION };
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SecurityStatus.tsx.html b/desktop/coverage/src/components/SecurityStatus.tsx.html new file mode 100644 index 0000000..0e0a147 --- /dev/null +++ b/desktop/coverage/src/components/SecurityStatus.tsx.html @@ -0,0 +1,901 @@ + + + + + + Code coverage report for src/components/SecurityStatus.tsx + + + + + + + + + +
+
+

All files / src/components SecurityStatus.tsx

+
+ +
+ 0% + Statements + 0/224 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/224 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect } from 'react';
+import { Shield, ShieldCheck, ShieldAlert, ShieldX, RefreshCw, Loader2, AlertCircle } from 'lucide-react';
+import { useConnectionStore } from '../store/connectionStore';
+import { useSecurityStore } from '../store/securityStore';
+ 
+// OpenFang 16-layer security architecture names (Chinese)
+const SECURITY_LAYER_NAMES: Record<string, string> = {
+  // Layer 1: Network
+  'network.firewall': '网络防火墙',
+  'network.tls': 'TLS 加密',
+  'network.rate_limit': '速率限制',
+  // Layer 2: Authentication
+  'auth.device': '设备认证',
+  'auth.jwt': 'JWT 令牌',
+  'auth.session': '会话管理',
+  // Layer 3: Authorization
+  'auth.rbac': '角色权限',
+  'auth.capabilities': '能力控制',
+  // Layer 4: Input Validation
+  'input.sanitization': '输入净化',
+  'input.schema': '模式验证',
+  // Layer 5: Execution
+  'exec.sandbox': '沙箱隔离',
+  'exec.timeout': '执行超时',
+  'exec.resource_limit': '资源限制',
+  // Layer 6: Audit & Logging
+  'audit.logging': '审计日志',
+  'audit.tracing': '请求追踪',
+  'audit.alerting': '审计告警',
+};
+ 
+// Default 16 layers for display when API returns minimal data
+const DEFAULT_LAYERS = [
+  { name: 'network.firewall', enabled: false },
+  { name: 'network.tls', enabled: false },
+  { name: 'network.rate_limit', enabled: false },
+  { name: 'auth.device', enabled: false },
+  { name: 'auth.jwt', enabled: false },
+  { name: 'auth.session', enabled: false },
+  { name: 'auth.rbac', enabled: false },
+  { name: 'auth.capabilities', enabled: false },
+  { name: 'input.sanitization', enabled: false },
+  { name: 'input.schema', enabled: false },
+  { name: 'exec.sandbox', enabled: false },
+  { name: 'exec.timeout', enabled: false },
+  { name: 'exec.resource_limit', enabled: false },
+  { name: 'audit.logging', enabled: false },
+  { name: 'audit.tracing', enabled: false },
+  { name: 'audit.alerting', enabled: false },
+];
+ 
+function getSecurityIcon(level: 'critical' | 'high' | 'medium' | 'low') {
+  switch (level) {
+    case 'critical':
+      return <ShieldCheck className="w-5 h-5 text-green-600" />;
+    case 'high':
+      return <Shield className="w-5 h-5 text-blue-600" />;
+    case 'medium':
+      return <ShieldAlert className="w-5 h-5 text-yellow-600" />;
+    case 'low':
+      return <ShieldX className="w-5 h-5 text-red-600" />;
+  }
+}
+ 
+function getSecurityLabel(level: 'critical' | 'high' | 'medium' | 'low') {
+  switch (level) {
+    case 'critical':
+      return { text: '极高', color: 'text-green-600 bg-green-50 border-green-200' };
+    case 'high':
+      return { text: '高', color: 'text-blue-600 bg-blue-50 border-blue-200' };
+    case 'medium':
+      return { text: '中', color: 'text-yellow-600 bg-yellow-50 border-yellow-200' };
+    case 'low':
+      return { text: '低', color: 'text-red-600 bg-red-50 border-red-200' };
+  }
+}
+ 
+export function SecurityStatus() {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const securityStatus = useSecurityStore((s) => s.securityStatus);
+  const securityStatusLoading = useSecurityStore((s) => s.securityStatusLoading);
+  const securityStatusError = useSecurityStore((s) => s.securityStatusError);
+  const loadSecurityStatus = useSecurityStore((s) => s.loadSecurityStatus);
+  const connected = connectionState === 'connected';
+ 
+  useEffect(() => {
+    if (connected) {
+      loadSecurityStatus();
+    }
+  }, [connected]);
+ 
+  if (!connected) {
+    return (
+      <div className="rounded-xl border border-gray-200 bg-white p-4 shadow-sm">
+        <div className="flex items-center gap-2 mb-3">
+          <Shield className="w-4 h-4 text-gray-400" />
+          <span className="text-sm font-semibold text-gray-900">安全状态</span>
+        </div>
+        <p className="text-xs text-gray-400">连接后可用</p>
+      </div>
+    );
+  }
+ 
+  // Loading state
+  if (securityStatusLoading && !securityStatus) {
+    return (
+      <div className="rounded-xl border border-gray-200 bg-white p-4 shadow-sm">
+        <div className="flex items-center gap-2 mb-3">
+          <Loader2 className="w-4 h-4 text-gray-400 animate-spin" />
+          <span className="text-sm font-semibold text-gray-900">安全状态</span>
+        </div>
+        <p className="text-xs text-gray-400">加载中...</p>
+      </div>
+    );
+  }
+ 
+  // API error state - show friendly message
+  if (securityStatusError && !securityStatus) {
+    return (
+      <div className="rounded-xl border border-gray-200 bg-white p-4 shadow-sm">
+        <div className="flex items-center justify-between mb-3">
+          <div className="flex items-center gap-2">
+            <AlertCircle className="w-4 h-4 text-yellow-500" />
+            <span className="text-sm font-semibold text-gray-900">安全状态</span>
+          </div>
+          <button
+            onClick={() => loadSecurityStatus()}
+            className="p-1 text-gray-400 hover:text-orange-500 rounded transition-colors"
+            title="重试"
+          >
+            <RefreshCw className="w-3.5 h-3.5" />
+          </button>
+        </div>
+        <p className="text-xs text-gray-500 mb-2">API 不可用</p>
+        <p className="text-xs text-gray-400">
+          OpenFang 安全状态 API ({'/api/security/status'}) 在当前版本可能未实现
+        </p>
+      </div>
+    );
+  }
+ 
+  // Use default layers if no data, or merge with API data
+  const displayLayers = securityStatus?.layers?.length
+    ? DEFAULT_LAYERS.map((defaultLayer) => {
+        const apiLayer = securityStatus.layers.find((l) => l.name === defaultLayer.name);
+        return apiLayer || defaultLayer;
+      })
+    : DEFAULT_LAYERS;
+ 
+  const enabledCount = displayLayers.filter((l) => l.enabled).length;
+  const totalCount = displayLayers.length;
+  const securityLevel = securityStatus?.securityLevel ||
+    (enabledCount >= 14 ? 'critical' : enabledCount >= 10 ? 'high' : enabledCount >= 6 ? 'medium' : 'low');
+ 
+  const levelLabel = getSecurityLabel(securityLevel);
+ 
+  return (
+    <div className="rounded-xl border border-gray-200 bg-white p-4 shadow-sm">
+      {/* Header */}
+      <div className="flex items-center justify-between mb-3">
+        <div className="flex items-center gap-2">
+          {getSecurityIcon(securityLevel)}
+          <span className="text-sm font-semibold text-gray-900">安全状态</span>
+          {securityStatusLoading && (
+            <Loader2 className="w-3 h-3 text-gray-400 animate-spin" />
+          )}
+        </div>
+        <div className="flex items-center gap-2">
+          <span className={`text-xs px-2 py-0.5 rounded-full border ${levelLabel.color}`}>
+            {levelLabel.text}
+          </span>
+          <button
+            onClick={() => loadSecurityStatus()}
+            className="p-1 text-gray-400 hover:text-orange-500 rounded transition-colors disabled:opacity-50"
+            title="刷新安全状态"
+            disabled={securityStatusLoading}
+          >
+            <RefreshCw className="w-3.5 h-3.5" />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Summary */}
+      <div className="mb-3 text-xs text-gray-500">
+        已启用 {enabledCount} / {totalCount} 层防护
+      </div>
+ 
+      {/* Progress bar */}
+      <div className="mb-4 h-2 bg-gray-100 rounded-full overflow-hidden">
+        <div
+          className={`h-full transition-all duration-300 ${
+            securityLevel === 'critical'
+              ? 'bg-green-500'
+              : securityLevel === 'high'
+              ? 'bg-blue-500'
+              : securityLevel === 'medium'
+              ? 'bg-yellow-500'
+              : 'bg-red-500'
+          }`}
+          style={{ width: `${(enabledCount / totalCount) * 100}%` }}
+        />
+      </div>
+ 
+      {/* Layers Grid */}
+      <div className="grid grid-cols-2 gap-1.5">
+        {displayLayers.map((layer) => {
+          const label = SECURITY_LAYER_NAMES[layer.name] || layer.name;
+          return (
+            <div
+              key={layer.name}
+              className={`flex items-center gap-1.5 px-2 py-1.5 rounded-lg text-xs ${
+                layer.enabled
+                  ? 'bg-green-50 text-green-700'
+                  : 'bg-gray-50 text-gray-400'
+              }`}
+              title={layer.name}
+            >
+              <div
+                className={`w-1.5 h-1.5 rounded-full ${
+                  layer.enabled ? 'bg-green-500' : 'bg-gray-300'
+                }`}
+              />
+              <span className="truncate">{label}</span>
+            </div>
+          );
+        })}
+      </div>
+ 
+      {/* Layer Categories */}
+      <div className="mt-4 pt-3 border-t border-gray-100">
+        <div className="grid grid-cols-3 gap-2 text-xs">
+          <CategorySummary
+            label="网络"
+            layers={displayLayers.filter((l) => l.name.startsWith('network.'))}
+          />
+          <CategorySummary
+            label="认证"
+            layers={displayLayers.filter((l) => l.name.startsWith('auth.'))}
+          />
+          <CategorySummary
+            label="执行"
+            layers={displayLayers.filter((l) => l.name.startsWith('exec.'))}
+          />
+          <CategorySummary
+            label="输入"
+            layers={displayLayers.filter((l) => l.name.startsWith('input.'))}
+          />
+          <CategorySummary
+            label="审计"
+            layers={displayLayers.filter((l) => l.name.startsWith('audit.'))}
+          />
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+function CategorySummary({ label, layers }: { label: string; layers: { enabled: boolean }[] }) {
+  if (layers.length === 0) return null;
+  const enabled = layers.filter((l) => l.enabled).length;
+  const total = layers.length;
+  const allEnabled = enabled === total;
+ 
+  return (
+    <div className="flex flex-col items-center">
+      <span className={`font-medium ${allEnabled ? 'text-green-600' : 'text-gray-500'}`}>
+        {enabled}/{total}
+      </span>
+      <span className="text-gray-400">{label}</span>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/About.tsx.html b/desktop/coverage/src/components/Settings/About.tsx.html new file mode 100644 index 0000000..279f406 --- /dev/null +++ b/desktop/coverage/src/components/Settings/About.tsx.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/components/Settings/About.tsx + + + + + + + + + +
+
+

All files / src/components/Settings About.tsx

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { RefreshCw, Cat } from 'lucide-react';
+ 
+export function About() {
+  return (
+    <div className="max-w-3xl">
+      <div className="flex items-center gap-4 mb-8">
+        <div className="w-16 h-16 bg-black rounded-2xl flex items-center justify-center text-white shadow-md">
+          <Cat className="w-10 h-10" />
+        </div>
+        <div>
+          <h1 className="text-xl font-bold text-gray-900">ZCLAW</h1>
+          <div className="text-sm text-gray-500">版本 0.2.0</div>
+        </div>
+      </div>
+ 
+      <div className="space-y-4">
+        <div className="bg-white rounded-xl border border-gray-200 p-4 flex justify-between items-center shadow-sm">
+          <span className="text-sm text-gray-700">检查更新</span>
+          <button className="text-xs text-white bg-orange-500 hover:bg-orange-600 px-4 py-2 rounded-lg flex items-center gap-1 transition-colors">
+            <RefreshCw className="w-3 h-3" />
+            检查更新
+          </button>
+        </div>
+ 
+        <div className="bg-white rounded-xl border border-gray-200 p-4 flex justify-between items-center shadow-sm">
+          <div>
+            <div className="text-sm text-gray-700 mb-1">更新日志</div>
+            <div className="text-xs text-gray-500">查看当前版本的更新内容</div>
+          </div>
+          <button className="text-xs px-4 py-2 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors">
+            更新日志
+          </button>
+        </div>
+      </div>
+ 
+      <div className="mt-12 text-center text-xs text-gray-400">
+        2026 ZCLAW | Powered by OpenFang
+      </div>
+      <div className="text-center text-xs text-gray-400 space-y-1">
+        <p>基于 OpenFang Rust Agent OS 构建</p>
+        <div className="flex justify-center gap-4 mt-3">
+          <a href="#" className="text-orange-500 hover:text-orange-600">隐私政策</a>
+          <a href="#" className="text-orange-500 hover:text-orange-600">用户协议</a>
+        </div>
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/Credits.tsx.html b/desktop/coverage/src/components/Settings/Credits.tsx.html new file mode 100644 index 0000000..a99dc90 --- /dev/null +++ b/desktop/coverage/src/components/Settings/Credits.tsx.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for src/components/Settings/Credits.tsx + + + + + + + + + +
+
+

All files / src/components/Settings Credits.tsx

+
+ +
+ 0% + Statements + 0/56 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState } from 'react';
+ 
+export function Credits() {
+  const [filter, setFilter] = useState<'all' | 'consume' | 'earn'>('all');
+ 
+  const logs = [
+    { id: 1, action: 'AutoClaw网页搜索', date: '2026年03月11日 12:02:02', amount: -6 },
+    { id: 2, action: 'AutoClaw网页搜索', date: '2026年03月11日 12:01:58', amount: -6 },
+    { id: 3, action: 'AutoClaw网页搜索', date: '2026年03月11日 12:01:46', amount: -6 },
+    { id: 4, action: 'AutoClaw网页搜索', date: '2026年03月11日 12:01:43', amount: -6 },
+  ];
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-xl font-bold text-gray-900">积分</h1>
+        <div className="flex gap-2">
+          <button className="text-xs text-gray-500 hover:text-gray-700 px-3 py-1.5 border border-gray-200 rounded-lg transition-colors">
+            刷新
+          </button>
+          <button className="text-xs text-white bg-orange-500 hover:bg-orange-600 px-3 py-1.5 rounded-lg transition-colors">
+            去充值
+          </button>
+        </div>
+      </div>
+ 
+      <div className="text-center mb-8">
+        <div className="text-xs text-gray-500 mb-1">总积分</div>
+        <div className="text-3xl font-bold text-gray-900">2268</div>
+      </div>
+ 
+      <div className="p-1 mb-6 flex rounded-lg bg-gray-50 border border-gray-100 shadow-sm">
+        <button
+          onClick={() => setFilter('all')}
+          className={`flex-1 py-2 rounded-md text-xs transition-colors ${filter === 'all' ? 'bg-white shadow-sm font-medium text-gray-900' : 'text-gray-500 hover:text-gray-700'}`}
+        >
+          全部
+        </button>
+        <button
+          onClick={() => setFilter('consume')}
+          className={`flex-1 py-2 rounded-md text-xs transition-colors ${filter === 'consume' ? 'bg-white shadow-sm font-medium text-gray-900' : 'text-gray-500 hover:text-gray-700'}`}
+        >
+          消耗
+        </button>
+        <button
+          onClick={() => setFilter('earn')}
+          className={`flex-1 py-2 rounded-md text-xs transition-colors ${filter === 'earn' ? 'bg-white shadow-sm font-medium text-gray-900' : 'text-gray-500 hover:text-gray-700'}`}
+        >
+          获得
+        </button>
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 divide-y divide-gray-100 shadow-sm">
+        {logs.map((log) => (
+          <div key={log.id} className="flex justify-between items-center p-4">
+            <div>
+              <div className="text-sm text-gray-700">{log.action}</div>
+              <div className="text-xs text-gray-500 mt-1">{log.date}</div>
+            </div>
+            <div className={`font-medium ${log.amount < 0 ? 'text-gray-500' : 'text-green-500'}`}>
+              {log.amount > 0 ? '+' : ''}{log.amount}
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/General.tsx.html b/desktop/coverage/src/components/Settings/General.tsx.html new file mode 100644 index 0000000..45798e1 --- /dev/null +++ b/desktop/coverage/src/components/Settings/General.tsx.html @@ -0,0 +1,682 @@ + + + + + + Code coverage report for src/components/Settings/General.tsx + + + + + + + + + +
+
+

All files / src/components/Settings General.tsx

+
+ +
+ 0% + Statements + 0/169 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/169 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect } from 'react';
+import { useConnectionStore } from '../../store/connectionStore';
+import { useConfigStore } from '../../store/configStore';
+import { useChatStore } from '../../store/chatStore';
+import { getStoredGatewayToken, setStoredGatewayToken } from '../../lib/gateway-client';
+import { silentErrorHandler } from '../../lib/error-utils';
+ 
+export function General() {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const gatewayVersion = useConnectionStore((s) => s.gatewayVersion);
+  const error = useConnectionStore((s) => s.error);
+  const connect = useConnectionStore((s) => s.connect);
+  const disconnect = useConnectionStore((s) => s.disconnect);
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const saveQuickConfig = useConfigStore((s) => s.saveQuickConfig);
+  const currentModel = useChatStore((s) => s.currentModel);
+  const [theme, setTheme] = useState<'light' | 'dark'>(quickConfig.theme || 'light');
+  const [autoStart, setAutoStart] = useState(quickConfig.autoStart ?? false);
+  const [showToolCalls, setShowToolCalls] = useState(quickConfig.showToolCalls ?? false);
+  const [gatewayToken, setGatewayToken] = useState(getStoredGatewayToken());
+  const [isSaving, setIsSaving] = useState(false);
+ 
+  const connected = connectionState === 'connected';
+  const connecting = connectionState === 'connecting' || connectionState === 'reconnecting';
+ 
+  // 同步主题设置
+  useEffect(() => {
+    if (quickConfig.theme) {
+      setTheme(quickConfig.theme);
+    }
+    if (quickConfig.autoStart !== undefined) {
+      setAutoStart(quickConfig.autoStart);
+    }
+    if (quickConfig.showToolCalls !== undefined) {
+      setShowToolCalls(quickConfig.showToolCalls);
+    }
+  }, [quickConfig.theme, quickConfig.autoStart, quickConfig.showToolCalls]);
+ 
+  // 应用主题到文档
+  useEffect(() => {
+    if (theme === 'dark') {
+      document.documentElement.classList.add('dark');
+    } else {
+      document.documentElement.classList.remove('dark');
+    }
+  }, [theme]);
+ 
+  const handleThemeChange = async (newTheme: 'light' | 'dark') => {
+    setTheme(newTheme);
+    setIsSaving(true);
+    try {
+      await saveQuickConfig({ theme: newTheme });
+    } finally {
+      setIsSaving(false);
+    }
+  };
+ 
+  const handleAutoStartChange = async (value: boolean) => {
+    setAutoStart(value);
+    setIsSaving(true);
+    try {
+      await saveQuickConfig({ autoStart: value });
+    } finally {
+      setIsSaving(false);
+    }
+  };
+ 
+  const handleShowToolCallsChange = async (value: boolean) => {
+    setShowToolCalls(value);
+    setIsSaving(true);
+    try {
+      await saveQuickConfig({ showToolCalls: value });
+    } finally {
+      setIsSaving(false);
+    }
+  };
+ 
+  const handleConnect = () => {
+    connect(undefined, gatewayToken || undefined).catch(silentErrorHandler('General'));
+  };
+  const handleDisconnect = () => { disconnect(); };
+ 
+  return (
+    <div>
+      <h1 className="text-2xl font-bold text-gray-900 mb-8">通用设置</h1>
+ 
+      <h2 className="text-sm font-medium text-gray-500 uppercase tracking-wide mb-3">Gateway 连接</h2>
+      <div className="bg-gray-50 rounded-xl p-5 mb-6 space-y-4">
+        <div className="flex justify-between items-center">
+          <span className="text-sm text-gray-700">状态</span>
+          <div className="flex items-center gap-2">
+            <span className={`w-2 h-2 rounded-full ${connected ? 'bg-green-400' : connecting ? 'bg-yellow-400 animate-pulse' : 'bg-gray-300'}`} />
+            <span className={`text-sm font-medium ${connected ? 'text-green-600' : connecting ? 'text-yellow-600' : 'text-gray-400'}`}>
+              {connected ? '已连接' : connecting ? '连接中...' : connectionState === 'handshaking' ? '握手中...' : '未连接'}
+            </span>
+          </div>
+        </div>
+        <div className="flex justify-between items-center">
+          <span className="text-sm text-gray-700">地址</span>
+          <span className="text-sm text-gray-500 font-mono">ws://127.0.0.1:50051</span>
+        </div>
+        <div className="flex justify-between items-center">
+          <span className="text-sm text-gray-700">Token</span>
+          <input
+            type="password"
+            value={gatewayToken}
+            onChange={(e) => {
+              setGatewayToken(e.target.value);
+              setStoredGatewayToken(e.target.value);
+            }}
+            placeholder="可选:Gateway auth token"
+            className="w-72 px-3 py-1.5 border border-gray-200 rounded-lg text-sm bg-white focus:outline-none text-gray-500 font-mono"
+          />
+        </div>
+        {gatewayVersion && (
+          <div className="flex justify-between items-center">
+            <span className="text-sm text-gray-700">版本</span>
+            <span className="text-sm text-gray-500">{gatewayVersion}</span>
+          </div>
+        )}
+        <div className="flex justify-between items-center">
+          <span className="text-sm text-gray-700">当前模型</span>
+          <span className="text-sm text-orange-600 font-medium">{currentModel}</span>
+        </div>
+        {error && (
+          <div className="text-xs text-red-500 bg-red-50 rounded-lg p-2">{error}</div>
+        )}
+        <div className="flex gap-2 pt-1">
+          {connected ? (
+            <button
+              onClick={handleDisconnect}
+              className="text-sm border border-gray-300 rounded-lg px-4 py-1.5 hover:bg-gray-100 text-gray-600"
+            >
+              断开连接
+            </button>
+          ) : (
+            <button
+              onClick={handleConnect}
+              disabled={connecting}
+              className="text-sm bg-orange-500 text-white rounded-lg px-4 py-1.5 hover:bg-orange-600 disabled:opacity-50"
+            >
+              {connecting ? '连接中...' : '连接 Gateway'}
+            </button>
+          )}
+        </div>
+      </div>
+ 
+      <h2 className="text-sm font-medium text-gray-500 uppercase tracking-wide mb-3">外观与行为</h2>
+      <div className="bg-gray-50 rounded-xl p-5 space-y-5">
+        <div className="flex justify-between items-center">
+          <div>
+            <div className="text-sm font-medium text-gray-900">主题模式</div>
+            <div className="text-xs text-gray-500 mt-0.5">选择浅色或深色模式。</div>
+          </div>
+          <div className="flex gap-2">
+            <button
+              onClick={() => handleThemeChange('light')}
+              disabled={isSaving}
+              className={`w-8 h-8 rounded-full border-2 transition-all ${theme === 'light' ? 'border-orange-500 ring-2 ring-orange-200' : 'border-gray-300'} bg-white disabled:opacity-50`}
+            />
+            <button
+              onClick={() => handleThemeChange('dark')}
+              disabled={isSaving}
+              className={`w-8 h-8 rounded-full border-2 transition-all ${theme === 'dark' ? 'border-orange-500 ring-2 ring-orange-200' : 'border-gray-300'} bg-gray-900 disabled:opacity-50`}
+            />
+          </div>
+        </div>
+ 
+        <div className="flex justify-between items-center">
+          <div>
+            <div className="text-sm font-medium text-gray-900">开机自启</div>
+            <div className="text-xs text-gray-500 mt-0.5">登录时自动启动 ZCLAW。</div>
+          </div>
+          <Toggle checked={autoStart} onChange={handleAutoStartChange} disabled={isSaving} />
+        </div>
+ 
+        <div className="flex justify-between items-center">
+          <div>
+            <div className="text-sm font-medium text-gray-900">显示工具调用</div>
+            <div className="text-xs text-gray-500 mt-0.5">在对话消息中显示模型的工具调用详情块。</div>
+          </div>
+          <Toggle checked={showToolCalls} onChange={handleShowToolCallsChange} disabled={isSaving} />
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+function Toggle({ checked, onChange, disabled }: { checked: boolean; onChange: (v: boolean) => void; disabled?: boolean }) {
+  return (
+    <button
+      onClick={() => !disabled && onChange(!checked)}
+      disabled={disabled}
+      className={`w-11 h-6 rounded-full transition-colors relative flex-shrink-0 ${checked ? 'bg-orange-500' : 'bg-gray-300'} ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}
+    >
+      <span className={`block w-5 h-5 bg-white rounded-full shadow absolute top-0.5 transition-all ${checked ? 'left-[22px]' : 'left-0.5'}`} />
+    </button>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/IMChannels.tsx.html b/desktop/coverage/src/components/Settings/IMChannels.tsx.html new file mode 100644 index 0000000..f7d4e98 --- /dev/null +++ b/desktop/coverage/src/components/Settings/IMChannels.tsx.html @@ -0,0 +1,1300 @@ + + + + + + Code coverage report for src/components/Settings/IMChannels.tsx + + + + + + + + + +
+
+

All files / src/components/Settings IMChannels.tsx

+
+ +
+ 0% + Statements + 0/323 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/323 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * IMChannels - IM Channel Management UI
+ *
+ * Displays and manages IM channel configurations.
+ * Supports viewing, configuring, and adding new channels.
+ */
+import { useState, useEffect } from 'react';
+import { Radio, RefreshCw, MessageCircle, Settings2, Plus, X, Check, AlertCircle, ExternalLink } from 'lucide-react';
+import { useConnectionStore } from '../../store/connectionStore';
+import { useConfigStore, type ChannelInfo } from '../../store/configStore';
+import { useAgentStore } from '../../store/agentStore';
+ 
+const CHANNEL_ICONS: Record<string, string> = {
+  feishu: '飞',
+  qqbot: 'QQ',
+  wechat: '微',
+  discord: 'D',
+  slack: 'S',
+  telegram: 'T',
+};
+ 
+const CHANNEL_CONFIG_FIELDS: Record<string, { key: string; label: string; type: string; placeholder: string; required: boolean }[]> = {
+  feishu: [
+    { key: 'appId', label: 'App ID', type: 'text', placeholder: 'cli_xxx', required: true },
+    { key: 'appSecret', label: 'App Secret', type: 'password', placeholder: '••••••••', required: true },
+  ],
+  discord: [
+    { key: 'botToken', label: 'Bot Token', type: 'password', placeholder: 'OTk2NzY4...', required: true },
+    { key: 'guildId', label: 'Guild ID (可选)', type: 'text', placeholder: '123456789', required: false },
+  ],
+  slack: [
+    { key: 'botToken', label: 'Bot Token', type: 'password', placeholder: 'xoxb-...', required: true },
+    { key: 'appToken', label: 'App Token', type: 'password', placeholder: 'xapp-...', required: false },
+  ],
+  telegram: [
+    { key: 'botToken', label: 'Bot Token', type: 'password', placeholder: '123456:ABC...', required: true },
+  ],
+  qqbot: [
+    { key: 'appId', label: 'App ID', type: 'text', placeholder: '1234567890', required: true },
+    { key: 'token', label: 'Token', type: 'password', placeholder: '••••••••', required: true },
+  ],
+  wechat: [
+    { key: 'corpId', label: 'Corp ID', type: 'text', placeholder: 'wwxxx', required: true },
+    { key: 'agentId', label: 'Agent ID', type: 'text', placeholder: '1000001', required: true },
+    { key: 'secret', label: 'Secret', type: 'password', placeholder: '••••••••', required: true },
+  ],
+};
+ 
+const KNOWN_CHANNELS = [
+  { type: 'feishu', label: '飞书 (Feishu/Lark)', description: '企业即时通讯平台' },
+  { type: 'discord', label: 'Discord', description: '游戏社区和语音聊天' },
+  { type: 'slack', label: 'Slack', description: '团队协作平台' },
+  { type: 'telegram', label: 'Telegram', description: '加密即时通讯' },
+  { type: 'qqbot', label: 'QQ 机器人', description: '腾讯QQ官方机器人' },
+  { type: 'wechat', label: '企业微信', description: '企业微信机器人' },
+];
+ 
+interface ChannelConfigModalProps {
+  channel: ChannelInfo | null;
+  channelType: string | null;
+  isOpen: boolean;
+  onClose: () => void;
+  onSave: (config: Record<string, string>) => Promise<void>;
+  isSaving: boolean;
+}
+ 
+function ChannelConfigModal({ channel, channelType, isOpen, onClose, onSave, isSaving }: ChannelConfigModalProps) {
+  const [config, setConfig] = useState<Record<string, string>>({});
+  const [error, setError] = useState<string | null>(null);
+ 
+  const fields = channelType ? CHANNEL_CONFIG_FIELDS[channelType] || [] : [];
+ 
+  useEffect(() => {
+    if (channel?.config) {
+      setConfig(channel.config as Record<string, string>);
+    } else {
+      setConfig({});
+    }
+    setError(null);
+  }, [channel, channelType]);
+ 
+  if (!isOpen || !channelType) return null;
+ 
+  const handleSubmit = async (e: React.FormEvent) => {
+    e.preventDefault();
+    setError(null);
+ 
+    // Validate required fields
+    for (const field of fields) {
+      if (field.required && !config[field.key]?.trim()) {
+        setError(`请填写 ${field.label}`);
+        return;
+      }
+    }
+ 
+    try {
+      await onSave(config);
+      onClose();
+    } catch (err) {
+      setError(err instanceof Error ? err.message : '保存失败');
+    }
+  };
+ 
+  const channelInfo = KNOWN_CHANNELS.find(c => c.type === channelType);
+ 
+  return (
+    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
+      <div className="bg-white dark:bg-gray-800 rounded-xl shadow-xl w-full max-w-md mx-4">
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+          <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
+            {channel ? `配置 ${channel.label}` : `添加 ${channelInfo?.label || channelType}`}
+          </h3>
+          <button
+            onClick={onClose}
+            className="p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded"
+          >
+            <X className="w-5 h-5 text-gray-500" />
+          </button>
+        </div>
+ 
+        <form onSubmit={handleSubmit} className="p-4 space-y-4">
+          {channelInfo && (
+            <p className="text-sm text-gray-500 dark:text-gray-400">
+              {channelInfo.description}
+            </p>
+          )}
+ 
+          {fields.length === 0 ? (
+            <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+              <AlertCircle className="w-8 h-8 mx-auto mb-2 opacity-50" />
+              <p>该通道类型暂不支持通过 UI 配置</p>
+              <p className="text-xs mt-1">请通过配置文件或 CLI 进行配置</p>
+            </div>
+          ) : (
+            fields.map((field) => (
+              <div key={field.key}>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  {field.label}
+                  {field.required && <span className="text-red-500 ml-1">*</span>}
+                </label>
+                <input
+                  type={field.type}
+                  value={config[field.key] || ''}
+                  onChange={(e) => setConfig({ ...config, [field.key]: e.target.value })}
+                  placeholder={field.placeholder}
+                  className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent"
+                />
+              </div>
+            ))
+          )}
+ 
+          {error && (
+            <div className="p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-sm text-red-600 dark:text-red-400">
+              {error}
+            </div>
+          )}
+ 
+          {fields.length > 0 && (
+            <div className="flex gap-3 pt-2">
+              <button
+                type="button"
+                onClick={onClose}
+                className="flex-1 px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700"
+              >
+                取消
+              </button>
+              <button
+                type="submit"
+                disabled={isSaving}
+                className="flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 flex items-center justify-center gap-2"
+              >
+                {isSaving ? (
+                  <>
+                    <RefreshCw className="w-4 h-4 animate-spin" />
+                    保存中...
+                  </>
+                ) : (
+                  <>
+                    <Check className="w-4 h-4" />
+                    保存
+                  </>
+                )}
+              </button>
+            </div>
+          )}
+        </form>
+      </div>
+    </div>
+  );
+}
+ 
+export function IMChannels() {
+  const channels = useConfigStore((s) => s.channels);
+  const loadChannels = useConfigStore((s) => s.loadChannels);
+  const createChannel = useConfigStore((s) => s.createChannel);
+  const updateChannel = useConfigStore((s) => s.updateChannel);
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const loadPluginStatus = useAgentStore((s) => s.loadPluginStatus);
+ 
+  const [isModalOpen, setIsModalOpen] = useState(false);
+  const [selectedChannel, setSelectedChannel] = useState<ChannelInfo | null>(null);
+  const [newChannelType, setNewChannelType] = useState<string | null>(null);
+  const [isSaving, setIsSaving] = useState(false);
+  const [showAddMenu, setShowAddMenu] = useState(false);
+ 
+  const connected = connectionState === 'connected';
+  const loading = connectionState === 'connecting' || connectionState === 'reconnecting' || connectionState === 'handshaking';
+ 
+  useEffect(() => {
+    if (connected) {
+      loadPluginStatus().then(() => loadChannels());
+    }
+  }, [connected]);
+ 
+  const handleRefresh = () => {
+    loadPluginStatus().then(() => loadChannels());
+  };
+ 
+  const handleConfigure = (channel: ChannelInfo) => {
+    setSelectedChannel(channel);
+    setNewChannelType(channel.type);
+    setIsModalOpen(true);
+  };
+ 
+  const handleAddChannel = (type: string) => {
+    setSelectedChannel(null);
+    setNewChannelType(type);
+    setIsModalOpen(true);
+    setShowAddMenu(false);
+  };
+ 
+  const handleSaveConfig = async (config: Record<string, string>) => {
+    setIsSaving(true);
+    try {
+      if (selectedChannel) {
+        await updateChannel(selectedChannel.id, { config });
+      } else if (newChannelType) {
+        const channelInfo = KNOWN_CHANNELS.find(c => c.type === newChannelType);
+        await createChannel({
+          type: newChannelType,
+          name: channelInfo?.label || newChannelType,
+          config,
+          enabled: true,
+        });
+      }
+      await loadChannels();
+    } finally {
+      setIsSaving(false);
+    }
+  };
+ 
+  const availableChannels = KNOWN_CHANNELS.filter(
+    (channel) => !channels.some((item) => item.type === channel.type)
+  );
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-xl font-bold text-gray-900 dark:text-white">IM 频道</h1>
+        <div className="flex gap-2">
+          <span className="text-xs text-gray-400 flex items-center">
+            {connected ? `${channels.length} 个已识别频道` : loading ? '连接中...' : '未连接 Gateway'}
+          </span>
+          <button
+            onClick={handleRefresh}
+            disabled={!connected}
+            className="text-xs text-white bg-orange-500 hover:bg-orange-600 px-3 py-1.5 rounded-lg flex items-center gap-1 transition-colors disabled:opacity-50"
+          >
+            <RefreshCw className="w-3 h-3" /> 刷新
+          </button>
+        </div>
+      </div>
+ 
+      {!connected ? (
+        <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 h-64 flex flex-col items-center justify-center mb-6 shadow-sm text-gray-400">
+          <Radio className="w-8 h-8 mb-3 opacity-40" />
+          <span className="text-sm">连接 Gateway 后查看真实 IM 频道状态</span>
+        </div>
+      ) : (
+        <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 mb-6 shadow-sm divide-y divide-gray-100 dark:divide-gray-700">
+          {channels.length > 0 ? channels.map((channel) => (
+            <div key={channel.id} className="p-4 flex items-center gap-4">
+              <div className={`w-10 h-10 rounded-xl flex items-center justify-center text-white text-sm font-semibold ${
+                channel.status === 'active'
+                  ? 'bg-gradient-to-br from-blue-500 to-indigo-500'
+                  : channel.status === 'error'
+                    ? 'bg-gradient-to-br from-red-500 to-rose-500'
+                    : 'bg-gray-300 dark:bg-gray-600'
+              }`}>
+                {CHANNEL_ICONS[channel.type] || <MessageCircle className="w-4 h-4" />}
+              </div>
+              <div className="flex-1 min-w-0">
+                <div className="text-sm font-medium text-gray-900 dark:text-white">{channel.label}</div>
+                <div className={`text-xs mt-1 ${
+                  channel.status === 'active'
+                    ? 'text-green-600 dark:text-green-400'
+                    : channel.status === 'error'
+                      ? 'text-red-500 dark:text-red-400'
+                      : 'text-gray-400'
+                }`}>
+                  {channel.status === 'active' ? '已连接' : channel.status === 'error' ? channel.error || '错误' : '未配置'}
+                  {channel.accounts !== undefined && channel.accounts > 0 ? ` · ${channel.accounts} 个账号` : ''}
+                </div>
+              </div>
+              <button
+                onClick={() => handleConfigure(channel)}
+                className="p-2 text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors"
+                title="配置"
+              >
+                <Settings2 className="w-4 h-4" />
+              </button>
+            </div>
+          )) : (
+            <div className="h-40 flex items-center justify-center text-sm text-gray-400">
+              尚未识别到可用频道
+            </div>
+          )}
+        </div>
+      )}
+ 
+      {/* Add Channel Section */}
+      {connected && availableChannels.length > 0 && (
+        <div className="mb-6">
+          <div className="flex items-center justify-between mb-3">
+            <div className="text-xs text-gray-500 dark:text-gray-400">添加新频道</div>
+            <div className="relative">
+              <button
+                onClick={() => setShowAddMenu(!showAddMenu)}
+                className="text-xs text-white bg-blue-500 hover:bg-blue-600 px-3 py-1.5 rounded-lg flex items-center gap-1 transition-colors"
+              >
+                <Plus className="w-3 h-3" /> 添加频道
+              </button>
+              {showAddMenu && (
+                <div className="absolute right-0 mt-1 w-48 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 z-10">
+                  {availableChannels.map((channel) => (
+                    <button
+                      key={channel.type}
+                      onClick={() => handleAddChannel(channel.type)}
+                      className="w-full px-4 py-2 text-left text-sm hover:bg-gray-100 dark:hover:bg-gray-700 first:rounded-t-lg last:rounded-b-lg flex items-center gap-2"
+                    >
+                      <span className="w-6 h-6 rounded bg-gray-100 dark:bg-gray-700 flex items-center justify-center text-xs">
+                        {CHANNEL_ICONS[channel.type] || '?'}
+                      </span>
+                      <div>
+                        <div className="font-medium text-gray-900 dark:text-white">{channel.label}</div>
+                        <div className="text-xs text-gray-500">{channel.description}</div>
+                      </div>
+                    </button>
+                  ))}
+                </div>
+              )}
+            </div>
+          </div>
+        </div>
+      )}
+ 
+      {/* Planned Channels */}
+      <div>
+        <div className="text-xs text-gray-500 dark:text-gray-400 mb-3">规划中的接入渠道</div>
+        <div className="flex flex-wrap gap-3">
+          {availableChannels.map((channel) => (
+            <span
+              key={channel.type}
+              className="text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-700 px-4 py-2 rounded-lg"
+            >
+              {channel.label}
+            </span>
+          ))}
+          {availableChannels.length === 0 && (
+            <div className="text-xs text-green-600 dark:text-green-400 flex items-center gap-1">
+              <Check className="w-3 h-3" />
+              所有支持的渠道已配置
+            </div>
+          )}
+        </div>
+      </div>
+ 
+      {/* External Link Notice */}
+      <div className="mt-6 p-4 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800">
+        <div className="flex items-start gap-2">
+          <ExternalLink className="w-4 h-4 text-blue-500 mt-0.5" />
+          <div className="text-xs text-blue-700 dark:text-blue-300">
+            <p className="font-medium mb-1">高级配置</p>
+            <p>账号绑定、消息路由等高级功能需要在 Gateway 配置文件中完成。</p>
+            <p className="mt-1">配置文件路径: <code className="bg-blue-100 dark:bg-blue-800 px-1 rounded">~/.openfang/openfang.toml</code></p>
+          </div>
+        </div>
+      </div>
+ 
+      {/* Config Modal */}
+      <ChannelConfigModal
+        channel={selectedChannel}
+        channelType={newChannelType}
+        isOpen={isModalOpen}
+        onClose={() => {
+          setIsModalOpen(false);
+          setSelectedChannel(null);
+          setNewChannelType(null);
+        }}
+        onSave={handleSaveConfig}
+        isSaving={isSaving}
+      />
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/MCPServices.tsx.html b/desktop/coverage/src/components/Settings/MCPServices.tsx.html new file mode 100644 index 0000000..1f3e2db --- /dev/null +++ b/desktop/coverage/src/components/Settings/MCPServices.tsx.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for src/components/Settings/MCPServices.tsx + + + + + + + + + +
+
+

All files / src/components/Settings MCPServices.tsx

+
+ +
+ 0% + Statements + 0/50 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { FileText, Globe } from 'lucide-react';
+import { useConfigStore } from '../../store/configStore';
+import { silentErrorHandler } from '../../lib/error-utils';
+ 
+export function MCPServices() {
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const saveQuickConfig = useConfigStore((s) => s.saveQuickConfig);
+ 
+  const services = quickConfig.mcpServices || [];
+ 
+  const toggleService = async (id: string) => {
+    const nextServices = services.map((service) =>
+      service.id === id ? { ...service, enabled: !service.enabled } : service
+    );
+    await saveQuickConfig({ mcpServices: nextServices });
+  };
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-4">
+        <h1 className="text-xl font-bold text-gray-900">MCP 服务</h1>
+        <span className="text-xs text-gray-400">{services.length} 个已声明服务</span>
+      </div>
+      <div className="text-xs text-gray-500 mb-6">
+        MCP(模型上下文协议)服务为 Agent 扩展外部工具 — 文件系统、数据库、网页搜索等。
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 divide-y divide-gray-100 shadow-sm mb-6">
+        {services.length > 0 ? services.map((svc) => (
+          <div key={svc.id} className="flex justify-between items-center p-4">
+            <div className="flex items-center gap-3">
+              {svc.id === 'filesystem'
+                ? <FileText className="w-4 h-4 text-gray-500" />
+                : <Globe className="w-4 h-4 text-gray-500" />}
+              <div>
+                <div className="text-sm text-gray-900">{svc.name}</div>
+                <div className="text-xs text-gray-400 mt-1">{svc.id}</div>
+              </div>
+            </div>
+            <div className="flex gap-2 items-center">
+              <span className={`text-xs px-2 py-1 rounded-full ${svc.enabled ? 'bg-green-50 text-green-600' : 'bg-gray-100 text-gray-500'}`}>
+                {svc.enabled ? '已启用' : '已停用'}
+              </span>
+              <button
+                onClick={() => { toggleService(svc.id).catch(silentErrorHandler('MCPServices')); }}
+                className="text-xs px-3 py-1.5 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors"
+              >
+                {svc.enabled ? '停用' : '启用'}
+              </button>
+            </div>
+          </div>
+        )) : (
+          <div className="p-8 text-center text-sm text-gray-400">
+            当前快速配置中尚未声明 MCP 服务
+          </div>
+        )}
+      </div>
+ 
+      <div className="text-xs text-amber-700 bg-amber-50 rounded-lg p-3">
+        当前页面只支持查看和启停已保存在快速配置中的 MCP 服务;新增服务、删除服务和详细参数配置尚未在桌面端接入。
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/ModelsAPI.tsx.html b/desktop/coverage/src/components/Settings/ModelsAPI.tsx.html new file mode 100644 index 0000000..0ab479e --- /dev/null +++ b/desktop/coverage/src/components/Settings/ModelsAPI.tsx.html @@ -0,0 +1,1414 @@ + + + + + + Code coverage report for src/components/Settings/ModelsAPI.tsx + + + + + + + + + +
+
+

All files / src/components/Settings ModelsAPI.tsx

+
+ +
+ 0% + Statements + 0/332 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/332 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect } from 'react';
+import { getStoredGatewayToken, getStoredGatewayUrl } from '../../lib/gateway-client';
+import { useConnectionStore } from '../../store/connectionStore';
+import { useConfigStore } from '../../store/configStore';
+import { useChatStore } from '../../store/chatStore';
+import { silentErrorHandler } from '../../lib/error-utils';
+import { Plus, Pencil, Trash2, Star, Eye, EyeOff, AlertCircle, X } from 'lucide-react';
+ 
+// 自定义模型数据结构
+interface CustomModel {
+  id: string;
+  name: string;
+  provider: string;
+  apiKey?: string;
+  apiProtocol: 'openai' | 'anthropic' | 'custom';
+  baseUrl?: string;
+  isDefault?: boolean;
+  createdAt: string;
+}
+ 
+// 可用的 Provider 列表
+// 注意: Coding Plan 是专为编程助手设计的优惠套餐,使用专用端点
+const AVAILABLE_PROVIDERS = [
+  // === Coding Plan 专用端点 (推荐用于编程场景) ===
+  { id: 'kimi-coding', name: 'Kimi Coding Plan', baseUrl: 'https://api.kimi.com/coding/v1' },
+  { id: 'qwen-coding', name: '百炼 Coding Plan', baseUrl: 'https://coding.dashscope.aliyuncs.com/v1' },
+  { id: 'zhipu-coding', name: '智谱 GLM Coding Plan', baseUrl: 'https://open.bigmodel.cn/api/coding/paas/v4' },
+  // === 标准 API 端点 ===
+  { id: 'kimi', name: 'Kimi (标准 API)', baseUrl: 'https://api.moonshot.cn/v1' },
+  { id: 'zhipu', name: '智谱 (标准 API)', baseUrl: 'https://open.bigmodel.cn/api/paas/v4' },
+  { id: 'qwen', name: '百炼/通义千问 (标准)', baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1' },
+  { id: 'deepseek', name: 'DeepSeek', baseUrl: 'https://api.deepseek.com/v1' },
+  { id: 'openai', name: 'OpenAI', baseUrl: 'https://api.openai.com/v1' },
+  { id: 'anthropic', name: 'Anthropic', baseUrl: 'https://api.anthropic.com' },
+  { id: 'custom', name: '自定义', baseUrl: '' },
+];
+ 
+const STORAGE_KEY = 'zclaw-custom-models';
+ 
+// 从 localStorage 加载自定义模型
+function loadCustomModels(): CustomModel[] {
+  try {
+    const stored = localStorage.getItem(STORAGE_KEY);
+    if (stored) {
+      return JSON.parse(stored);
+    }
+  } catch {
+    // ignore
+  }
+  return [];
+}
+ 
+// 保存自定义模型到 localStorage
+function saveCustomModels(models: CustomModel[]): void {
+  try {
+    localStorage.setItem(STORAGE_KEY, JSON.stringify(models));
+  } catch {
+    // ignore
+  }
+}
+ 
+export function ModelsAPI() {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const connect = useConnectionStore((s) => s.connect);
+  const disconnect = useConnectionStore((s) => s.disconnect);
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const loadModels = useConfigStore((s) => s.loadModels);
+  const { currentModel, setCurrentModel } = useChatStore();
+  const [gatewayUrl, setGatewayUrl] = useState(getStoredGatewayUrl());
+  const [gatewayToken, setGatewayToken] = useState(quickConfig.gatewayToken || getStoredGatewayToken());
+ 
+  // 自定义模型状态
+  const [customModels, setCustomModels] = useState<CustomModel[]>([]);
+  const [showAddModal, setShowAddModal] = useState(false);
+  const [editingModel, setEditingModel] = useState<CustomModel | null>(null);
+  const [showApiKey, setShowApiKey] = useState(false);
+ 
+  // 表单状态
+  const [formData, setFormData] = useState({
+    provider: 'zhipu',
+    modelId: 'glm-4-flash',
+    displayName: '',
+    apiKey: '',
+    apiProtocol: 'openai' as 'openai' | 'anthropic' | 'custom',
+    baseUrl: '',
+  });
+ 
+  const connected = connectionState === 'connected';
+  const connecting = connectionState === 'connecting' || connectionState === 'reconnecting';
+ 
+  // 加载自定义模型
+  useEffect(() => {
+    setCustomModels(loadCustomModels());
+  }, []);
+ 
+  useEffect(() => {
+    setGatewayUrl(quickConfig.gatewayUrl || getStoredGatewayUrl());
+    setGatewayToken(quickConfig.gatewayToken || getStoredGatewayToken());
+  }, [quickConfig.gatewayToken, quickConfig.gatewayUrl]);
+ 
+  const handleReconnect = () => {
+    disconnect();
+    setTimeout(() => connect(
+      gatewayUrl || quickConfig.gatewayUrl || 'ws://127.0.0.1:50051/ws',
+      gatewayToken || quickConfig.gatewayToken || getStoredGatewayToken()
+    ).catch(silentErrorHandler('ModelsAPI')), 500);
+  };
+ 
+  // 打开添加模型弹窗
+  const handleOpenAddModal = () => {
+    setFormData({
+      provider: 'zhipu',
+      modelId: '',
+      displayName: '',
+      apiKey: '',
+      apiProtocol: 'openai',
+      baseUrl: AVAILABLE_PROVIDERS[0].baseUrl,
+    });
+    setEditingModel(null);
+    setShowAddModal(true);
+  };
+ 
+  // 打开编辑模型弹窗
+  const handleOpenEditModal = (model: CustomModel) => {
+    setFormData({
+      provider: model.provider,
+      modelId: model.id,
+      displayName: model.name,
+      apiKey: model.apiKey || '',
+      apiProtocol: model.apiProtocol,
+      baseUrl: model.baseUrl || '',
+    });
+    setEditingModel(model);
+    setShowAddModal(true);
+  };
+ 
+  // 保存模型
+  const handleSaveModel = () => {
+    if (!formData.modelId.trim()) return;
+ 
+    const newModel: CustomModel = {
+      id: formData.modelId.trim(),
+      name: formData.displayName.trim() || formData.modelId.trim(),
+      provider: formData.provider,
+      apiKey: formData.apiKey.trim(),
+      apiProtocol: formData.apiProtocol,
+      baseUrl: formData.baseUrl.trim() || AVAILABLE_PROVIDERS.find(p => p.id === formData.provider)?.baseUrl,
+      createdAt: editingModel?.createdAt || new Date().toISOString(),
+    };
+ 
+    let updatedModels: CustomModel[];
+    if (editingModel) {
+      // 编辑模式
+      updatedModels = customModels.map(m => m.id === editingModel.id ? newModel : m);
+    } else {
+      // 添加模式
+      updatedModels = [...customModels, newModel];
+    }
+ 
+    setCustomModels(updatedModels);
+    saveCustomModels(updatedModels);
+    setShowAddModal(false);
+    setEditingModel(null);
+ 
+    // 刷新模型列表
+    loadModels();
+  };
+ 
+  // 删除模型
+  const handleDeleteModel = (modelId: string) => {
+    const updatedModels = customModels.filter(m => m.id !== modelId);
+    setCustomModels(updatedModels);
+    saveCustomModels(updatedModels);
+  };
+ 
+  // 设为默认模型
+  const handleSetDefault = (modelId: string) => {
+    setCurrentModel(modelId);
+    // 更新自定义模型的默认状态
+    const updatedModels = customModels.map(m => ({
+      ...m,
+      isDefault: m.id === modelId,
+    }));
+    setCustomModels(updatedModels);
+    saveCustomModels(updatedModels);
+  };
+ 
+  // Provider 变更时更新 baseUrl
+  const handleProviderChange = (providerId: string) => {
+    const provider = AVAILABLE_PROVIDERS.find(p => p.id === providerId);
+    setFormData({
+      ...formData,
+      provider: providerId,
+      baseUrl: provider?.baseUrl || '',
+    });
+  };
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-xl font-bold text-gray-900 dark:text-white">模型与 API</h1>
+        <button
+          onClick={handleReconnect}
+          disabled={connecting}
+          className="text-xs text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 px-3 py-1.5 border border-gray-200 dark:border-gray-700 rounded-lg transition-colors disabled:opacity-50"
+        >
+          {connecting ? '连接中...' : '重新连接'}
+        </button>
+      </div>
+ 
+      {/* Gateway 连接状态 */}
+      <div className="mb-6">
+        <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 mb-3 uppercase tracking-wider">Gateway 连接</h3>
+        <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-4 shadow-sm space-y-3">
+          <div className="flex items-center justify-between">
+            <span className="text-sm text-gray-500 dark:text-gray-400">连接状态</span>
+            <span className={`text-sm ${connected ? 'text-green-600' : connecting ? 'text-yellow-600' : 'text-gray-400'}`}>
+              {connected ? '已连接' : connecting ? '连接中...' : '未连接'}
+            </span>
+          </div>
+          <div className="flex items-center justify-between">
+            <span className="text-sm text-gray-500 dark:text-gray-400">当前模型</span>
+            <span className="text-sm font-medium text-orange-600">{currentModel || '未选择'}</span>
+          </div>
+        </div>
+      </div>
+ 
+      {/* 内置模型 */}
+      <div className="mb-6">
+        <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 mb-3 uppercase tracking-wider">内置模型</h3>
+        <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-4 shadow-sm">
+          <div className="flex items-center justify-between">
+            <span className="text-sm text-gray-700 dark:text-gray-300">ZCLAW 默认模型</span>
+            <span className="text-xs text-gray-400">由 Gateway 配置决定</span>
+          </div>
+        </div>
+      </div>
+ 
+      {/* 自定义模型 */}
+      <div className="mb-6">
+        <div className="flex justify-between items-center mb-3">
+          <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">自定义模型</h3>
+          <button
+            onClick={handleOpenAddModal}
+            className="text-xs text-orange-600 hover:text-orange-700 flex items-center gap-1"
+          >
+            <Plus className="w-3 h-3" />
+            添加自定义模型
+          </button>
+        </div>
+ 
+        {customModels.length === 0 ? (
+          <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-6 shadow-sm text-center">
+            <p className="text-sm text-gray-500 dark:text-gray-400">暂无自定义模型</p>
+            <p className="text-xs text-gray-400 dark:text-gray-500 mt-1">点击上方按钮添加你的第一个自定义模型</p>
+          </div>
+        ) : (
+          <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl divide-y divide-gray-100 dark:divide-gray-700 shadow-sm">
+            {customModels.map((model) => (
+              <div
+                key={model.id}
+                className={`flex justify-between items-center p-4 ${currentModel === model.id ? 'bg-orange-50/50 dark:bg-orange-900/10' : ''}`}
+              >
+                <div className="flex-1 min-w-0">
+                  <div className="flex items-center gap-2">
+                    <span className="text-sm font-medium text-gray-700 dark:text-gray-300">{model.name}</span>
+                    {currentModel === model.id && (
+                      <span className="px-1.5 py-0.5 text-xs bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400 rounded">当前</span>
+                    )}
+                  </div>
+                  <div className="text-xs text-gray-400 dark:text-gray-500 mt-0.5">
+                    {AVAILABLE_PROVIDERS.find(p => p.id === model.provider)?.name || model.provider}
+                    {model.apiKey ? ' · 已配置 API Key' : ' · 未配置 API Key'}
+                  </div>
+                </div>
+                <div className="flex items-center gap-2 text-xs">
+                  {currentModel !== model.id && (
+                    <button
+                      onClick={() => handleSetDefault(model.id)}
+                      className="text-orange-600 hover:underline flex items-center gap-1"
+                    >
+                      <Star className="w-3 h-3" />
+                      设为默认
+                    </button>
+                  )}
+                  <button
+                    onClick={() => handleOpenEditModal(model)}
+                    className="text-gray-500 dark:text-gray-400 hover:underline flex items-center gap-1"
+                  >
+                    <Pencil className="w-3 h-3" />
+                    编辑
+                  </button>
+                  <button
+                    onClick={() => handleDeleteModel(model.id)}
+                    className="text-red-500 hover:underline flex items-center gap-1"
+                  >
+                    <Trash2 className="w-3 h-3" />
+                    删除
+                  </button>
+                </div>
+              </div>
+            ))}
+          </div>
+        )}
+      </div>
+ 
+      {/* 添加/编辑模型弹窗 */}
+      {showAddModal && (
+        <div className="fixed inset-0 z-50 flex items-center justify-center p-4">
+          <div className="absolute inset-0 bg-black/50" onClick={() => setShowAddModal(false)} />
+          <div className="relative bg-white dark:bg-gray-800 rounded-2xl shadow-2xl w-full max-w-md max-h-[90vh] overflow-y-auto">
+            {/* 弹窗头部 */}
+            <div className="sticky top-0 bg-white dark:bg-gray-800 border-b border-gray-100 dark:border-gray-700 p-6 flex justify-between items-center z-10">
+              <h3 className="text-lg font-bold text-gray-900 dark:text-white">
+                {editingModel ? '编辑模型' : '添加模型'}
+              </h3>
+              <button
+                onClick={() => setShowAddModal(false)}
+                className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200"
+              >
+                <X className="w-5 h-5" />
+              </button>
+            </div>
+ 
+            {/* 弹窗内容 */}
+            <div className="p-6 space-y-4">
+              {/* 警告提示 */}
+              <div className="bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-100 dark:border-yellow-800 rounded-lg p-3 text-xs text-yellow-800 dark:text-yellow-200 flex items-start gap-2">
+                <AlertCircle className="w-4 h-4 flex-shrink-0 mt-0.5" />
+                <span>添加外部模型即表示你理解并同意自行承担使用风险。</span>
+              </div>
+ 
+              {/* 服务商 */}
+              <div>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">* 服务商</label>
+                <select
+                  value={formData.provider}
+                  onChange={(e) => handleProviderChange(e.target.value)}
+                  className="w-full px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-orange-500"
+                >
+                  {AVAILABLE_PROVIDERS.map((p) => (
+                    <option key={p.id} value={p.id}>{p.name}</option>
+                  ))}
+                </select>
+              </div>
+ 
+              {/* 模型 ID */}
+              <div>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">* 模型 ID</label>
+                <input
+                  type="text"
+                  value={formData.modelId}
+                  onChange={(e) => setFormData({ ...formData, modelId: e.target.value })}
+                  placeholder="如:glm-4-flash, glm-4-plus, glm-4.5"
+                  className="w-full px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-500"
+                />
+                <p className="text-xs text-gray-400 mt-1">
+                  智谱: glm-4-flash(免费), glm-4-plus, glm-4.5, glm-4.6
+                </p>
+              </div>
+ 
+              {/* 显示名称 */}
+              <div>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">显示名称</label>
+                <input
+                  type="text"
+                  value={formData.displayName}
+                  onChange={(e) => setFormData({ ...formData, displayName: e.target.value })}
+                  placeholder="如:GLM-4-Plus"
+                  className="w-full px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-500"
+                />
+              </div>
+ 
+              {/* API Key */}
+              <div>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">API Key</label>
+                <div className="relative">
+                  <input
+                    type={showApiKey ? 'text' : 'password'}
+                    value={formData.apiKey}
+                    onChange={(e) => setFormData({ ...formData, apiKey: e.target.value })}
+                    placeholder="请填写 API Key"
+                    className="w-full px-3 py-2 pr-10 border border-gray-200 dark:border-gray-600 rounded-lg text-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-500"
+                  />
+                  <button
+                    type="button"
+                    onClick={() => setShowApiKey(!showApiKey)}
+                    className="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600"
+                  >
+                    {showApiKey ? <EyeOff className="w-4 h-4" /> : <Eye className="w-4 h-4" />}
+                  </button>
+                </div>
+              </div>
+ 
+              {/* API 协议 */}
+              <div>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">API 协议</label>
+                <select
+                  value={formData.apiProtocol}
+                  onChange={(e) => setFormData({ ...formData, apiProtocol: e.target.value as 'openai' | 'anthropic' | 'custom' })}
+                  className="w-full px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-orange-500"
+                >
+                  <option value="openai">OpenAI</option>
+                  <option value="anthropic">Anthropic</option>
+                  <option value="custom">自定义</option>
+                </select>
+              </div>
+ 
+              {/* Base URL */}
+              <div>
+                <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Base URL</label>
+                <input
+                  type="text"
+                  value={formData.baseUrl}
+                  onChange={(e) => setFormData({ ...formData, baseUrl: e.target.value })}
+                  placeholder="https://api.example.com/v1"
+                  className="w-full px-3 py-2 border border-gray-200 dark:border-gray-600 rounded-lg text-sm bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-500"
+                />
+              </div>
+            </div>
+ 
+            {/* 弹窗底部 */}
+            <div className="sticky bottom-0 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700 p-6 flex justify-end gap-3">
+              <button
+                onClick={() => setShowAddModal(false)}
+                className="px-4 py-2 text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg text-sm"
+              >
+                取消
+              </button>
+              <button
+                onClick={handleSaveModel}
+                disabled={!formData.modelId.trim()}
+                className="px-4 py-2 bg-orange-500 text-white rounded-lg text-sm hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed"
+              >
+                {editingModel ? '保存' : '添加'}
+              </button>
+            </div>
+          </div>
+        </div>
+      )}
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/Privacy.tsx.html b/desktop/coverage/src/components/Settings/Privacy.tsx.html new file mode 100644 index 0000000..d3c1754 --- /dev/null +++ b/desktop/coverage/src/components/Settings/Privacy.tsx.html @@ -0,0 +1,340 @@ + + + + + + Code coverage report for src/components/Settings/Privacy.tsx + + + + + + + + + +
+
+

All files / src/components/Settings Privacy.tsx

+
+ +
+ 0% + Statements + 0/67 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect } from 'react';
+import { ExternalLink } from 'lucide-react';
+import { useConfigStore } from '../../store/configStore';
+import { silentErrorHandler } from '../../lib/error-utils';
+ 
+export function Privacy() {
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const workspaceInfo = useConfigStore((s) => s.workspaceInfo);
+  const loadWorkspaceInfo = useConfigStore((s) => s.loadWorkspaceInfo);
+  const saveQuickConfig = useConfigStore((s) => s.saveQuickConfig);
+ 
+  useEffect(() => {
+    loadWorkspaceInfo().catch(silentErrorHandler('Privacy'));
+  }, []);
+ 
+  const optIn = quickConfig.privacyOptIn ?? false;
+ 
+  return (
+    <div className="max-w-3xl">
+      <h1 className="text-xl font-bold mb-2 text-gray-900">数据与隐私</h1>
+      <div className="text-xs text-gray-500 mb-6">查看数据存储位置与 ZCLAW 的网络出站范围。</div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 p-6 mb-6 shadow-sm">
+        <h3 className="font-medium mb-2 text-gray-900">本地数据路径</h3>
+        <div className="text-xs text-gray-500 mb-3">所有工作区文件、对话记录和 Agent 输出均存储在此本地目录。</div>
+        <div className="p-3 bg-gray-50 border border-gray-200 rounded-lg text-xs text-gray-600 font-mono">
+          {workspaceInfo?.resolvedPath || workspaceInfo?.path || quickConfig.workspaceDir || '~/.openfang/zclaw-workspace'}
+        </div>
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 p-6 mb-6 shadow-sm">
+        <div className="flex justify-between items-start mb-4">
+          <h3 className="font-medium text-gray-900">优化计划</h3>
+          <Toggle checked={optIn} onChange={(value) => { saveQuickConfig({ privacyOptIn: value }).catch(silentErrorHandler('Privacy')); }} />
+        </div>
+        <p className="text-xs text-gray-500 leading-relaxed">
+          我们诚邀您加入优化提升计划,您的加入会帮助我们更好地迭代产品:在去标识化处理后,我们可能将您输入与生成的信息以及屏幕操作信息用于模型的训练与优化。我们尊重您的个人信息主体权益,您有权选择不允许我们将您的信息用于此目的。您也可以在后续使用中的任何时候通过"设置"中的开启或关闭按钮选择加入或退出优化计划。
+        </p>
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm">
+        <h3 className="font-medium mb-4 text-gray-900">备案信息</h3>
+        <div className="space-y-3 text-xs">
+          <div className="flex">
+            <span className="text-gray-500 w-28 flex-shrink-0">ICP 备案/许可证号</span>
+            <span className="text-gray-700">京 ICP 备 20011824 号 -21</span>
+          </div>
+          <div className="flex">
+            <span className="text-gray-500 w-28 flex-shrink-0">算法备案</span>
+            <div className="space-y-1 text-gray-700">
+              <div>智谱 ChatGLM 生成算法(网信算备 110108105858001230019 号)</div>
+              <div>智谱 ChatGLM 搜索算法(网信算备 110108105858004240011 号)</div>
+            </div>
+          </div>
+          <div className="flex">
+            <span className="text-gray-500 w-28 flex-shrink-0">大模型备案登记</span>
+            <span className="text-gray-700">Beijing-AutoGLM-2025060650053</span>
+          </div>
+        </div>
+ 
+        <div className="flex gap-4 mt-6 pt-4 border-t border-gray-100">
+          <a href="#" className="text-orange-600 text-xs hover:underline flex items-center gap-1">
+            <ExternalLink className="w-3 h-3" />
+            隐私政策
+          </a>
+          <a href="#" className="text-orange-600 text-xs hover:underline flex items-center gap-1">
+            <ExternalLink className="w-3 h-3" />
+            用户协议
+          </a>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+function Toggle({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) {
+  return (
+    <button
+      onClick={() => onChange(!checked)}
+      className={`w-11 h-6 rounded-full transition-colors relative flex-shrink-0 mt-1 ${checked ? 'bg-orange-500' : 'bg-gray-200'}`}
+    >
+      <span className={`block w-5 h-5 bg-white rounded-full shadow-sm absolute top-0.5 transition-all ${checked ? 'left-[22px]' : 'left-0.5'}`} />
+    </button>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/SecureStorage.tsx.html b/desktop/coverage/src/components/Settings/SecureStorage.tsx.html new file mode 100644 index 0000000..629a4a3 --- /dev/null +++ b/desktop/coverage/src/components/Settings/SecureStorage.tsx.html @@ -0,0 +1,1231 @@ + + + + + + Code coverage report for src/components/Settings/SecureStorage.tsx + + + + + + + + + +
+
+

All files / src/components/Settings SecureStorage.tsx

+
+ +
+ 0% + Statements + 0/293 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/293 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * SecureStorage - OS Keyring/Keychain Management UI
+ *
+ * Allows users to view, add, and delete securely stored credentials
+ * using the OS keyring (Windows DPAPI, macOS Keychain, Linux Secret Service).
+ */
+import { useState, useEffect } from 'react';
+import {
+  Key,
+  Plus,
+  Trash2,
+  Eye,
+  EyeOff,
+  RefreshCw,
+  AlertCircle,
+  CheckCircle,
+  Shield,
+  ShieldOff,
+} from 'lucide-react';
+import { secureStorage, isSecureStorageAvailable } from '../../lib/secure-storage';
+ 
+interface StoredKey {
+  key: string;
+  hasValue: boolean;
+  preview?: string;
+}
+ 
+// Known storage keys used by the application
+const KNOWN_KEYS = [
+  { key: 'zclaw_api_key', label: 'API Key', description: 'LLM API 密钥' },
+  { key: 'zclaw_device_keys_private', label: 'Device Private Key', description: '设备私钥 (Ed25519)' },
+  { key: 'zclaw_gateway_token', label: 'Gateway Token', description: 'Gateway 认证令牌' },
+  { key: 'zclaw_feishu_secret', label: '飞书 Secret', description: '飞书应用密钥' },
+  { key: 'zclaw_discord_token', label: 'Discord Token', description: 'Discord Bot Token' },
+  { key: 'zclaw_slack_token', label: 'Slack Token', description: 'Slack Bot Token' },
+  { key: 'zclaw_telegram_token', label: 'Telegram Token', description: 'Telegram Bot Token' },
+];
+ 
+export function SecureStorage() {
+  const [isAvailable, setIsAvailable] = useState<boolean | null>(null);
+  const [storedKeys, setStoredKeys] = useState<StoredKey[]>([]);
+  const [isLoading, setIsLoading] = useState(true);
+  const [showAddForm, setShowAddForm] = useState(false);
+  const [newKey, setNewKey] = useState('');
+  const [newValue, setNewValue] = useState('');
+  const [showValue, setShowValue] = useState<Record<string, boolean>>({});
+  const [revealedValues, setRevealedValues] = useState<Record<string, string>>({});
+  const [isSaving, setIsSaving] = useState(false);
+  const [isDeleting, setIsDeleting] = useState<string | null>(null);
+  const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
+ 
+  const loadStoredKeys = async () => {
+    setIsLoading(true);
+    try {
+      const available = await isSecureStorageAvailable();
+      setIsAvailable(available);
+ 
+      const keys: StoredKey[] = [];
+      for (const knownKey of KNOWN_KEYS) {
+        const value = await secureStorage.get(knownKey.key);
+        keys.push({
+          key: knownKey.key,
+          hasValue: !!value,
+          preview: value ? `${value.slice(0, 8)}${value.length > 8 ? '...' : ''}` : undefined,
+        });
+      }
+      setStoredKeys(keys);
+    } catch (error) {
+      console.error('Failed to load stored keys:', error);
+    } finally {
+      setIsLoading(false);
+    }
+  };
+ 
+  useEffect(() => {
+    loadStoredKeys();
+  }, []);
+ 
+  const handleReveal = async (key: string) => {
+    if (revealedValues[key]) {
+      // Hide if already revealed
+      setRevealedValues((prev) => {
+        const next = { ...prev };
+        delete next[key];
+        return next;
+      });
+      setShowValue((prev) => ({ ...prev, [key]: false }));
+    } else {
+      // Reveal the value
+      const value = await secureStorage.get(key);
+      if (value) {
+        setRevealedValues((prev) => ({ ...prev, [key]: value }));
+        setShowValue((prev) => ({ ...prev, [key]: true }));
+      }
+    }
+  };
+ 
+  const handleAddKey = async () => {
+    if (!newKey.trim() || !newValue.trim()) {
+      setMessage({ type: 'error', text: '请填写密钥名称和值' });
+      return;
+    }
+ 
+    setIsSaving(true);
+    setMessage(null);
+    try {
+      await secureStorage.set(newKey.trim(), newValue.trim());
+      setMessage({ type: 'success', text: '密钥已保存' });
+      setNewKey('');
+      setNewValue('');
+      setShowAddForm(false);
+      await loadStoredKeys();
+    } catch (error) {
+      setMessage({ type: 'error', text: `保存失败: ${error instanceof Error ? error.message : '未知错误'}` });
+    } finally {
+      setIsSaving(false);
+    }
+  };
+ 
+  const handleDeleteKey = async (key: string) => {
+    if (!confirm(`确定要删除密钥 "${key}" 吗?此操作无法撤销。`)) {
+      return;
+    }
+ 
+    setIsDeleting(key);
+    setMessage(null);
+    try {
+      await secureStorage.delete(key);
+      setMessage({ type: 'success', text: '密钥已删除' });
+      setRevealedValues((prev) => {
+        const next = { ...prev };
+        delete next[key];
+        return next;
+      });
+      await loadStoredKeys();
+    } catch (error) {
+      setMessage({ type: 'error', text: `删除失败: ${error instanceof Error ? error.message : '未知错误'}` });
+    } finally {
+      setIsDeleting(null);
+    }
+  };
+ 
+  const getKeyLabel = (key: string) => {
+    const known = KNOWN_KEYS.find((k) => k.key === key);
+    return known ? known.label : key;
+  };
+ 
+  const getKeyDescription = (key: string) => {
+    const known = KNOWN_KEYS.find((k) => k.key === key);
+    return known?.description;
+  };
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-6">
+        <div>
+          <h1 className="text-xl font-bold text-gray-900 dark:text-white">安全存储</h1>
+          <p className="text-xs text-gray-500 dark:text-gray-400 mt-1">
+            使用系统密钥库 (Keyring/Keychain) 安全存储敏感信息
+          </p>
+        </div>
+        <div className="flex gap-2 items-center">
+          {isAvailable !== null && (
+            <span className={`text-xs flex items-center gap-1 ${isAvailable ? 'text-green-600' : 'text-amber-600'}`}>
+              {isAvailable ? (
+                <>
+                  <Shield className="w-3 h-3" /> Keyring 可用
+                </>
+              ) : (
+                <>
+                  <ShieldOff className="w-3 h-3" /> 使用加密本地存储
+                </>
+              )}
+            </span>
+          )}
+          <button
+            onClick={loadStoredKeys}
+            disabled={isLoading}
+            className="text-xs text-white bg-orange-500 hover:bg-orange-600 px-3 py-1.5 rounded-lg flex items-center gap-1 transition-colors disabled:opacity-50"
+          >
+            <RefreshCw className={`w-3 h-3 ${isLoading ? 'animate-spin' : ''}`} /> 刷新
+          </button>
+        </div>
+      </div>
+ 
+      {/* Status Banner */}
+      {isAvailable === false && (
+        <div className="mb-6 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg">
+          <div className="flex items-start gap-2">
+            <AlertCircle className="w-4 h-4 text-amber-500 mt-0.5" />
+            <div className="text-xs text-amber-700 dark:text-amber-300">
+              <p className="font-medium">Keyring 不可用</p>
+              <p className="mt-1">
+                系统密钥库不可用,将使用 AES-GCM 加密的本地存储作为后备方案。
+                建议在 Tauri 环境中运行以获得最佳安全性。
+              </p>
+            </div>
+          </div>
+        </div>
+      )}
+ 
+      {/* Message */}
+      {message && (
+        <div className={`mb-4 p-3 rounded-lg flex items-center gap-2 ${
+          message.type === 'success'
+            ? 'bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-300'
+            : 'bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300'
+        }`}>
+          {message.type === 'success' ? (
+            <CheckCircle className="w-4 h-4" />
+          ) : (
+            <AlertCircle className="w-4 h-4" />
+          )}
+          {message.text}
+        </div>
+      )}
+ 
+      {/* Stored Keys List */}
+      <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 mb-6 shadow-sm">
+        {isLoading ? (
+          <div className="h-40 flex items-center justify-center text-sm text-gray-400">
+            <RefreshCw className="w-4 h-4 animate-spin mr-2" />
+            加载中...
+          </div>
+        ) : storedKeys.length > 0 ? (
+          <div className="divide-y divide-gray-100 dark:divide-gray-700">
+            {storedKeys.map((item) => (
+              <div key={item.key} className="p-4">
+                <div className="flex items-center gap-4">
+                  <div className={`w-10 h-10 rounded-xl flex items-center justify-center ${
+                    item.hasValue
+                      ? 'bg-gradient-to-br from-green-500 to-emerald-500 text-white'
+                      : 'bg-gray-200 dark:bg-gray-700 text-gray-400'
+                  }`}>
+                    <Key className="w-4 h-4" />
+                  </div>
+                  <div className="flex-1 min-w-0">
+                    <div className="text-sm font-medium text-gray-900 dark:text-white">
+                      {getKeyLabel(item.key)}
+                    </div>
+                    <div className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+                      {getKeyDescription(item.key) || item.key}
+                    </div>
+                    {item.hasValue && (
+                      <div className="text-xs text-gray-400 dark:text-gray-500 mt-1 font-mono">
+                        {showValue[item.key] ? (
+                          <span className="break-all">{revealedValues[item.key]}</span>
+                        ) : (
+                          <span>{item.preview}</span>
+                        )}
+                      </div>
+                    )}
+                  </div>
+                  <div className="flex items-center gap-2">
+                    {item.hasValue && (
+                      <>
+                        <button
+                          onClick={() => handleReveal(item.key)}
+                          className="p-2 text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors"
+                          title={showValue[item.key] ? '隐藏' : '显示'}
+                        >
+                          {showValue[item.key] ? (
+                            <EyeOff className="w-4 h-4" />
+                          ) : (
+                            <Eye className="w-4 h-4" />
+                          )}
+                        </button>
+                        <button
+                          onClick={() => handleDeleteKey(item.key)}
+                          disabled={isDeleting === item.key}
+                          className="p-2 text-gray-400 hover:text-red-600 dark:hover:text-red-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-50"
+                          title="删除"
+                        >
+                          {isDeleting === item.key ? (
+                            <RefreshCw className="w-4 h-4 animate-spin" />
+                          ) : (
+                            <Trash2 className="w-4 h-4" />
+                          )}
+                        </button>
+                      </>
+                    )}
+                    {!item.hasValue && (
+                      <span className="text-xs text-gray-400 dark:text-gray-500 px-2">未设置</span>
+                    )}
+                  </div>
+                </div>
+              </div>
+            ))}
+          </div>
+        ) : (
+          <div className="h-40 flex items-center justify-center text-sm text-gray-400">
+            暂无存储的密钥
+          </div>
+        )}
+      </div>
+ 
+      {/* Add New Key */}
+      <div className="mb-6">
+        {!showAddForm ? (
+          <button
+            onClick={() => setShowAddForm(true)}
+            className="w-full p-4 border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-xl text-gray-500 dark:text-gray-400 hover:border-orange-400 hover:text-orange-500 transition-colors flex items-center justify-center gap-2"
+          >
+            <Plus className="w-4 h-4" />
+            <span className="text-sm">添加新密钥</span>
+          </button>
+        ) : (
+          <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-4 shadow-sm">
+            <h3 className="text-sm font-medium text-gray-900 dark:text-white mb-4">添加新密钥</h3>
+            <div className="space-y-3">
+              <div>
+                <label className="block text-xs font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  密钥名称
+                </label>
+                <input
+                  type="text"
+                  value={newKey}
+                  onChange={(e) => setNewKey(e.target.value)}
+                  placeholder="例如: zclaw_custom_key"
+                  className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white text-sm focus:ring-2 focus:ring-blue-500 focus:border-transparent"
+                />
+              </div>
+              <div>
+                <label className="block text-xs font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  密钥值
+                </label>
+                <input
+                  type="password"
+                  value={newValue}
+                  onChange={(e) => setNewValue(e.target.value)}
+                  placeholder="输入密钥值"
+                  className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white text-sm focus:ring-2 focus:ring-blue-500 focus:border-transparent"
+                />
+              </div>
+              <div className="flex gap-2 pt-2">
+                <button
+                  onClick={() => {
+                    setShowAddForm(false);
+                    setNewKey('');
+                    setNewValue('');
+                    setMessage(null);
+                  }}
+                  className="flex-1 px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 text-sm"
+                >
+                  取消
+                </button>
+                <button
+                  onClick={handleAddKey}
+                  disabled={isSaving || !newKey.trim() || !newValue.trim()}
+                  className="flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 flex items-center justify-center gap-2 text-sm"
+                >
+                  {isSaving ? (
+                    <>
+                      <RefreshCw className="w-3 h-3 animate-spin" />
+                      保存中...
+                    </>
+                  ) : (
+                    <>
+                      <CheckCircle className="w-3 h-3" />
+                      保存
+                    </>
+                  )}
+                </button>
+              </div>
+            </div>
+          </div>
+        )}
+      </div>
+ 
+      {/* Info Section */}
+      <div className="p-4 bg-gray-50 dark:bg-gray-800/50 rounded-lg border border-gray-200 dark:border-gray-700">
+        <h3 className="text-sm font-medium text-gray-900 dark:text-white mb-2">关于安全存储</h3>
+        <ul className="text-xs text-gray-500 dark:text-gray-400 space-y-1">
+          <li>• Windows: 使用 DPAPI 加密</li>
+          <li>• macOS: 使用 Keychain 存储</li>
+          <li>• Linux: 使用 Secret Service API (gnome-keyring, kwallet 等)</li>
+          <li>• 后备方案: AES-GCM 加密的 localStorage</li>
+        </ul>
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/SettingsLayout.tsx.html b/desktop/coverage/src/components/Settings/SettingsLayout.tsx.html new file mode 100644 index 0000000..10ff2dc --- /dev/null +++ b/desktop/coverage/src/components/Settings/SettingsLayout.tsx.html @@ -0,0 +1,736 @@ + + + + + + Code coverage report for src/components/Settings/SettingsLayout.tsx + + + + + + + + + +
+
+

All files / src/components/Settings SettingsLayout.tsx

+
+ +
+ 0% + Statements + 0/135 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/135 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState } from 'react';
+import { useSecurityStore } from '../../store/securityStore';
+import {
+  Settings as SettingsIcon,
+  BarChart3,
+  Puzzle,
+  MessageSquare,
+  FolderOpen,
+  Shield,
+  Info,
+  ArrowLeft,
+  Coins,
+  Cpu,
+  Zap,
+  HelpCircle,
+  ClipboardList,
+  Clock,
+  Heart,
+  Key,
+  Database,
+} from 'lucide-react';
+import { silentErrorHandler } from '../../lib/error-utils';
+import { General } from './General';
+import { UsageStats } from './UsageStats';
+import { ModelsAPI } from './ModelsAPI';
+import { MCPServices } from './MCPServices';
+import { Skills } from './Skills';
+import { IMChannels } from './IMChannels';
+import { Workspace } from './Workspace';
+import { Privacy } from './Privacy';
+import { About } from './About';
+import { Credits } from './Credits';
+import { AuditLogsPanel } from '../AuditLogsPanel';
+import { SecurityStatus } from '../SecurityStatus';
+import { SecurityLayersPanel } from '../SecurityLayersPanel';
+import { TaskList } from '../TaskList';
+import { HeartbeatConfig } from '../HeartbeatConfig';
+import { SecureStorage } from './SecureStorage';
+import { VikingPanel } from '../VikingPanel';
+ 
+interface SettingsLayoutProps {
+  onBack: () => void;
+}
+ 
+type SettingsPage =
+  | 'general'
+  | 'usage'
+  | 'credits'
+  | 'models'
+  | 'mcp'
+  | 'skills'
+  | 'im'
+  | 'workspace'
+  | 'privacy'
+  | 'security'
+  | 'storage'
+  | 'viking'
+  | 'audit'
+  | 'tasks'
+  | 'heartbeat'
+  | 'feedback'
+  | 'about';
+ 
+const menuItems: { id: SettingsPage; label: string; icon: React.ReactNode }[] = [
+  { id: 'general', label: '通用', icon: <SettingsIcon className="w-4 h-4" /> },
+  { id: 'usage', label: '用量统计', icon: <BarChart3 className="w-4 h-4" /> },
+  { id: 'credits', label: '积分详情', icon: <Coins className="w-4 h-4" /> },
+  { id: 'models', label: '模型与 API', icon: <Cpu className="w-4 h-4" /> },
+  { id: 'mcp', label: 'MCP 服务', icon: <Puzzle className="w-4 h-4" /> },
+  { id: 'skills', label: '技能', icon: <Zap className="w-4 h-4" /> },
+  { id: 'im', label: 'IM 频道', icon: <MessageSquare className="w-4 h-4" /> },
+  { id: 'workspace', label: '工作区', icon: <FolderOpen className="w-4 h-4" /> },
+  { id: 'privacy', label: '数据与隐私', icon: <Shield className="w-4 h-4" /> },
+  { id: 'storage', label: '安全存储', icon: <Key className="w-4 h-4" /> },
+  { id: 'viking', label: '语义记忆', icon: <Database className="w-4 h-4" /> },
+  { id: 'security', label: '安全状态', icon: <Shield className="w-4 h-4" /> },
+  { id: 'audit', label: '审计日志', icon: <ClipboardList className="w-4 h-4" /> },
+  { id: 'tasks', label: '定时任务', icon: <Clock className="w-4 h-4" /> },
+  { id: 'heartbeat', label: '心跳配置', icon: <Heart className="w-4 h-4" /> },
+  { id: 'feedback', label: '提交反馈', icon: <HelpCircle className="w-4 h-4" /> },
+  { id: 'about', label: '关于', icon: <Info className="w-4 h-4" /> },
+];
+ 
+export function SettingsLayout({ onBack }: SettingsLayoutProps) {
+  const [activePage, setActivePage] = useState<SettingsPage>('general');
+  const securityStatus = useSecurityStore((s) => s.securityStatus);
+ 
+  const renderPage = () => {
+    switch (activePage) {
+      case 'general': return <General />;
+      case 'usage': return <UsageStats />;
+      case 'credits': return <Credits />;
+      case 'models': return <ModelsAPI />;
+      case 'mcp': return <MCPServices />;
+      case 'skills': return <Skills />;
+      case 'im': return <IMChannels />;
+      case 'workspace': return <Workspace />;
+      case 'privacy': return <Privacy />;
+      case 'storage': return <SecureStorage />;
+      case 'security': return (
+        <div className="space-y-6">
+          <div>
+            <h1 className="text-xl font-bold text-gray-900 mb-4">安全状态</h1>
+            <SecurityStatus />
+          </div>
+          <div>
+            <h2 className="text-lg font-semibold text-gray-900 mb-4">安全架构详情</h2>
+            <SecurityLayersPanel
+              status={securityStatus || {
+                layers: [],
+                enabledCount: 0,
+                totalCount: 16,
+                securityLevel: 'low',
+              }}
+            />
+          </div>
+        </div>
+      );
+      case 'audit': return <AuditLogsPanel />;
+      case 'tasks': return (
+        <div className="max-w-3xl">
+          <h1 className="text-xl font-bold text-gray-900 mb-6">定时任务</h1>
+          <div className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm">
+            <TaskList />
+          </div>
+        </div>
+      );
+      case 'heartbeat': return (
+        <div className="max-w-3xl h-full">
+          <HeartbeatConfig />
+        </div>
+      );
+      case 'viking': return <VikingPanel />;
+      case 'feedback': return <Feedback />;
+      case 'about': return <About />;
+      default: return <General />;
+    }
+  };
+ 
+  return (
+    <div className="h-screen flex bg-f9fafb overflow-hidden text-gray-800 text-sm">
+      {/* Left navigation */}
+      <aside className="w-64 bg-gray-50 border-r border-gray-200 flex flex-col flex-shrink-0">
+        {/* 返回按钮 */}
+        <div className="p-4 border-b border-gray-200">
+          <button
+            onClick={onBack}
+            className="flex items-center gap-2 text-gray-500 hover:text-gray-700 transition-colors"
+          >
+            <ArrowLeft className="w-4 h-4" />
+            <span>返回应用</span>
+          </button>
+        </div>
+ 
+        {/* 导航菜单 */}
+        <nav className="flex-1 overflow-y-auto custom-scrollbar py-2 px-3 space-y-1">
+          {menuItems.map((item) => (
+            <button
+              key={item.id}
+              onClick={() => setActivePage(item.id)}
+              className={`w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-all ${
+                activePage === item.id
+                  ? 'bg-gray-200 text-gray-900 font-medium'
+                  : 'text-gray-500 hover:bg-black/5 hover:text-gray-700'
+              }`}
+            >
+              {item.icon}
+              <span>{item.label}</span>
+            </button>
+          ))}
+        </nav>
+      </aside>
+ 
+      {/* Main content */}
+      <main className="flex-1 overflow-y-auto custom-scrollbar bg-white p-8">
+        {renderPage()}
+      </main>
+    </div>
+  );
+}
+ 
+// Simple feedback page (inline)
+function Feedback() {
+  const [text, setText] = useState('');
+  const [copied, setCopied] = useState(false);
+ 
+  const handleCopy = async () => {
+    await navigator.clipboard.writeText(text.trim());
+    setCopied(true);
+  };
+  return (
+    <div className="max-w-3xl">
+      <h1 className="text-xl font-bold text-gray-900 mb-6">提交反馈</h1>
+      <div className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm">
+        <p className="text-sm text-gray-500 mb-4">当前版本尚未接入在线反馈通道。你可以先复制下面的反馈内容,再连同截图和日志一起发给开发者。</p>
+        <textarea
+          value={text}
+          onChange={(e) => {
+            setText(e.target.value);
+            if (copied) {
+              setCopied(false);
+            }
+          }}
+          placeholder="请尽量详细描述复现步骤、期望结果和实际结果"
+          className="w-full h-40 border border-gray-300 rounded-lg p-3 text-sm resize-none focus:outline-none focus:border-orange-400"
+        />
+        <button
+          onClick={() => { handleCopy().catch(silentErrorHandler('SettingsLayout')); }}
+          disabled={!text.trim()}
+          className="mt-4 px-6 py-2 bg-orange-500 text-white text-sm rounded-lg hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
+        >
+          {copied ? '已复制' : '复制反馈内容'}
+        </button>
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/Skills.tsx.html b/desktop/coverage/src/components/Settings/Skills.tsx.html new file mode 100644 index 0000000..e7d5d90 --- /dev/null +++ b/desktop/coverage/src/components/Settings/Skills.tsx.html @@ -0,0 +1,754 @@ + + + + + + Code coverage report for src/components/Settings/Skills.tsx + + + + + + + + + +
+
+

All files / src/components/Settings Skills.tsx

+
+ +
+ 0% + Statements + 0/194 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/194 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect, useState } from 'react';
+import { useConnectionStore } from '../../store/connectionStore';
+import { useConfigStore } from '../../store/configStore';
+import { silentErrorHandler } from '../../lib/error-utils';
+import { Wrench, Zap, FileCode, Globe, Mail, Database, Search, MessageSquare } from 'lucide-react';
+ 
+// ZCLAW 内置系统技能
+const SYSTEM_SKILLS = [
+  {
+    id: 'code-assistant',
+    name: '代码助手',
+    description: '代码编写、调试、重构和优化',
+    category: '开发',
+    icon: FileCode,
+  },
+  {
+    id: 'web-search',
+    name: '网络搜索',
+    description: '实时搜索互联网信息',
+    category: '信息',
+    icon: Search,
+  },
+  {
+    id: 'file-manager',
+    name: '文件管理',
+    description: '文件读写、搜索和整理',
+    category: '系统',
+    icon: Database,
+  },
+  {
+    id: 'web-browsing',
+    name: '网页浏览',
+    description: '访问和解析网页内容',
+    category: '信息',
+    icon: Globe,
+  },
+  {
+    id: 'email-handler',
+    name: '邮件处理',
+    description: '发送和管理电子邮件',
+    category: '通讯',
+    icon: Mail,
+  },
+  {
+    id: 'chat-skill',
+    name: '对话技能',
+    description: '自然语言对话和问答',
+    category: '交互',
+    icon: MessageSquare,
+  },
+  {
+    id: 'automation',
+    name: '自动化任务',
+    description: '自动化工作流程执行',
+    category: '系统',
+    icon: Zap,
+  },
+  {
+    id: 'tool-executor',
+    name: '工具执行器',
+    description: '执行系统命令和脚本',
+    category: '系统',
+    icon: Wrench,
+  },
+];
+ 
+export function Skills() {
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const skillsCatalog = useConfigStore((s) => s.skillsCatalog);
+  const loadSkillsCatalog = useConfigStore((s) => s.loadSkillsCatalog);
+  const saveQuickConfig = useConfigStore((s) => s.saveQuickConfig);
+  const connected = connectionState === 'connected';
+  const [extraDir, setExtraDir] = useState('');
+  const [activeFilter, setActiveFilter] = useState<'all' | 'system' | 'builtin' | 'extra'>('all');
+ 
+  useEffect(() => {
+    if (connected) {
+      loadSkillsCatalog().catch(silentErrorHandler('Skills'));
+    }
+  }, [connected]);
+ 
+  const extraDirs = quickConfig.skillsExtraDirs || [];
+ 
+  const handleAddDir = async () => {
+    const nextDir = extraDir.trim();
+    if (!nextDir) return;
+    const nextDirs = Array.from(new Set([...extraDirs, nextDir]));
+    await saveQuickConfig({ skillsExtraDirs: nextDirs });
+    setExtraDir('');
+    await loadSkillsCatalog();
+  };
+ 
+  const filteredCatalog = skillsCatalog.filter(skill => {
+    if (activeFilter === 'all') return true;
+    if (activeFilter === 'builtin') return skill.source === 'builtin';
+    if (activeFilter === 'extra') return skill.source === 'extra';
+    return true;
+  });
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-xl font-bold text-gray-900">技能</h1>
+        <button
+          onClick={() => { loadSkillsCatalog().catch(silentErrorHandler('Skills')); }}
+          className="text-xs text-gray-500 hover:text-gray-700 px-3 py-1.5 border border-gray-200 rounded-lg transition-colors"
+        >
+          刷新
+        </button>
+      </div>
+ 
+      {!connected && (
+        <div className="bg-gray-50/50 border border-gray-200 rounded-xl p-4 mb-6 text-center text-sm text-gray-500 shadow-sm">
+          Gateway 未连接。请先连接 Gateway 再管理技能。
+        </div>
+      )}
+ 
+      {/* 系统技能 */}
+      <div className="mb-6">
+        <h3 className="text-sm font-semibold text-gray-700 mb-3">ZCLAW 系统技能</h3>
+        <div className="grid grid-cols-2 gap-3">
+          {SYSTEM_SKILLS.map((skill) => {
+            const Icon = skill.icon;
+            return (
+              <div
+                key={skill.id}
+                className="bg-white rounded-xl border border-gray-200 p-4 shadow-sm hover:shadow-md transition-shadow"
+              >
+                <div className="flex items-start gap-3">
+                  <div className="w-10 h-10 bg-gradient-to-br from-blue-500 to-purple-500 rounded-lg flex items-center justify-center flex-shrink-0">
+                    <Icon className="w-5 h-5 text-white" />
+                  </div>
+                  <div className="flex-1 min-w-0">
+                    <div className="flex items-center gap-2">
+                      <span className="text-sm font-medium text-gray-900">{skill.name}</span>
+                      <span className="text-[10px] px-1.5 py-0.5 bg-purple-50 text-purple-600 rounded">
+                        {skill.category}
+                      </span>
+                    </div>
+                    <p className="text-xs text-gray-500 mt-1">{skill.description}</p>
+                  </div>
+                </div>
+              </div>
+            );
+          })}
+        </div>
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 p-6 mb-6 shadow-sm">
+        <h3 className="font-medium mb-2 text-gray-900">额外技能目录</h3>
+        <p className="text-xs text-gray-500 mb-4">包含 SKILL.md 文件的额外目录。保存到 Gateway 配置的 skills.load.extraDirs 中。</p>
+        <div className="flex gap-2">
+          <input
+            type="text"
+            value={extraDir}
+            onChange={(e) => setExtraDir(e.target.value)}
+            placeholder="输入额外技能目录"
+            className="flex-1 px-3 py-2 border border-gray-200 rounded-lg text-sm bg-gray-50 focus:outline-none"
+          />
+          <button
+            onClick={() => { handleAddDir().catch(silentErrorHandler('Skills')); }}
+            className="text-xs text-gray-500 px-4 py-2 border border-gray-200 rounded-lg hover:text-gray-700 transition-colors"
+          >
+            添加
+          </button>
+        </div>
+        {extraDirs.length > 0 && (
+          <div className="mt-4 space-y-2">
+            {extraDirs.map((dir) => (
+              <div key={dir} className="text-xs text-gray-500 bg-gray-50 border border-gray-100 rounded-lg px-3 py-2">
+                {dir}
+              </div>
+            ))}
+          </div>
+        )}
+      </div>
+ 
+      {/* Gateway 技能 */}
+      <div className="mb-4">
+        <div className="flex items-center justify-between mb-3">
+          <h3 className="text-sm font-semibold text-gray-700">Gateway 技能</h3>
+          <div className="flex items-center gap-2">
+            {['all', 'builtin', 'extra'].map((filter) => (
+              <button
+                key={filter}
+                onClick={() => setActiveFilter(filter as typeof activeFilter)}
+                className={`text-xs px-2 py-1 rounded-md transition-colors ${
+                  activeFilter === filter
+                    ? 'bg-blue-100 text-blue-700'
+                    : 'text-gray-500 hover:bg-gray-100'
+                }`}
+              >
+                {filter === 'all' ? '全部' : filter === 'builtin' ? '内置' : '额外'}
+              </button>
+            ))}
+          </div>
+        </div>
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 shadow-sm divide-y divide-gray-100">
+        {filteredCatalog.length > 0 ? filteredCatalog.map((skill) => (
+          <div key={skill.id} className="p-4">
+            <div className="flex items-center justify-between gap-4">
+              <div>
+                <div className="text-sm font-medium text-gray-900">{skill.name}</div>
+                <div className="text-xs text-gray-500 mt-1 break-all">{skill.path}</div>
+              </div>
+              <span className={`text-xs px-2 py-1 rounded-full ${skill.source === 'builtin' ? 'bg-blue-50 text-blue-600' : 'bg-gray-100 text-gray-500'}`}>
+                {skill.source === 'builtin' ? '内置' : '额外'}
+              </span>
+            </div>
+          </div>
+        )) : (
+          <div className="bg-gray-50 rounded-xl p-8 text-center">
+            <p className="text-sm text-gray-400">暂无技能</p>
+            <p className="text-xs text-gray-300 mt-1">连接 Gateway 后将自动加载技能列表</p>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/UsageStats.tsx.html b/desktop/coverage/src/components/Settings/UsageStats.tsx.html new file mode 100644 index 0000000..fe2b0bd --- /dev/null +++ b/desktop/coverage/src/components/Settings/UsageStats.tsx.html @@ -0,0 +1,616 @@ + + + + + + Code coverage report for src/components/Settings/UsageStats.tsx + + + + + + + + + +
+
+

All files / src/components/Settings UsageStats.tsx

+
+ +
+ 0% + Statements + 0/148 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/148 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect, useState } from 'react';
+import { useAgentStore } from '../../store/agentStore';
+import { useConnectionStore } from '../../store/connectionStore';
+import { BarChart3, TrendingUp, Clock, Zap } from 'lucide-react';
+ 
+export function UsageStats() {
+  const usageStats = useAgentStore((s) => s.usageStats);
+  const loadUsageStats = useAgentStore((s) => s.loadUsageStats);
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const [timeRange, setTimeRange] = useState<'7d' | '30d' | 'all'>('7d');
+ 
+  useEffect(() => {
+    if (connectionState === 'connected') {
+      loadUsageStats();
+    }
+  }, [connectionState]);
+ 
+  const stats = usageStats || { totalSessions: 0, totalMessages: 0, totalTokens: 0, byModel: {} };
+  const models = Object.entries(stats.byModel || {});
+ 
+  const formatTokens = (n: number) => {
+    if (n >= 1_000_000) return `~${(n / 1_000_000).toFixed(1)} M`;
+    if (n >= 1_000) return `~${(n / 1_000).toFixed(1)} k`;
+    return `${n}`;
+  };
+ 
+  // 计算总输入和输出 Token
+  const totalInputTokens = models.reduce((sum, [_, data]) => sum + data.inputTokens, 0);
+  const totalOutputTokens = models.reduce((sum, [_, data]) => sum + data.outputTokens, 0);
+ 
+  return (
+    <div className="max-w-3xl">
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-xl font-bold text-gray-900">用量统计</h1>
+        <div className="flex items-center gap-2">
+          <div className="flex items-center bg-gray-100 rounded-lg p-0.5">
+            {(['7d', '30d', 'all'] as const).map((range) => (
+              <button
+                key={range}
+                onClick={() => setTimeRange(range)}
+                className={`px-3 py-1 text-xs rounded-md transition-colors ${
+                  timeRange === range
+                    ? 'bg-white text-gray-900 shadow-sm'
+                    : 'text-gray-500 hover:text-gray-700'
+                }`}
+              >
+                {range === '7d' ? '近 7 天' : range === '30d' ? '近 30 天' : '全部'}
+              </button>
+            ))}
+          </div>
+          <button
+            onClick={() => loadUsageStats()}
+            className="text-xs text-gray-500 hover:text-gray-700 px-3 py-1.5 border border-gray-200 rounded-lg transition-colors"
+          >
+            刷新
+          </button>
+        </div>
+      </div>
+      <div className="text-xs text-gray-500 mb-4">本设备所有已保存对话的 Token 用量汇总。</div>
+ 
+      {/* 主要统计卡片 */}
+      <div className="grid grid-cols-4 gap-4 mb-8">
+        <StatCard
+          icon={BarChart3}
+          label="会话数"
+          value={stats.totalSessions}
+          color="text-blue-500"
+        />
+        <StatCard
+          icon={Zap}
+          label="消息数"
+          value={stats.totalMessages}
+          color="text-purple-500"
+        />
+        <StatCard
+          icon={TrendingUp}
+          label="输入 Token"
+          value={formatTokens(totalInputTokens)}
+          color="text-green-500"
+        />
+        <StatCard
+          icon={Clock}
+          label="输出 Token"
+          value={formatTokens(totalOutputTokens)}
+          color="text-orange-500"
+        />
+      </div>
+ 
+      {/* 总 Token 使用量概览 */}
+      <div className="bg-white rounded-xl border border-gray-200 p-5 shadow-sm mb-6">
+        <h3 className="text-sm font-semibold mb-4 text-gray-900">Token 使用概览</h3>
+        <div className="flex items-center gap-4">
+          <div className="flex-1">
+            <div className="flex justify-between text-xs text-gray-500 mb-1">
+              <span>输入</span>
+              <span>输出</span>
+            </div>
+            <div className="h-3 bg-gray-100 rounded-full overflow-hidden flex">
+              <div
+                className="bg-gradient-to-r from-green-400 to-green-500 h-full transition-all"
+                style={{ width: `${(totalInputTokens / Math.max(totalInputTokens + totalOutputTokens, 1)) * 100}%` }}
+              />
+              <div
+                className="bg-gradient-to-r from-orange-400 to-orange-500 h-full transition-all"
+                style={{ width: `${(totalOutputTokens / Math.max(totalInputTokens + totalOutputTokens, 1)) * 100}%` }}
+              />
+            </div>
+          </div>
+          <div className="text-right flex-shrink-0">
+            <div className="text-lg font-bold text-gray-900">{formatTokens(stats.totalTokens)}</div>
+            <div className="text-xs text-gray-500">总计</div>
+          </div>
+        </div>
+      </div>
+ 
+      {/* 按模型分组 */}
+      <h2 className="text-sm font-semibold mb-4 text-gray-900">按模型</h2>
+      <div className="bg-white rounded-xl border border-gray-200 divide-y divide-gray-100 shadow-sm">
+        {models.length === 0 ? (
+          <div className="p-8 text-center">
+            <div className="w-12 h-12 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-3">
+              <BarChart3 className="w-6 h-6 text-gray-400" />
+            </div>
+            <p className="text-sm text-gray-400">暂无使用数据</p>
+            <p className="text-xs text-gray-300 mt-1">开始对话后将自动记录用量统计</p>
+          </div>
+        ) : (
+          models.map(([model, data]) => {
+            const total = data.inputTokens + data.outputTokens;
+            const inputPct = (data.inputTokens / Math.max(total, 1)) * 100;
+            const outputPct = (data.outputTokens / Math.max(total, 1)) * 100;
+ 
+            return (
+              <div key={model} className="p-4">
+                <div className="flex justify-between items-center mb-2">
+                  <span className="font-medium text-gray-900">{model}</span>
+                  <span className="text-xs text-gray-500">{data.messages} 条消息</span>
+                </div>
+                <div className="h-2 bg-gray-100 rounded-full overflow-hidden mb-2 flex">
+                  <div className="bg-orange-500 h-full" style={{ width: `${inputPct}%` }} />
+                  <div className="bg-orange-200 h-full" style={{ width: `${outputPct}%` }} />
+                </div>
+                <div className="flex justify-between text-xs text-gray-500">
+                  <span>输入: {formatTokens(data.inputTokens)}</span>
+                  <span>输出: {formatTokens(data.outputTokens)}</span>
+                  <span>总计: {formatTokens(total)}</span>
+                </div>
+              </div>
+            );
+          })
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+function StatCard({
+  icon: Icon,
+  label,
+  value,
+  color,
+}: {
+  icon: typeof BarChart3;
+  label: string;
+  value: string | number;
+  color: string;
+}) {
+  return (
+    <div className="bg-white rounded-xl border border-gray-200 p-4 shadow-sm">
+      <div className="flex items-center gap-2 mb-2">
+        <Icon className={`w-4 h-4 ${color}`} />
+        <span className="text-xs text-gray-500">{label}</span>
+      </div>
+      <div className="text-2xl font-bold text-gray-900">{value}</div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/Workspace.tsx.html b/desktop/coverage/src/components/Settings/Workspace.tsx.html new file mode 100644 index 0000000..bb5d4b1 --- /dev/null +++ b/desktop/coverage/src/components/Settings/Workspace.tsx.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for src/components/Settings/Workspace.tsx + + + + + + + + + +
+
+

All files / src/components/Settings Workspace.tsx

+
+ +
+ 0% + Statements + 0/85 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/85 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect, useState } from 'react';
+import { useConfigStore } from '../../store/configStore';
+import { silentErrorHandler } from '../../lib/error-utils';
+ 
+export function Workspace() {
+  const quickConfig = useConfigStore((s) => s.quickConfig);
+  const workspaceInfo = useConfigStore((s) => s.workspaceInfo);
+  const loadWorkspaceInfo = useConfigStore((s) => s.loadWorkspaceInfo);
+  const saveQuickConfig = useConfigStore((s) => s.saveQuickConfig);
+  const [projectDir, setProjectDir] = useState('~/.openfang/zclaw-workspace');
+ 
+  useEffect(() => {
+    loadWorkspaceInfo().catch(silentErrorHandler('Workspace'));
+  }, []);
+ 
+  useEffect(() => {
+    setProjectDir(quickConfig.workspaceDir || workspaceInfo?.path || '~/.openfang/zclaw-workspace');
+  }, [quickConfig.workspaceDir, workspaceInfo?.path]);
+ 
+  const handleWorkspaceBlur = async () => {
+    const nextValue = projectDir.trim() || '~/.openfang/zclaw-workspace';
+    setProjectDir(nextValue);
+    await saveQuickConfig({ workspaceDir: nextValue });
+    await loadWorkspaceInfo();
+  };
+ 
+  const handleToggle = async (
+    key: 'restrictFiles' | 'autoSaveContext' | 'fileWatching',
+    value: boolean
+  ) => {
+    await saveQuickConfig({ [key]: value });
+  };
+ 
+  const restrictFiles = quickConfig.restrictFiles ?? true;
+  const autoSaveContext = quickConfig.autoSaveContext ?? true;
+  const fileWatching = quickConfig.fileWatching ?? true;
+ 
+  return (
+    <div className="max-w-3xl">
+      <h1 className="text-xl font-bold mb-2 text-gray-900">工作区</h1>
+      <div className="text-xs text-gray-500 mb-6">配置本地项目目录与上下文持久化行为。</div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 p-6 mb-6 shadow-sm">
+        <label className="block text-sm font-medium text-gray-700 mb-2">默认项目目录</label>
+        <div className="text-xs text-gray-500 mb-3">ZCLAW 项目和上下文文件的保存位置。</div>
+        <div className="flex gap-2">
+          <input
+            type="text"
+            value={projectDir}
+            onChange={(e) => setProjectDir(e.target.value)}
+            onBlur={() => { handleWorkspaceBlur().catch(silentErrorHandler('Workspace')); }}
+            className="flex-1 px-3 py-2 border border-gray-200 rounded-lg text-sm bg-gray-50 focus:outline-none"
+          />
+          <button className="text-xs px-4 py-2 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors">
+            浏览
+          </button>
+        </div>
+        <div className="mt-3 space-y-1 text-xs text-gray-500">
+          <div>当前解析路径:{workspaceInfo?.resolvedPath || '未解析'}</div>
+          <div>文件数:{workspaceInfo?.fileCount ?? 0},大小:{workspaceInfo?.totalSize ?? 0} bytes</div>
+        </div>
+      </div>
+ 
+      <div className="bg-white rounded-xl border border-gray-200 p-6 space-y-6 shadow-sm">
+        <div className="flex justify-between items-start">
+          <div className="flex-1 pr-4">
+            <div className="font-medium text-gray-900 mb-1">限制文件访问范围</div>
+            <div className="text-xs text-gray-500 leading-relaxed">
+              开启后,Agent 的工作空间将限制在工作目录内。关闭后可访问更大范围,可能导致误操作。无论开关状态,均建议提前备份重要文件。请注意:受技术限制,我们无法保证完全阻止目录外执行或由此带来的外部影响;请自行评估风险并谨慎使用。
+            </div>
+          </div>
+          <Toggle checked={restrictFiles} onChange={(value) => { handleToggle('restrictFiles', value).catch(silentErrorHandler('Workspace')); }} />
+        </div>
+ 
+        <div className="flex justify-between items-center py-3 border-t border-gray-100">
+          <div>
+            <div className="font-medium text-gray-900 mb-1">自动保存上下文</div>
+            <div className="text-xs text-gray-500">自动将聊天记录和提取的产物保存到本地工作区文件夹。</div>
+          </div>
+          <Toggle checked={autoSaveContext} onChange={(value) => { handleToggle('autoSaveContext', value).catch(silentErrorHandler('Workspace')); }} />
+        </div>
+ 
+        <div className="flex justify-between items-center py-3 border-t border-gray-100">
+          <div>
+            <div className="font-medium text-gray-900 mb-1">文件监听</div>
+            <div className="text-xs text-gray-500">监听本地文件变更,实时更新 Agent 上下文。</div>
+          </div>
+          <Toggle checked={fileWatching} onChange={(value) => { handleToggle('fileWatching', value).catch(silentErrorHandler('Workspace')); }} />
+        </div>
+ 
+      </div>
+    </div>
+  );
+}
+ 
+function Toggle({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) {
+  return (
+    <button
+      onClick={() => onChange(!checked)}
+      className={`w-11 h-6 rounded-full transition-colors relative flex-shrink-0 mt-1 ${checked ? 'bg-orange-500' : 'bg-gray-300'}`}
+    >
+      <span className={`block w-5 h-5 bg-white rounded-full shadow-sm absolute top-0.5 transition-all ${checked ? 'left-5' : 'left-0.5'}`} />
+    </button>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Settings/index.html b/desktop/coverage/src/components/Settings/index.html new file mode 100644 index 0000000..028caaa --- /dev/null +++ b/desktop/coverage/src/components/Settings/index.html @@ -0,0 +1,281 @@ + + + + + + Code coverage report for src/components/Settings + + + + + + + + + +
+
+

All files src/components/Settings

+
+ +
+ 0% + Statements + 0/1892 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 0% + Lines + 0/1892 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
About.tsx +
+
0%0/400%0/10%0/10%0/40
Credits.tsx +
+
0%0/560%0/10%0/10%0/56
General.tsx +
+
0%0/1690%0/10%0/10%0/169
IMChannels.tsx +
+
0%0/3230%0/10%0/10%0/323
MCPServices.tsx +
+
0%0/500%0/10%0/10%0/50
ModelsAPI.tsx +
+
0%0/3320%0/10%0/10%0/332
Privacy.tsx +
+
0%0/670%0/10%0/10%0/67
SecureStorage.tsx +
+
0%0/2930%0/10%0/10%0/293
SettingsLayout.tsx +
+
0%0/1350%0/10%0/10%0/135
Skills.tsx +
+
0%0/1940%0/10%0/10%0/194
UsageStats.tsx +
+
0%0/1480%0/10%0/10%0/148
Workspace.tsx +
+
0%0/850%0/10%0/10%0/85
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/Sidebar.tsx.html b/desktop/coverage/src/components/Sidebar.tsx.html new file mode 100644 index 0000000..a8baa8c --- /dev/null +++ b/desktop/coverage/src/components/Sidebar.tsx.html @@ -0,0 +1,592 @@ + + + + + + Code coverage report for src/components/Sidebar.tsx + + + + + + + + + +
+
+

All files / src/components Sidebar.tsx

+
+ +
+ 0% + Statements + 0/117 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/117 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Users, Bot, Zap, Layers, Package,
+  Search, Sparkles, ChevronRight, X
+} from 'lucide-react';
+import { CloneManager } from './CloneManager';
+import { TeamList } from './TeamList';
+import { useConfigStore } from '../store/configStore';
+import { containerVariants, defaultTransition } from '../lib/animations';
+ 
+export type MainViewType = 'chat' | 'automation' | 'team' | 'swarm' | 'skills';
+ 
+interface SidebarProps {
+  onOpenSettings?: () => void;
+  onMainViewChange?: (view: MainViewType) => void;
+  selectedTeamId?: string;
+  onSelectTeam?: (teamId: string) => void;
+  onNewChat?: () => void;
+}
+ 
+type Tab = 'chat' | 'clones' | 'automation' | 'team' | 'swarm' | 'skills';
+ 
+// 导航项配置 - WorkBuddy 风格
+const NAV_ITEMS: {
+  key: Tab;
+  label: string;
+  icon: React.ComponentType<{ className?: string }>;
+  mainView?: MainViewType;
+}[] = [
+  { key: 'clones', label: '分身', icon: Bot },
+  { key: 'automation', label: '自动化', icon: Zap, mainView: 'automation' },
+  { key: 'skills', label: '技能', icon: Package, mainView: 'skills' },
+  { key: 'team', label: '团队', icon: Users, mainView: 'team' },
+  { key: 'swarm', label: '协作', icon: Layers, mainView: 'swarm' },
+];
+ 
+export function Sidebar({
+  onOpenSettings,
+  onMainViewChange,
+  selectedTeamId,
+  onSelectTeam,
+  onNewChat
+}: SidebarProps) {
+  const [activeTab, setActiveTab] = useState<Tab>('clones');
+  const [searchQuery, setSearchQuery] = useState('');
+  const userName = useConfigStore((state) => state.quickConfig?.userName) || '用户7141';
+ 
+  const handleNavClick = (key: Tab, mainView?: MainViewType) => {
+    setActiveTab(key);
+    if (mainView && onMainViewChange) {
+      onMainViewChange(mainView);
+    } else if (onMainViewChange) {
+      onMainViewChange('chat');
+    }
+  };
+ 
+  const handleSelectTeam = (teamId: string) => {
+    onSelectTeam?.(teamId);
+    setActiveTab('team');
+    onMainViewChange?.('team');
+  };
+ 
+  return (
+    <aside className="w-64 bg-white dark:bg-gray-900 border-r border-gray-200 dark:border-gray-700 flex flex-col flex-shrink-0">
+      {/* 搜索框 */}
+      <div className="p-3 border-b border-gray-100 dark:border-gray-800">
+        <div className="relative">
+          <Search className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 w-4 h-4" />
+          <input
+            type="text"
+            placeholder="搜索..."
+            value={searchQuery}
+            onChange={(e) => setSearchQuery(e.target.value)}
+            className="w-full pl-9 pr-8 py-2 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg text-sm focus:outline-none focus:border-gray-400 focus:ring-1 focus:ring-gray-400 transition-all text-gray-700 dark:text-gray-300 placeholder-gray-400"
+          />
+          {searchQuery && (
+            <button
+              onClick={() => setSearchQuery('')}
+              className="absolute right-2 top-1/2 -translate-y-1/2 p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded text-gray-400 transition-colors"
+            >
+              <X className="w-3 h-3" />
+            </button>
+          )}
+        </div>
+      </div>
+ 
+      {/* 新对话按钮 */}
+      <div className="px-3 py-2">
+        <button
+          onClick={() => {
+            setActiveTab('clones');
+            onNewChat?.();
+          }}
+          className="w-full flex items-center gap-3 px-3 py-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg text-gray-700 dark:text-gray-300 transition-colors group"
+        >
+          <Sparkles className="w-5 h-5 text-gray-500" />
+          <span className="font-medium">新对话</span>
+        </button>
+      </div>
+ 
+      {/* 导航项 */}
+      <nav className="px-3 space-y-0.5">
+        {NAV_ITEMS.map(({ key, label, icon: Icon, mainView }) => (
+          <button
+            key={key}
+            onClick={() => handleNavClick(key, mainView)}
+            className={`w-full flex items-center gap-3 px-3 py-2 rounded-lg transition-colors ${
+              activeTab === key
+                ? 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-medium'
+                : 'text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800/50 hover:text-gray-900 dark:hover:text-gray-200'
+            }`}
+          >
+            <Icon className={`w-5 h-5 ${activeTab === key ? 'text-gray-700 dark:text-gray-300' : 'text-gray-400'}`} />
+            <span>{label}</span>
+            {activeTab === key && (
+              <ChevronRight className="w-4 h-4 ml-auto text-gray-400" />
+            )}
+          </button>
+        ))}
+      </nav>
+ 
+      {/* 分隔线 */}
+      <div className="my-3 mx-3 border-t border-gray-100 dark:border-gray-800" />
+ 
+      {/* 内容区域 - 只显示分身、团队、协作的内容,自动化和技能在主内容区显示 */}
+      <div className="flex-1 overflow-hidden">
+        <AnimatePresence mode="wait">
+          <motion.div
+            key={activeTab}
+            variants={containerVariants}
+            initial="hidden"
+            animate="visible"
+            exit="exit"
+            transition={defaultTransition}
+            className="h-full overflow-y-auto"
+          >
+            {activeTab === 'clones' && <CloneManager />}
+            {/* skills、automation 和 swarm 不在侧边栏显示内容,由主内容区显示 */}
+            {activeTab === 'team' && (
+              <TeamList
+                selectedTeamId={selectedTeamId}
+                onSelectTeam={handleSelectTeam}
+              />
+            )}
+          </motion.div>
+        </AnimatePresence>
+      </div>
+ 
+      {/* 底部用户栏 */}
+      <div className="p-3 border-t border-gray-200 dark:border-gray-700">
+        <button
+          onClick={onOpenSettings}
+          aria-label="打开设置"
+          title="设置"
+          className="flex items-center gap-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 p-2 rounded-lg transition-colors"
+        >
+          <div className="w-8 h-8 bg-gray-600 rounded-full flex items-center justify-center text-white font-bold shadow-sm">
+            {userName?.charAt(0) || '用'}
+          </div>
+          <span className="flex-1 text-left text-sm font-medium text-gray-700 dark:text-gray-300 truncate">
+            {userName}
+          </span>
+          <ChevronRight className="w-4 h-4 text-gray-400" />
+        </button>
+      </div>
+    </aside>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SkillMarket.tsx.html b/desktop/coverage/src/components/SkillMarket.tsx.html new file mode 100644 index 0000000..de88448 --- /dev/null +++ b/desktop/coverage/src/components/SkillMarket.tsx.html @@ -0,0 +1,1360 @@ + + + + + + Code coverage report for src/components/SkillMarket.tsx + + + + + + + + + +
+
+

All files / src/components SkillMarket.tsx

+
+ +
+ 0% + Statements + 0/291 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/291 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * SkillMarket - Skill browsing, search, and management UI
+ *
+ * Displays available skills (12 built-in + custom), allows users to:
+ * - Browse skills by category
+ * - Search skills by keyword/capability
+ * - View skill details and capabilities
+ * - Install/uninstall skills (with L4 autonomy integration)
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { useState, useEffect, useMemo, useCallback } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Search,
+  Package,
+  Check,
+  Plus,
+  Minus,
+  Tag,
+  Layers,
+  ChevronDown,
+  ChevronRight,
+  RefreshCw,
+} from 'lucide-react';
+import { useConfigStore } from '../store/configStore';
+import { useConnectionStore } from '../store/connectionStore';
+import {
+  adaptSkillsCatalog,
+  type SkillDisplay,
+} from '../lib/skill-adapter';
+ 
+// === Types ===
+ 
+interface SkillMarketProps {
+  className?: string;
+  onSkillInstall?: (skill: SkillDisplay) => void;
+  onSkillUninstall?: (skill: SkillDisplay) => void;
+}
+ 
+type CategoryFilter = 'all' | 'development' | 'security' | 'analytics' | 'content' | 'ops' | 'management' | 'testing' | 'business' | 'marketing';
+ 
+// === Category Config ===
+ 
+const CATEGORY_CONFIG: Record<string, { label: string; color: string; bgColor: string }> = {
+  development: { label: '开发', color: 'text-blue-600 dark:text-blue-400', bgColor: 'bg-blue-100 dark:bg-blue-900/30' },
+  security: { label: '安全', color: 'text-red-600 dark:text-red-400', bgColor: 'bg-red-100 dark:bg-red-900/30' },
+  analytics: { label: '分析', color: 'text-purple-600 dark:text-purple-400', bgColor: 'bg-purple-100 dark:bg-purple-900/30' },
+  content: { label: '内容', color: 'text-pink-600 dark:text-pink-400', bgColor: 'bg-pink-100 dark:bg-pink-900/30' },
+  ops: { label: '运维', color: 'text-orange-600 dark:text-orange-400', bgColor: 'bg-orange-100 dark:bg-orange-900/30' },
+  management: { label: '管理', color: 'text-cyan-600 dark:text-cyan-400', bgColor: 'bg-cyan-100 dark:bg-cyan-900/30' },
+  testing: { label: '测试', color: 'text-green-600 dark:text-green-400', bgColor: 'bg-green-100 dark:bg-green-900/30' },
+  business: { label: '商业', color: 'text-yellow-600 dark:text-yellow-400', bgColor: 'bg-yellow-100 dark:bg-yellow-900/30' },
+  marketing: { label: '营销', color: 'text-indigo-600 dark:text-indigo-400', bgColor: 'bg-indigo-100 dark:bg-indigo-900/30' },
+};
+ 
+// === Components ===
+ 
+function CategoryBadge({ category }: { category?: string }) {
+  if (!category) return null;
+  const config = CATEGORY_CONFIG[category] || {
+    label: category,
+    color: 'text-gray-600 dark:text-gray-400',
+    bgColor: 'bg-gray-100 dark:bg-gray-800',
+  };
+  return (
+    <span className={`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs ${config.bgColor} ${config.color}`}>
+      <Tag className="w-3 h-3" />
+      {config.label}
+    </span>
+  );
+}
+ 
+function SkillCard({
+  skill,
+  isExpanded,
+  onToggle,
+  onInstall,
+  onUninstall,
+}: {
+  skill: SkillDisplay;
+  isExpanded: boolean;
+  onToggle: () => void;
+  onInstall: () => void;
+  onUninstall: () => void;
+}) {
+  const config = CATEGORY_CONFIG[skill.category || ''] || CATEGORY_CONFIG.development;
+ 
+  return (
+    <div
+      className={`border rounded-lg overflow-hidden transition-all ${
+        skill.installed
+          ? 'border-green-200 dark:border-green-800 bg-green-50/50 dark:bg-green-900/10'
+          : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+      }`}
+    >
+      <button
+        onClick={onToggle}
+        className="w-full p-4 text-left hover:bg-gray-50 dark:hover:bg-gray-800/30 transition-colors"
+      >
+        <div className="flex items-start justify-between gap-3">
+          <div className="flex-1 min-w-0">
+            <div className="flex items-center gap-2 mb-1">
+              <Package className={`w-4 h-4 ${config.color}`} />
+              <h3 className="text-sm font-medium text-gray-900 dark:text-gray-100">
+                {skill.name}
+              </h3>
+              {skill.installed && (
+                <span className="flex items-center gap-1 text-xs text-green-600 dark:text-green-400">
+                  <Check className="w-3 h-3" />
+                  已安装
+                </span>
+              )}
+            </div>
+            <p className="text-xs text-gray-500 dark:text-gray-400 line-clamp-2">
+              {skill.description}
+            </p>
+            <div className="flex flex-wrap gap-1 mt-2">
+              <CategoryBadge category={skill.category} />
+              {skill.capabilities.slice(0, 3).map((cap) => (
+                <span
+                  key={cap}
+                  className="px-1.5 py-0.5 text-xs bg-gray-100 dark:bg-gray-800 text-gray-500 dark:text-gray-400 rounded"
+                >
+                  {cap}
+                </span>
+              ))}
+              {skill.capabilities.length > 3 && (
+                <span className="text-xs text-gray-400 dark:text-gray-500">
+                  +{skill.capabilities.length - 3}
+                </span>
+              )}
+            </div>
+          </div>
+          <div className="flex items-center gap-2">
+            {isExpanded ? (
+              <ChevronDown className="w-4 h-4 text-gray-400" />
+            ) : (
+              <ChevronRight className="w-4 h-4 text-gray-400" />
+            )}
+          </div>
+        </div>
+      </button>
+ 
+      <AnimatePresence>
+        {isExpanded && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-t border-gray-200 dark:border-gray-700"
+          >
+            <div className="p-4 space-y-4">
+              {/* Triggers */}
+              <div>
+                <h4 className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">
+                  触发词
+                </h4>
+                <div className="flex flex-wrap gap-1">
+                  {skill.triggers.map((trigger) => (
+                    <span
+                      key={trigger}
+                      className="px-2 py-0.5 text-xs bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 rounded"
+                    >
+                      {trigger}
+                    </span>
+                  ))}
+                </div>
+              </div>
+ 
+              {/* Capabilities */}
+              <div>
+                <h4 className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">
+                  能力
+                </h4>
+                <div className="flex flex-wrap gap-1">
+                  {skill.capabilities.map((cap) => (
+                    <span
+                      key={cap}
+                      className="px-2 py-0.5 text-xs bg-purple-50 dark:bg-purple-900/20 text-purple-600 dark:text-purple-400 rounded"
+                    >
+                      {cap}
+                    </span>
+                  ))}
+                </div>
+              </div>
+ 
+              {/* Tool Dependencies */}
+              {skill.toolDeps.length > 0 && (
+                <div>
+                  <h4 className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">
+                    工具依赖
+                  </h4>
+                  <div className="flex flex-wrap gap-1">
+                    {skill.toolDeps.map((dep) => (
+                      <span
+                        key={dep}
+                        className="px-2 py-0.5 text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 rounded font-mono"
+                      >
+                        {dep}
+                      </span>
+                    ))}
+                  </div>
+                </div>
+              )}
+ 
+              {/* Actions */}
+              <div className="flex justify-end gap-2 pt-2 border-t border-gray-100 dark:border-gray-800">
+                {skill.installed ? (
+                  <button
+                    onClick={(e) => {
+                      e.stopPropagation();
+                      onUninstall();
+                    }}
+                    className="flex items-center gap-1.5 px-3 py-1.5 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-lg transition-colors"
+                  >
+                    <Minus className="w-4 h-4" />
+                    卸载
+                  </button>
+                ) : (
+                  <button
+                    onClick={(e) => {
+                      e.stopPropagation();
+                      onInstall();
+                    }}
+                    className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-gray-700 dark:bg-gray-600 hover:bg-gray-800 dark:hover:bg-gray-500 text-white rounded-lg transition-colors"
+                  >
+                    <Plus className="w-4 h-4" />
+                    安装
+                  </button>
+                )}
+              </div>
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function SkillMarket({
+  className = '',
+  onSkillInstall,
+  onSkillUninstall,
+}: SkillMarketProps) {
+  // Use configStore instead of SkillDiscoveryEngine
+  const skillsCatalog = useConfigStore((s) => s.skillsCatalog);
+  const loadSkillsCatalog = useConfigStore((s) => s.loadSkillsCatalog);
+  const updateSkill = useConfigStore((s) => s.updateSkill);
+ 
+  // Watch connection state to reload skills when connected
+  const connectionState = useConnectionStore((s) => s.connectionState);
+ 
+  const [searchQuery, setSearchQuery] = useState('');
+  const [categoryFilter, setCategoryFilter] = useState<CategoryFilter>('all');
+  const [expandedSkillId, setExpandedSkillId] = useState<string | null>(null);
+  const [isRefreshing, setIsRefreshing] = useState(false);
+ 
+  // Adapt skills to display format
+  const skills = useMemo(() => adaptSkillsCatalog(skillsCatalog), [skillsCatalog]);
+ 
+  // Load skills on mount and when connection state changes to 'connected'
+  useEffect(() => {
+    if (connectionState === 'connected') {
+      loadSkillsCatalog();
+    }
+  }, [loadSkillsCatalog, connectionState]);
+ 
+  // Filter skills
+  const filteredSkills = useMemo(() => {
+    let result = skills;
+ 
+    // Category filter
+    if (categoryFilter !== 'all') {
+      result = result.filter((s) => s.category === categoryFilter);
+    }
+ 
+    // Search filter
+    if (searchQuery.trim()) {
+      const queryLower = searchQuery.toLowerCase();
+      result = result.filter((s) =>
+        s.name.toLowerCase().includes(queryLower) ||
+        s.description.toLowerCase().includes(queryLower) ||
+        s.triggers.some((t) => t.toLowerCase().includes(queryLower)) ||
+        s.capabilities.some((c) => c.toLowerCase().includes(queryLower))
+      );
+    }
+ 
+    return result;
+  }, [skills, categoryFilter, searchQuery]);
+ 
+  // Get categories from skills
+  const categories = useMemo(() => {
+    const cats = new Set(skills.map((s) => s.category).filter(Boolean));
+    return ['all', ...Array.from(cats)] as CategoryFilter[];
+  }, [skills]);
+ 
+  // Stats
+  const stats = useMemo(() => {
+    const installed = skills.filter((s) => s.installed).length;
+    return { total: skills.length, installed };
+  }, [skills]);
+ 
+  const handleRefresh = useCallback(async () => {
+    setIsRefreshing(true);
+    await loadSkillsCatalog();
+    setIsRefreshing(false);
+  }, [loadSkillsCatalog]);
+ 
+  const handleInstall = useCallback(
+    async (skill: SkillDisplay) => {
+      // Update skill via configStore (persists to backend)
+      await updateSkill(skill.id, { enabled: true });
+      onSkillInstall?.(skill);
+    },
+    [updateSkill, onSkillInstall]
+  );
+ 
+  const handleUninstall = useCallback(
+    async (skill: SkillDisplay) => {
+      // Update skill via configStore (persists to backend)
+      await updateSkill(skill.id, { enabled: false });
+      onSkillUninstall?.(skill);
+    },
+    [updateSkill, onSkillUninstall]
+  );
+ 
+  const handleSearch = useCallback((query: string) => {
+    setSearchQuery(query);
+  }, []);
+ 
+  return (
+    <div className={`flex flex-col h-full ${className}`}>
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Package className="w-5 h-5 text-purple-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-gray-100">技能市场</h2>
+        </div>
+        <div className="flex items-center gap-2">
+          <button
+            onClick={handleRefresh}
+            disabled={isRefreshing}
+            className="p-1.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 disabled:opacity-50"
+            title="刷新"
+          >
+            <RefreshCw className={`w-4 h-4 ${isRefreshing ? 'animate-spin' : ''}`} />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Stats Bar */}
+      <div className="flex items-center gap-4 px-4 py-2 bg-gray-50 dark:bg-gray-800/50 border-b border-gray-200 dark:border-gray-700 text-xs">
+        <span className="text-gray-500 dark:text-gray-400">
+          总计: <span className="font-medium text-gray-900 dark:text-gray-100">{stats.total}</span>
+        </span>
+        <span className="text-green-600 dark:text-green-400">
+          已安装: <span className="font-medium">{stats.installed}</span>
+        </span>
+      </div>
+ 
+      {/* Search */}
+      <div className="p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="relative">
+          <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" />
+          <input
+            type="text"
+            value={searchQuery}
+            onChange={(e) => handleSearch(e.target.value)}
+            placeholder="搜索技能、能力、触发词..."
+            className="w-full pl-9 pr-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-gray-400 focus:border-transparent text-sm"
+          />
+        </div>
+ 
+        {/* Suggestions - placeholder for future AI-powered recommendations */}
+ 
+      </div>
+ 
+      {/* Category Filter */}
+      <div className="flex gap-1 px-4 py-2 border-b border-gray-200 dark:border-gray-700 overflow-x-auto">
+        {categories.map((cat) => (
+          <button
+            key={cat}
+            onClick={() => setCategoryFilter(cat)}
+            className={`px-3 py-1 text-xs rounded-full whitespace-nowrap transition-colors ${
+              categoryFilter === cat
+                ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-400'
+                : 'text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'
+            }`}
+          >
+            {cat === 'all' ? '全部' : CATEGORY_CONFIG[cat]?.label || cat}
+          </button>
+        ))}
+      </div>
+ 
+      {/* Skill List */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-3">
+        {filteredSkills.length === 0 ? (
+          <div className="flex flex-col items-center justify-center h-full text-gray-500 dark:text-gray-400">
+            <Layers className="w-8 h-8 mb-2 opacity-50" />
+            <p className="text-sm">
+              {searchQuery ? '未找到匹配的技能' : '暂无技能'}
+            </p>
+          </div>
+        ) : (
+          filteredSkills.map((skill) => (
+            <SkillCard
+              key={skill.id}
+              skill={skill}
+              isExpanded={expandedSkillId === skill.id}
+              onToggle={() => setExpandedSkillId((prev) => (prev === skill.id ? null : skill.id))}
+              onInstall={() => handleInstall(skill)}
+              onUninstall={() => handleUninstall(skill)}
+            />
+          ))
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default SkillMarket;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SkillMarket/SkillCard.tsx.html b/desktop/coverage/src/components/SkillMarket/SkillCard.tsx.html new file mode 100644 index 0000000..dba44f3 --- /dev/null +++ b/desktop/coverage/src/components/SkillMarket/SkillCard.tsx.html @@ -0,0 +1,718 @@ + + + + + + Code coverage report for src/components/SkillMarket/SkillCard.tsx + + + + + + + + + +
+
+

All files / src/components/SkillMarket SkillCard.tsx

+
+ +
+ 0% + Statements + 0/137 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * * SkillCard - 技能卡片组件
+ *
+ * * 展示单个技能的基本信息,包括名称、描述、能力和安装状态
+ */
+ 
+import { motion } from 'framer-motion';
+import {
+  Package,
+  Check,
+  Star,
+  MoreHorizontal,
+  Clock,
+} from 'lucide-react';
+import type { Skill } from '../../types/skill-market';
+import { useState } from 'react';
+ 
+// === 类型定义 ===
+ 
+interface SkillCardProps {
+  /** 技能数据 */
+  skill: Skill;
+  /** 是否选中 */
+  isSelected?: boolean;
+  /** 点击回调 */
+  onClick?: () => void;
+  /** 安装/卸载回调 */
+  onToggleInstall?: () => void;
+  /** 显示更多操作 */
+  onShowMore?: () => void;
+}
+ 
+// === 分类配置 ===
+ 
+const CATEGORY_CONFIG: Record<string, { color: string; bgColor: string }> = {
+  development: { color: 'text-blue-600 dark:text-blue-400', bgColor: 'bg-blue-100 dark:bg-blue-900/30' },
+  security: { color: 'text-red-600 dark:text-red-400', bgColor: 'bg-red-100 dark:bg-red-900/30' },
+  analytics: { color: 'text-purple-600 dark:text-purple-400', bgColor: 'bg-purple-100 dark:bg-purple-900/30' },
+  content: { color: 'text-pink-600 dark:text-pink-400', bgColor: 'bg-pink-100 dark:bg-pink-900/30' },
+  ops: { color: 'text-orange-600 dark:text-orange-400', bgColor: 'bg-orange-100 dark:bg-orange-900/30' },
+  management: { color: 'text-cyan-600 dark:text-cyan-400', bgColor: 'bg-cyan-100 dark:bg-cyan-900/30' },
+  testing: { color: 'text-emerald-600 dark:text-emerald-400', bgColor: 'bg-emerald-100 dark:bg-emerald-900/30' },
+  business: { color: 'text-amber-600 dark:text-amber-400', bgColor: 'bg-amber-100 dark:bg-amber-900/30' },
+  marketing: { color: 'text-rose-600 dark:text-rose-400', bgColor: 'bg-rose-100 dark:bg-rose-900/30' },
+};
+ 
+// === 分类名称映射 ===
+ 
+const CATEGORY_NAMES: Record<string, string> = {
+  development: '开发',
+  security: '安全',
+  analytics: '分析',
+  content: '内容',
+  ops: '运维',
+  management: '管理',
+  testing: '测试',
+  business: '商务',
+  marketing: '营销',
+};
+ 
+/**
+ * SkillCard - 技能卡片组件
+ */
+export function SkillCard({
+  skill,
+  isSelected = false,
+  onClick,
+  onToggleInstall,
+  onShowMore,
+}: SkillCardProps) {
+  const [isHovered, setIsHovered] = useState(false);
+  const categoryConfig = CATEGORY_CONFIG[skill.category] || {
+    color: 'text-gray-600 dark:text-gray-400',
+    bgColor: 'bg-gray-100 dark:bg-gray-800/30',
+  };
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, y: 10 }}
+      animate={{ opacity: 1, y: 0 }}
+      whileHover={{ scale: 1.02 }}
+      onHoverStart={() => setIsHovered(true)}
+      onHoverEnd={() => setIsHovered(false)}
+      onClick={onClick}
+      className={`
+        relative p-4 rounded-lg border cursor-pointer transition-all duration-200
+        ${isSelected
+          ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20'
+          : 'border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600'
+        }
+      `}
+    >
+      {/* 顶部:图标和名称 */}
+      <div className="flex items-start justify-between mb-2">
+        <div className="flex items-center gap-2">
+          <div
+            className={`w-10 h-10 rounded-lg flex items-center justify-center ${categoryConfig.bgColor}`}
+          >
+            <Package className={`w-5 h-5 ${categoryConfig.color}`} />
+          </div>
+          <div>
+            <h3 className="text-sm font-semibold text-gray-900 dark:text-gray-100">
+              {skill.name}
+            </h3>
+            <p className="text-xs text-gray-500 dark:text-gray-400">
+              {skill.author || '官方'}
+            </p>
+          </div>
+        </div>
+ 
+        {/* 安装按钮 */}
+        <motion.button
+          whileHover={{ scale: 1.1 }}
+          whileTap={{ scale: 0.95 }}
+          onClick={(e) => {
+            e.stopPropagation();
+            onToggleInstall?.();
+          }}
+          className={`
+            px-3 py-1.5 rounded-lg text-xs font-medium transition-all duration-200
+            ${skill.installed
+              ? 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600'
+              : 'bg-gray-700 dark:bg-gray-600 text-white hover:bg-gray-800 dark:hover:bg-gray-500'
+            }
+          `}
+        >
+          {skill.installed ? (
+            <span className="flex items-center gap-1">
+              <Check className="w-3 h-3" />
+              已安装
+            </span>
+          ) : (
+            <span className="flex items-center gap-1">
+              <Package className="w-3 h-3" />
+              安装
+            </span>
+          )}
+        </motion.button>
+      </div>
+ 
+      {/* 描述 */}
+      <p className="text-xs text-gray-600 dark:text-gray-300 mb-3 line-clamp-2">
+        {skill.description}
+      </p>
+ 
+      {/* 标签和能力 */}
+      <div className="flex flex-wrap gap-1 mb-3">
+        {skill.capabilities.slice(0, 3).map((cap) => (
+          <span
+            key={cap}
+            className="px-2 py-0.5 rounded text-xs bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400"
+          >
+            {cap}
+          </span>
+        ))}
+        {skill.capabilities.length > 3 && (
+          <span className="px-2 py-0.5 rounded text-xs bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400">
+            +{skill.capabilities.length - 3}
+          </span>
+        )}
+      </div>
+ 
+      {/* 底部:分类、评分和统计 */}
+      <div className="flex items-center justify-between pt-2 border-t border-gray-100 dark:border-gray-700">
+        <span
+          className={`px-2 py-0.5 rounded text-xs ${categoryConfig.bgColor} ${categoryConfig.color}`}
+        >
+          {CATEGORY_NAMES[skill.category] || skill.category}
+        </span>
+ 
+        <div className="flex items-center gap-3 text-xs text-gray-500 dark:text-gray-400">
+          {skill.rating !== undefined && (
+            <span className="flex items-center gap-1">
+              <Star className="w-3 h-3 text-yellow-500 fill-current" />
+              {skill.rating.toFixed(1)}
+            </span>
+          )}
+          {skill.reviewCount !== undefined && skill.reviewCount > 0 && (
+            <span>{skill.reviewCount} 评价</span>
+          )}
+          {skill.installedAt && (
+            <span className="flex items-center gap-1">
+              <Clock className="w-3 h-3" />
+              {new Date(skill.installedAt).toLocaleDateString()}
+            </span>
+          )}
+        </div>
+      </div>
+ 
+      {/* 悬停时显示更多按钮 */}
+      <motion.div
+        initial={{ opacity: 0 }}
+        animate={{ opacity: isHovered ? 1 : 0 }}
+        className="absolute top-2 right-2"
+      >
+        <button
+          onClick={(e) => {
+            e.stopPropagation();
+            onShowMore?.();
+          }}
+          className="p-1.5 rounded-lg bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors"
+          title="更多操作"
+        >
+          <MoreHorizontal className="w-4 h-4" />
+        </button>
+      </motion.div>
+    </motion.div>
+  );
+}
+ 
+ export default SkillCard;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SkillMarket/index.html b/desktop/coverage/src/components/SkillMarket/index.html new file mode 100644 index 0000000..81035ae --- /dev/null +++ b/desktop/coverage/src/components/SkillMarket/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/components/SkillMarket + + + + + + + + + +
+
+

All files src/components/SkillMarket

+
+ +
+ 0% + Statements + 0/137 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
SkillCard.tsx +
+
0%0/1370%0/10%0/10%0/137
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/SwarmDashboard.tsx.html b/desktop/coverage/src/components/SwarmDashboard.tsx.html new file mode 100644 index 0000000..6c3f8c0 --- /dev/null +++ b/desktop/coverage/src/components/SwarmDashboard.tsx.html @@ -0,0 +1,1855 @@ + + + + + + Code coverage report for src/components/SwarmDashboard.tsx + + + + + + + + + +
+
+

All files / src/components SwarmDashboard.tsx

+
+ +
+ 0% + Statements + 0/448 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/448 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * SwarmDashboard - Multi-Agent Collaboration Task Dashboard
+ *
+ * Visualizes swarm tasks, multi-agent collaboration) with real-time
+ * status updates, task history, and manual trigger functionality.
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { useState, useEffect, useCallback, useMemo } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  Users,
+  Play,
+  CheckCircle,
+  XCircle,
+  Clock,
+  ChevronDown,
+  ChevronRight,
+  Layers,
+  GitBranch,
+  MessageSquare,
+  RefreshCw,
+  Plus,
+  History,
+  Sparkles,
+} from 'lucide-react';
+import {
+  AgentSwarm,
+  type SwarmTask,
+  type Subtask,
+  type SwarmTaskStatus,
+  type CommunicationStyle,
+} from '../lib/agent-swarm';
+import { useAgentStore } from '../store/agentStore';
+ 
+// === Types ===
+ 
+interface SwarmDashboardProps {
+  className?: string;
+  onTaskSelect?: (task: SwarmTask) => void;
+}
+ 
+type FilterType = 'all' | 'active' | 'completed' | 'failed';
+ 
+// === Status Config ===
+ 
+const TASK_STATUS_CONFIG: Record<SwarmTaskStatus, { label: string; className: string; dotClass: string; icon: typeof CheckCircle }> = {
+  planning: {
+    label: '规划中',
+    className: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',
+    dotClass: 'bg-purple-500',
+    icon: Layers,
+  },
+  executing: {
+    label: '执行中',
+    className: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',
+    dotClass: 'bg-blue-500 animate-pulse',
+    icon: Play,
+  },
+  aggregating: {
+    label: '汇总中',
+    className: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400',
+    dotClass: 'bg-cyan-500 animate-pulse',
+    icon: RefreshCw,
+  },
+  done: {
+    label: '已完成',
+    className: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+    dotClass: 'bg-green-500',
+    icon: CheckCircle,
+  },
+  failed: {
+    label: '失败',
+    className: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+    dotClass: 'bg-red-500',
+    icon: XCircle,
+  },
+};
+ 
+const SUBTASK_STATUS_CONFIG: Record<string, { label: string; dotClass: string }> = {
+  pending: { label: '待执行', dotClass: 'bg-gray-400' },
+  running: { label: '执行中', dotClass: 'bg-blue-500 animate-pulse' },
+  done: { label: '完成', dotClass: 'bg-green-500' },
+  failed: { label: '失败', dotClass: 'bg-red-500' },
+};
+ 
+const COMMUNICATION_STYLE_CONFIG: Record<CommunicationStyle, { label: string; icon: typeof Users; description: string }> = {
+  sequential: {
+    label: '顺序执行',
+    icon: GitBranch,
+    description: '每个 Agent 依次处理,输出传递给下一个',
+  },
+  parallel: {
+    label: '并行执行',
+    icon: Layers,
+    description: '多个 Agent 同时处理不同子任务',
+  },
+  debate: {
+    label: '辩论模式',
+    icon: MessageSquare,
+    description: '多个 Agent 提供观点,协调者综合',
+  },
+};
+ 
+// === Components ===
+ 
+function TaskStatusBadge({ status }: { status: SwarmTaskStatus }) {
+  const config = TASK_STATUS_CONFIG[status];
+  const Icon = config.icon;
+  return (
+    <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium ${config.className}`}>
+      <Icon className="w-3 h-3" />
+      {config.label}
+    </span>
+  );
+}
+ 
+function SubtaskStatusDot({ status }: { status: string }) {
+  const config = SUBTASK_STATUS_CONFIG[status] || SUBTASK_STATUS_CONFIG.pending;
+  return <span className={`w-2 h-2 rounded-full ${config.dotClass}`} title={config.label} />;
+}
+ 
+function CommunicationStyleBadge({ style }: { style: CommunicationStyle }) {
+  const config = COMMUNICATION_STYLE_CONFIG[style];
+  const Icon = config.icon;
+  return (
+    <span
+      className="inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400"
+      title={config.description}
+    >
+      <Icon className="w-3 h-3" />
+      {config.label}
+    </span>
+  );
+}
+ 
+function SubtaskItem({
+  subtask,
+  agentName,
+  isExpanded,
+  onToggle,
+}: {
+  subtask: Subtask;
+  agentName: string;
+  isExpanded: boolean;
+  onToggle: () => void;
+}) {
+  const duration = useMemo(() => {
+    if (!subtask.startedAt) return null;
+    const start = new Date(subtask.startedAt).getTime();
+    const end = subtask.completedAt ? new Date(subtask.completedAt).getTime() : Date.now();
+    return Math.round((end - start) / 1000);
+  }, [subtask.startedAt, subtask.completedAt]);
+ 
+  return (
+    <div className="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden">
+      <button
+        onClick={onToggle}
+        className="w-full flex items-center gap-3 px-3 py-2 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors text-left"
+      >
+        <SubtaskStatusDot status={subtask.status} />
+        <div className="flex-1 min-w-0">
+          <div className="text-sm font-medium text-gray-900 dark:text-gray-100 truncate">
+            {subtask.description}
+          </div>
+          <div className="text-xs text-gray-500 dark:text-gray-400">
+            分配给: {agentName}
+            {duration !== null && <span className="ml-2">· {duration}s</span>}
+          </div>
+        </div>
+        {isExpanded ? (
+          <ChevronDown className="w-4 h-4 text-gray-400" />
+        ) : (
+          <ChevronRight className="w-4 h-4 text-gray-400" />
+        )}
+      </button>
+ 
+      <AnimatePresence>
+        {isExpanded && subtask.result && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-t border-gray-200 dark:border-gray-700"
+          >
+            <div className="p-3 text-sm text-gray-600 dark:text-gray-300 whitespace-pre-wrap max-h-40 overflow-y-auto">
+              {subtask.result}
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+ 
+      {subtask.error && (
+        <div className="px-3 py-2 bg-red-50 dark:bg-red-900/20 border-t border-gray-200 dark:border-gray-700">
+          <p className="text-xs text-red-600 dark:text-red-400">{subtask.error}</p>
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+function TaskCard({
+  task,
+  isSelected,
+  onSelect,
+}: {
+  task: SwarmTask;
+  isSelected: boolean;
+  onSelect: () => void;
+}) {
+  const [expandedSubtasks, setExpandedSubtasks] = useState<Set<string>>(new Set());
+  const { clones } = useAgentStore();
+ 
+  const toggleSubtask = useCallback((subtaskId: string) => {
+    setExpandedSubtasks((prev) => {
+      const next = new Set(prev);
+      if (next.has(subtaskId)) {
+        next.delete(subtaskId);
+      } else {
+        next.add(subtaskId);
+      }
+      return next;
+    });
+  }, []);
+ 
+  const completedCount = task.subtasks.filter((s) => s.status === 'done').length;
+  const totalDuration = useMemo(() => {
+    if (!task.completedAt) return null;
+    const start = new Date(task.createdAt).getTime();
+    const end = new Date(task.completedAt).getTime();
+    return Math.round((end - start) / 1000);
+  }, [task.createdAt, task.completedAt]);
+ 
+  const getAgentName = (agentId: string) => {
+    const agent = clones.find((a) => a.id === agentId);
+    return agent?.name || agentId;
+  };
+ 
+  return (
+    <div
+      className={`border rounded-lg overflow-hidden transition-all ${
+        isSelected
+          ? 'border-orange-500 dark:border-orange-400 ring-2 ring-orange-500/20'
+          : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+      }`}
+    >
+      <button
+        onClick={onSelect}
+        className="w-full p-4 text-left hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors"
+      >
+        <div className="flex items-start justify-between gap-3">
+          <div className="flex-1 min-w-0">
+            <div className="flex items-center gap-2 mb-1">
+              <TaskStatusBadge status={task.status} />
+              <CommunicationStyleBadge style={task.communicationStyle} />
+            </div>
+            <h3 className="text-sm font-medium text-gray-900 dark:text-gray-100 truncate">
+              {task.description}
+            </h3>
+            <div className="flex items-center gap-3 mt-1 text-xs text-gray-500 dark:text-gray-400">
+              <span className="flex items-center gap-1">
+                <Users className="w-3 h-3" />
+                {completedCount}/{task.subtasks.length} 子任务
+              </span>
+              {totalDuration !== null && (
+                <span className="flex items-center gap-1">
+                  <Clock className="w-3 h-3" />
+                  {totalDuration}s
+                </span>
+              )}
+              <span>{new Date(task.createdAt).toLocaleString('zh-CN')}</span>
+            </div>
+          </div>
+          {isSelected ? (
+            <ChevronDown className="w-4 h-4 text-gray-400 flex-shrink-0" />
+          ) : (
+            <ChevronRight className="w-4 h-4 text-gray-400 flex-shrink-0" />
+          )}
+        </div>
+      </button>
+ 
+      <AnimatePresence>
+        {isSelected && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-t border-gray-200 dark:border-gray-700"
+          >
+            <div className="p-4 space-y-3">
+              <h4 className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">
+                子任务
+              </h4>
+              <div className="space-y-2">
+                {task.subtasks.map((subtask) => (
+                  <SubtaskItem
+                    key={subtask.id}
+                    subtask={subtask}
+                    agentName={getAgentName(subtask.assignedTo)}
+                    isExpanded={expandedSubtasks.has(subtask.id)}
+                    onToggle={() => toggleSubtask(subtask.id)}
+                  />
+                ))}
+              </div>
+ 
+              {task.finalResult && (
+                <div className="mt-4 p-3 bg-green-50 dark:bg-green-900/20 rounded-lg">
+                  <h4 className="text-xs font-medium text-green-700 dark:text-green-400 mb-1">
+                    最终结果
+                  </h4>
+                  <p className="text-sm text-green-600 dark:text-green-300 whitespace-pre-wrap">
+                    {task.finalResult}
+                  </p>
+                </div>
+              )}
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </div>
+  );
+}
+ 
+function CreateTaskForm({
+  onSubmit,
+  onCancel,
+}: {
+  onSubmit: (description: string, style: CommunicationStyle) => void;
+  onCancel: () => void;
+}) {
+  const [description, setDescription] = useState('');
+  const [style, setStyle] = useState<CommunicationStyle>('sequential');
+ 
+  const handleSubmit = (e: React.FormEvent) => {
+    e.preventDefault();
+    if (description.trim()) {
+      onSubmit(description.trim(), style);
+    }
+  };
+ 
+  return (
+    <form onSubmit={handleSubmit} className="p-4 bg-gray-50 dark:bg-gray-800/50 rounded-lg space-y-4">
+      <div>
+        <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+          任务描述
+        </label>
+        <textarea
+          value={description}
+          onChange={(e) => setDescription(e.target.value)}
+          placeholder="描述需要协作完成的任务..."
+          className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-orange-500 focus:border-transparent text-sm"
+          rows={3}
+        />
+      </div>
+ 
+      <div>
+        <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+          协作模式
+        </label>
+        <div className="grid grid-cols-3 gap-2">
+          {(Object.keys(COMMUNICATION_STYLE_CONFIG) as CommunicationStyle[]).map((s) => {
+            const config = COMMUNICATION_STYLE_CONFIG[s];
+            const Icon = config.icon;
+            return (
+              <button
+                key={s}
+                type="button"
+                onClick={() => setStyle(s)}
+                className={`flex flex-col items-center gap-1 p-2 rounded-lg border transition-all ${
+                  style === s
+                    ? 'border-orange-500 bg-orange-50 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400'
+                    : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600 text-gray-600 dark:text-gray-400'
+                }`}
+              >
+                <Icon className="w-4 h-4" />
+                <span className="text-xs">{config.label}</span>
+              </button>
+            );
+          })}
+        </div>
+      </div>
+ 
+      <div className="flex justify-end gap-2">
+        <button
+          type="button"
+          onClick={onCancel}
+          className="px-3 py-1.5 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100"
+        >
+          取消
+        </button>
+        <button
+          type="submit"
+          disabled={!description.trim()}
+          className="px-4 py-1.5 text-sm bg-orange-500 hover:bg-orange-600 disabled:bg-gray-300 disabled:cursor-not-allowed text-white rounded-lg transition-colors flex items-center gap-1.5"
+        >
+          <Sparkles className="w-4 h-4" />
+          创建任务
+        </button>
+      </div>
+    </form>
+  );
+}
+ 
+// === Main Component ===
+ 
+export function SwarmDashboard({ className = '', onTaskSelect }: SwarmDashboardProps) {
+  const [swarm] = useState(() => new AgentSwarm());
+  const [tasks, setTasks] = useState<SwarmTask[]>([]);
+  const [selectedTaskId, setSelectedTaskId] = useState<string | null>(null);
+  const [filter, setFilter] = useState<FilterType>('all');
+  const [showCreateForm, setShowCreateForm] = useState(false);
+  const [isRefreshing, setIsRefreshing] = useState(false);
+ 
+  // Load tasks from swarm history
+  useEffect(() => {
+    const history = swarm.getHistory();
+    setTasks([...history].reverse()); // Most recent first
+  }, [swarm]);
+ 
+  const filteredTasks = useMemo(() => {
+    switch (filter) {
+      case 'active':
+        return tasks.filter((t) => ['planning', 'executing', 'aggregating'].includes(t.status));
+      case 'completed':
+        return tasks.filter((t) => t.status === 'done');
+      case 'failed':
+        return tasks.filter((t) => t.status === 'failed');
+      default:
+        return tasks;
+    }
+  }, [tasks, filter]);
+ 
+  const stats = useMemo(() => {
+    const active = tasks.filter((t) => ['planning', 'executing', 'aggregating'].includes(t.status)).length;
+    const completed = tasks.filter((t) => t.status === 'done').length;
+    const failed = tasks.filter((t) => t.status === 'failed').length;
+    return { total: tasks.length, active, completed, failed };
+  }, [tasks]);
+ 
+  const handleRefresh = useCallback(async () => {
+    setIsRefreshing(true);
+    // Simulate refresh delay
+    await new Promise((resolve) => setTimeout(resolve, 500));
+    const history = swarm.getHistory();
+    setTasks([...history].reverse());
+    setIsRefreshing(false);
+  }, [swarm]);
+ 
+  const handleCreateTask = useCallback(
+    (description: string, style: CommunicationStyle) => {
+      const task = swarm.createTask(description, { communicationStyle: style });
+      setTasks((prev) => [task, ...prev]);
+      setSelectedTaskId(task.id);
+      setShowCreateForm(false);
+      onTaskSelect?.(task);
+ 
+      // Note: Actual execution should be triggered via chatStore.dispatchSwarmTask
+      console.log('[SwarmDashboard] Task created:', task.id, 'Style:', style);
+    },
+    [swarm, onTaskSelect]
+  );
+ 
+  const handleSelectTask = useCallback(
+    (taskId: string) => {
+      setSelectedTaskId((prev) => (prev === taskId ? null : taskId));
+      const task = tasks.find((t) => t.id === taskId);
+      if (task && selectedTaskId !== taskId) {
+        onTaskSelect?.(task);
+      }
+    },
+    [tasks, onTaskSelect, selectedTaskId]
+  );
+ 
+  return (
+    <div className={`flex flex-col h-full ${className}`}>
+      {/* Header */}
+      <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center gap-2">
+          <Users className="w-5 h-5 text-orange-500" />
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-gray-100">协作任务</h2>
+        </div>
+        <div className="flex items-center gap-2">
+          <button
+            onClick={handleRefresh}
+            disabled={isRefreshing}
+            className="p-1.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 disabled:opacity-50"
+            title="刷新"
+          >
+            <RefreshCw className={`w-4 h-4 ${isRefreshing ? 'animate-spin' : ''}`} />
+          </button>
+          <button
+            onClick={() => setShowCreateForm((prev) => !prev)}
+            className="flex items-center gap-1 px-3 py-1.5 text-sm bg-orange-500 hover:bg-orange-600 text-white rounded-lg transition-colors"
+          >
+            <Plus className="w-4 h-4" />
+            新建
+          </button>
+        </div>
+      </div>
+ 
+      {/* Stats Bar */}
+      <div className="flex items-center gap-4 px-4 py-2 bg-gray-50 dark:bg-gray-800/50 border-b border-gray-200 dark:border-gray-700 text-xs">
+        <span className="text-gray-500 dark:text-gray-400">
+          总计: <span className="font-medium text-gray-900 dark:text-gray-100">{stats.total}</span>
+        </span>
+        <span className="text-blue-600 dark:text-blue-400">
+          活跃: <span className="font-medium">{stats.active}</span>
+        </span>
+        <span className="text-green-600 dark:text-green-400">
+          完成: <span className="font-medium">{stats.completed}</span>
+        </span>
+        {stats.failed > 0 && (
+          <span className="text-red-600 dark:text-red-400">
+            失败: <span className="font-medium">{stats.failed}</span>
+          </span>
+        )}
+      </div>
+ 
+      {/* Filter Tabs */}
+      <div className="flex gap-1 px-4 py-2 border-b border-gray-200 dark:border-gray-700">
+        {(['all', 'active', 'completed', 'failed'] as FilterType[]).map((f) => (
+          <button
+            key={f}
+            onClick={() => setFilter(f)}
+            className={`px-3 py-1 text-xs rounded-full transition-colors ${
+              filter === f
+                ? 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-400'
+                : 'text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800'
+            }`}
+          >
+            {f === 'all' ? '全部' : f === 'active' ? '活跃' : f === 'completed' ? '已完成' : '失败'}
+          </button>
+        ))}
+      </div>
+ 
+      {/* Create Form */}
+      <AnimatePresence>
+        {showCreateForm && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="border-b border-gray-200 dark:border-gray-700 overflow-hidden"
+          >
+            <CreateTaskForm
+              onSubmit={handleCreateTask}
+              onCancel={() => setShowCreateForm(false)}
+            />
+          </motion.div>
+        )}
+      </AnimatePresence>
+ 
+      {/* Task List */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-3">
+        {filteredTasks.length === 0 ? (
+          <div className="flex flex-col items-center justify-center h-full text-gray-500 dark:text-gray-400">
+            <History className="w-8 h-8 mb-2 opacity-50" />
+            <p className="text-sm">
+              {filter === 'all'
+                ? '暂无协作任务'
+                : filter === 'active'
+                ? '暂无活跃任务'
+                : filter === 'completed'
+                ? '暂无已完成任务'
+                : '暂无失败任务'}
+            </p>
+            <button
+              onClick={() => setShowCreateForm(true)}
+              className="mt-2 text-orange-500 hover:text-orange-600 text-sm"
+            >
+              创建第一个任务
+            </button>
+          </div>
+        ) : (
+          filteredTasks.map((task) => (
+            <TaskCard
+              key={task.id}
+              task={task}
+              isSelected={selectedTaskId === task.id}
+              onSelect={() => handleSelectTask(task.id)}
+            />
+          ))
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default SwarmDashboard;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/TaskList.tsx.html b/desktop/coverage/src/components/TaskList.tsx.html new file mode 100644 index 0000000..8020897 --- /dev/null +++ b/desktop/coverage/src/components/TaskList.tsx.html @@ -0,0 +1,415 @@ + + + + + + Code coverage report for src/components/TaskList.tsx + + + + + + + + + +
+
+

All files / src/components TaskList.tsx

+
+ +
+ 0% + Statements + 0/86 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/86 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect } from 'react';
+import { useConnectionStore } from '../store/connectionStore';
+import { useConfigStore } from '../store/configStore';
+import { Clock, RefreshCw, Play, Pause, AlertCircle, CheckCircle2 } from 'lucide-react';
+ 
+const STATUS_CONFIG: Record<string, { icon: typeof Play; color: string; label: string }> = {
+  active: { icon: Play, color: 'text-green-500', label: '运行中' },
+  paused: { icon: Pause, color: 'text-yellow-500', label: '已暂停' },
+  completed: { icon: CheckCircle2, color: 'text-blue-500', label: '已完成' },
+  error: { icon: AlertCircle, color: 'text-red-500', label: '错误' },
+};
+ 
+export function TaskList() {
+  const scheduledTasks = useConfigStore((s) => s.scheduledTasks);
+  const connectionState = useConnectionStore((s) => s.connectionState);
+  const loadScheduledTasks = useConfigStore((s) => s.loadScheduledTasks);
+ 
+  const connected = connectionState === 'connected';
+ 
+  useEffect(() => {
+    if (connected) {
+      loadScheduledTasks();
+    }
+  }, [connected]);
+ 
+  if (!connected) {
+    return (
+      <div className="flex flex-col items-center justify-center h-full text-gray-400 text-xs px-4 text-center">
+        <Clock className="w-8 h-8 mb-2 opacity-30" />
+        <p>定时任务</p>
+        <p className="mt-1">连接 Gateway 后可用</p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* Header */}
+      <div className="flex items-center justify-between px-3 py-2 border-b border-gray-200">
+        <span className="text-xs font-medium text-gray-500">Heartbeat 任务</span>
+        <button
+          onClick={loadScheduledTasks}
+          className="p-1 text-gray-400 hover:text-orange-500 rounded"
+          title="刷新"
+        >
+          <RefreshCw className="w-3.5 h-3.5" />
+        </button>
+      </div>
+ 
+      <div className="flex-1 overflow-y-auto custom-scrollbar">
+        {scheduledTasks.length > 0 ? (
+          scheduledTasks.map((task) => {
+            const cfg = STATUS_CONFIG[task.status] || STATUS_CONFIG.active;
+            const StatusIcon = cfg.icon;
+ 
+            return (
+              <div
+                key={task.id}
+                className="px-3 py-3 border-b border-gray-50 hover:bg-gray-50"
+              >
+                <div className="flex items-center gap-2 mb-1">
+                  <StatusIcon className={`w-3.5 h-3.5 flex-shrink-0 ${cfg.color}`} />
+                  <span className="text-xs font-medium text-gray-900 truncate">{task.name}</span>
+                </div>
+                <div className="pl-5.5 space-y-0.5">
+                  <div className="text-[11px] text-gray-500 font-mono">{task.schedule}</div>
+                  {task.description && (
+                    <div className="text-[11px] text-gray-400 truncate">{task.description}</div>
+                  )}
+                  <div className="flex gap-3 text-[10px] text-gray-400">
+                    {task.lastRun && <span>上次: {formatTaskTime(task.lastRun)}</span>}
+                    {task.nextRun && <span>下次: {formatTaskTime(task.nextRun)}</span>}
+                  </div>
+                </div>
+              </div>
+            );
+          })
+        ) : (
+          <div className="flex flex-col items-center justify-center h-full text-gray-400 text-xs px-4 text-center">
+            <Clock className="w-8 h-8 mb-2 opacity-30" />
+            <p>暂无定时任务</p>
+            <p className="mt-1">Heartbeat 引擎管理的定时任务</p>
+            <p className="mt-0.5 text-[11px]">默认心跳周期: 1h</p>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+function formatTaskTime(timeStr: string): string {
+  try {
+    const d = new Date(timeStr);
+    const now = new Date();
+    const diffMs = now.getTime() - d.getTime();
+    const future = diffMs < 0;
+    const absDiff = Math.abs(diffMs);
+    const mins = Math.floor(absDiff / 60000);
+ 
+    if (mins < 1) return future ? '即将' : '刚刚';
+    if (mins < 60) return future ? `${mins}分钟后` : `${mins}分钟前`;
+ 
+    const hrs = Math.floor(mins / 60);
+    if (hrs < 24) return future ? `${hrs}小时后` : `${hrs}小时前`;
+ 
+    return `${d.getMonth() + 1}/${d.getDate()} ${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`;
+  } catch {
+    return timeStr;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/TeamCollaborationView.tsx.html b/desktop/coverage/src/components/TeamCollaborationView.tsx.html new file mode 100644 index 0000000..5565dde --- /dev/null +++ b/desktop/coverage/src/components/TeamCollaborationView.tsx.html @@ -0,0 +1,1288 @@ + + + + + + Code coverage report for src/components/TeamCollaborationView.tsx + + + + + + + + + +
+
+

All files / src/components TeamCollaborationView.tsx

+
+ +
+ 0% + Statements + 0/300 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/300 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * TeamCollaborationView - Real-time Team Collaboration Status
+ *
+ * Displays live collaboration events, member status, task progress,
+ * and team metrics in a unified dashboard view.
+ *
+ * @module components/TeamCollaborationView
+ */
+ 
+import { useState, useEffect, useRef } from 'react';
+import { useTeamStore } from '../store/teamStore';
+import type { Team, TeamMember, TeamTask, CollaborationEvent } from '../types/team';
+import {
+  Activity, Users, CheckCircle, AlertTriangle, Play,
+  ArrowRight, GitBranch, MessageSquare, FileCode, Bot, Zap,
+  TrendingUp, TrendingDown, Minus, Circle,
+} from 'lucide-react';
+ 
+// === Sub-Components ===
+ 
+interface EventFeedItemProps {
+  event: CollaborationEvent;
+  team: Team;
+}
+ 
+function EventFeedItem({ event, team }: EventFeedItemProps) {
+  const sourceMember = team.members.find(m => m.agentId === event.sourceAgentId);
+ 
+  const eventIcons: Record<CollaborationEvent['type'], React.ReactNode> = {
+    task_assigned: <ArrowRight className="w-4 h-4 text-blue-500" />,
+    task_started: <Play className="w-4 h-4 text-green-500" />,
+    task_completed: <CheckCircle className="w-4 h-4 text-green-600" />,
+    review_requested: <MessageSquare className="w-4 h-4 text-yellow-500" />,
+    review_submitted: <FileCode className="w-4 h-4 text-purple-500" />,
+    loop_state_change: <RefreshCw className="w-4 h-4 text-orange-500" />,
+    member_status_change: <Users className="w-4 h-4 text-gray-500" />,
+  };
+ 
+  const formatTime = (timestamp: string) => {
+    const diff = Date.now() - new Date(timestamp).getTime();
+    if (diff < 60000) return 'Just now';
+    if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;
+    return new Date(timestamp).toLocaleTimeString();
+  };
+ 
+  return (
+    <div className="flex items-start gap-3 p-3 hover:bg-gray-50 dark:hover:bg-gray-800 rounded-lg">
+      <div className="mt-0.5">{eventIcons[event.type]}</div>
+      <div className="flex-1 min-w-0">
+        <div className="flex items-center gap-2">
+          <span className="font-medium text-gray-900 dark:text-white text-sm">
+            {sourceMember?.name || 'System'}
+          </span>
+          <span className="text-xs text-gray-500 dark:text-gray-400">
+            {event.type.replace(/_/g, ' ')}
+          </span>
+        </div>
+        <p className="text-sm text-gray-600 dark:text-gray-400 mt-0.5 line-clamp-2">
+          {typeof event.payload.description === 'string'
+            ? event.payload.description
+            : JSON.stringify(event.payload).slice(0, 100)}
+        </p>
+      </div>
+      <span className="text-xs text-gray-400 whitespace-nowrap">
+        {formatTime(event.timestamp)}
+      </span>
+    </div>
+  );
+}
+ 
+function RefreshCw({ className }: { className?: string }) {
+  return (
+    <svg className={className} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
+      <path d="M21 2v6h-6M3 22v-6h6M21 12A9 9 0 0 0 6 5.3L3 8M3 12a9 9 0 0 0 15 6.7l3-2.7" />
+    </svg>
+  );
+}
+ 
+interface MemberStatusBadgeProps {
+  member: TeamMember;
+}
+ 
+function MemberStatusBadge({ member }: MemberStatusBadgeProps) {
+  const statusConfig = {
+    idle: { color: 'bg-gray-400', label: 'Idle' },
+    running: { color: 'bg-green-500 animate-pulse', label: 'Active' },
+    paused: { color: 'bg-yellow-500', label: 'Paused' },
+    error: { color: 'bg-red-500', label: 'Error' },
+  };
+ 
+  const config = statusConfig[member.status];
+ 
+  return (
+    <div className="flex items-center gap-2 p-2 rounded-lg bg-gray-50 dark:bg-gray-800">
+      <div className="relative">
+        <div className={`w-3 h-3 rounded-full ${config.color}`} />
+        {member.currentTasks.length > 0 && (
+          <div className="absolute -top-1 -right-1 w-4 h-4 bg-blue-500 rounded-full flex items-center justify-center">
+            <span className="text-[10px] text-white font-bold">{member.currentTasks.length}</span>
+          </div>
+        )}
+      </div>
+      <div className="flex-1 min-w-0">
+        <div className="flex items-center justify-between">
+          <span className="text-sm font-medium text-gray-900 dark:text-white truncate">
+            {member.name}
+          </span>
+          <span className="text-xs text-gray-500">{config.label}</span>
+        </div>
+        <div className="mt-1 h-1 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden">
+          <div
+            className="h-full bg-blue-500 transition-all"
+            style={{ width: `${member.workload}%` }}
+          />
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+interface TaskProgressCardProps {
+  task: TeamTask;
+  assignee?: TeamMember;
+}
+ 
+function TaskProgressCard({ task, assignee }: TaskProgressCardProps) {
+  const statusConfig: Record<TeamTask['status'], { color: string; icon: React.ReactNode }> = {
+    pending: { color: 'text-gray-400', icon: <Circle className="w-4 h-4" /> },
+    assigned: { color: 'text-blue-400', icon: <ArrowRight className="w-4 h-4" /> },
+    in_progress: { color: 'text-green-500', icon: <Play className="w-4 h-4" /> },
+    review: { color: 'text-yellow-500', icon: <MessageSquare className="w-4 h-4" /> },
+    blocked: { color: 'text-red-500', icon: <AlertTriangle className="w-4 h-4" /> },
+    completed: { color: 'text-green-600', icon: <CheckCircle className="w-4 h-4" /> },
+    failed: { color: 'text-red-600', icon: <AlertTriangle className="w-4 h-4" /> },
+  };
+ 
+  const config = statusConfig[task.status];
+ 
+  return (
+    <div className="p-3 rounded-lg border border-gray-200 dark:border-gray-700">
+      <div className="flex items-start gap-2">
+        <div className={config.color}>{config.icon}</div>
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center justify-between">
+            <span className="text-sm font-medium text-gray-900 dark:text-white truncate">
+              {task.title}
+            </span>
+            <span className={`text-xs px-1.5 py-0.5 rounded ${
+              task.priority === 'critical' ? 'bg-red-100 text-red-700' :
+              task.priority === 'high' ? 'bg-orange-100 text-orange-700' :
+              task.priority === 'medium' ? 'bg-yellow-100 text-yellow-700' :
+              'bg-gray-100 text-gray-700'
+            }`}>
+              {task.priority}
+            </span>
+          </div>
+          <div className="mt-1 flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400">
+            <span>{task.type}</span>
+            {assignee && (
+              <>
+                <span>·</span>
+                <span>{assignee.name}</span>
+              </>
+            )}
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+interface MetricCardProps {
+  label: string;
+  value: number | string;
+  trend?: 'up' | 'down' | 'neutral';
+  format?: 'number' | 'percent' | 'time';
+}
+ 
+function MetricCard({ label, value, trend, format = 'number' }: MetricCardProps) {
+  const formattedValue = format === 'percent' ? `${value}%` :
+    format === 'time' ? `${Math.floor((value as number) / 60000)}m` :
+    value;
+ 
+  return (
+    <div className="p-3 rounded-lg bg-gray-50 dark:bg-gray-800">
+      <div className="flex items-center justify-between">
+        <span className="text-xs text-gray-500 dark:text-gray-400">{label}</span>
+        {trend && (
+          trend === 'up' ? <TrendingUp className="w-3 h-3 text-green-500" /> :
+          trend === 'down' ? <TrendingDown className="w-3 h-3 text-red-500" /> :
+          <Minus className="w-3 h-3 text-gray-400" />
+        )}
+      </div>
+      <div className="mt-1 text-xl font-bold text-gray-900 dark:text-white">
+        {formattedValue}
+      </div>
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+interface TeamCollaborationViewProps {
+  teamId: string;
+  compact?: boolean;
+}
+ 
+export function TeamCollaborationView({ teamId, compact = false }: TeamCollaborationViewProps) {
+  const { teams, recentEvents, metrics, activeTeam } = useTeamStore();
+  const [autoScroll, setAutoScroll] = useState(true);
+  const eventFeedRef = useRef<HTMLDivElement>(null);
+ 
+  const team = teams.find(t => t.id === teamId) || activeTeam;
+ 
+  useEffect(() => {
+    if (autoScroll && eventFeedRef.current) {
+      eventFeedRef.current.scrollTop = 0;
+    }
+  }, [recentEvents, autoScroll]);
+ 
+  if (!team) {
+    return (
+      <div className="p-6 text-center text-gray-500 dark:text-gray-400">
+        <Users className="w-12 h-12 mx-auto mb-3 text-gray-300 dark:text-gray-600" />
+        <p>No team selected</p>
+      </div>
+    );
+  }
+ 
+  const tasksByStatus = {
+    active: team.tasks.filter(t => ['in_progress', 'review'].includes(t.status)),
+    pending: team.tasks.filter(t => ['pending', 'assigned'].includes(t.status)),
+    completed: team.tasks.filter(t => t.status === 'completed'),
+    blocked: team.tasks.filter(t => ['blocked', 'failed'].includes(t.status)),
+  };
+ 
+  if (compact) {
+    return (
+      <div className="p-4 space-y-4">
+        {/* Quick Stats */}
+        <div className="grid grid-cols-4 gap-2">
+          <div className="text-center">
+            <div className="text-2xl font-bold text-blue-500">{tasksByStatus.active.length}</div>
+            <div className="text-xs text-gray-500">Active</div>
+          </div>
+          <div className="text-center">
+            <div className="text-2xl font-bold text-gray-400">{tasksByStatus.pending.length}</div>
+            <div className="text-xs text-gray-500">Pending</div>
+          </div>
+          <div className="text-center">
+            <div className="text-2xl font-bold text-green-500">{tasksByStatus.completed.length}</div>
+            <div className="text-xs text-gray-500">Done</div>
+          </div>
+          <div className="text-center">
+            <div className="text-2xl font-bold text-red-500">{tasksByStatus.blocked.length}</div>
+            <div className="text-xs text-gray-500">Blocked</div>
+          </div>
+        </div>
+ 
+        {/* Member Status */}
+        <div className="grid grid-cols-2 gap-2">
+          {team.members.slice(0, 4).map(member => (
+            <MemberStatusBadge key={member.id} member={member} />
+          ))}
+        </div>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="h-full flex flex-col bg-white dark:bg-gray-900">
+      {/* Header */}
+      <div className="px-4 py-3 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center justify-between">
+          <div className="flex items-center gap-2">
+            <Users className="w-5 h-5 text-blue-500" />
+            <h3 className="font-semibold text-gray-900 dark:text-white">{team.name}</h3>
+            <span className={`px-2 py-0.5 rounded text-xs font-medium ${
+              team.status === 'active' ? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300' :
+              team.status === 'paused' ? 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300' :
+              'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300'
+            }`}>
+              {team.status}
+            </span>
+          </div>
+          <div className="flex items-center gap-2 text-sm text-gray-500">
+            <GitBranch className="w-4 h-4" />
+            <span>{team.pattern}</span>
+          </div>
+        </div>
+      </div>
+ 
+      {/* Metrics */}
+      {metrics && (
+        <div className="px-4 py-3 border-b border-gray-200 dark:border-gray-700">
+          <div className="grid grid-cols-5 gap-3">
+            <MetricCard label="Completed" value={metrics.tasksCompleted} />
+            <MetricCard label="Pass Rate" value={metrics.passRate.toFixed(0)} format="percent" trend={metrics.passRate > 80 ? 'up' : 'down'} />
+            <MetricCard label="Avg Time" value={metrics.avgCompletionTime} format="time" />
+            <MetricCard label="Iterations" value={metrics.avgIterations.toFixed(1)} trend={metrics.avgIterations < 2 ? 'up' : 'neutral'} />
+            <MetricCard label="Efficiency" value={metrics.efficiency.toFixed(0)} format="percent" trend={metrics.efficiency > 70 ? 'up' : 'down'} />
+          </div>
+        </div>
+      )}
+ 
+      {/* Main Content */}
+      <div className="flex-1 flex overflow-hidden">
+        {/* Left: Members & Tasks */}
+        <div className="w-1/2 border-r border-gray-200 dark:border-gray-700 flex flex-col overflow-hidden">
+          {/* Members */}
+          <div className="p-4 border-b border-gray-200 dark:border-gray-700">
+            <h4 className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-3 flex items-center gap-2">
+              <Bot className="w-4 h-4" />
+              Team Members ({team.members.length})
+            </h4>
+            <div className="space-y-2 max-h-32 overflow-y-auto">
+              {team.members.map(member => (
+                <MemberStatusBadge key={member.id} member={member} />
+              ))}
+            </div>
+          </div>
+ 
+          {/* Tasks */}
+          <div className="flex-1 p-4 overflow-y-auto">
+            <h4 className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-3 flex items-center gap-2">
+              <Activity className="w-4 h-4" />
+              Active Tasks ({tasksByStatus.active.length})
+            </h4>
+            <div className="space-y-2">
+              {tasksByStatus.active.map(task => (
+                <TaskProgressCard
+                  key={task.id}
+                  task={task}
+                  assignee={team.members.find(m => m.id === task.assigneeId)}
+                />
+              ))}
+              {tasksByStatus.active.length === 0 && (
+                <p className="text-sm text-gray-500 dark:text-gray-400 text-center py-4">
+                  No active tasks
+                </p>
+              )}
+            </div>
+ 
+            {tasksByStatus.blocked.length > 0 && (
+              <>
+                <h4 className="text-sm font-medium text-red-600 dark:text-red-400 mt-4 mb-2 flex items-center gap-2">
+                  <AlertTriangle className="w-4 h-4" />
+                  Blocked ({tasksByStatus.blocked.length})
+                </h4>
+                <div className="space-y-2">
+                  {tasksByStatus.blocked.map(task => (
+                    <TaskProgressCard
+                      key={task.id}
+                      task={task}
+                      assignee={team.members.find(m => m.id === task.assigneeId)}
+                    />
+                  ))}
+                </div>
+              </>
+            )}
+          </div>
+        </div>
+ 
+        {/* Right: Event Feed */}
+        <div className="w-1/2 flex flex-col overflow-hidden">
+          <div className="px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between">
+            <h4 className="text-sm font-medium text-gray-700 dark:text-gray-300 flex items-center gap-2">
+              <Zap className="w-4 h-4" />
+              Live Events
+            </h4>
+            <label className="flex items-center gap-2 text-xs text-gray-500">
+              <input
+                type="checkbox"
+                checked={autoScroll}
+                onChange={(e) => setAutoScroll(e.target.checked)}
+                className="rounded"
+              />
+              Auto-scroll
+            </label>
+          </div>
+          <div ref={eventFeedRef} className="flex-1 overflow-y-auto p-2">
+            {recentEvents.filter(e => e.teamId === teamId).length === 0 ? (
+              <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+                <Activity className="w-8 h-8 mx-auto mb-2 text-gray-300 dark:text-gray-600" />
+                <p className="text-sm">No recent activity</p>
+              </div>
+            ) : (
+              recentEvents
+                .filter(e => e.teamId === teamId)
+                .map((event, idx) => (
+                  <EventFeedItem key={`${event.timestamp}-${idx}`} event={event} team={team} />
+                ))
+            )}
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default TeamCollaborationView;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/TeamList.tsx.html b/desktop/coverage/src/components/TeamList.tsx.html new file mode 100644 index 0000000..c61241d --- /dev/null +++ b/desktop/coverage/src/components/TeamList.tsx.html @@ -0,0 +1,967 @@ + + + + + + Code coverage report for src/components/TeamList.tsx + + + + + + + + + +
+
+

All files / src/components TeamList.tsx

+
+ +
+ 0% + Statements + 0/228 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/228 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * TeamList - Sidebar Team List Component
+ *
+ * Displays a compact list of teams for the sidebar navigation.
+ *
+ * @module components/TeamList
+ */
+ 
+import { useEffect, useState } from 'react';
+import { useTeamStore } from '../store/teamStore';
+import { useAgentStore } from '../store/agentStore';
+import { useChatStore } from '../store/chatStore';
+import { Users, Plus, Activity, CheckCircle, AlertTriangle, X, Bot } from 'lucide-react';
+import type { TeamMemberRole } from '../types/team';
+ 
+interface TeamListProps {
+  onSelectTeam?: (teamId: string) => void;
+  selectedTeamId?: string;
+}
+ 
+export function TeamList({ onSelectTeam, selectedTeamId }: TeamListProps) {
+  const { teams, loadTeams, setActiveTeam, createTeam, isLoading } = useTeamStore();
+  const clones = useAgentStore((s) => s.clones);
+  const { agents } = useChatStore();
+  const [showCreateModal, setShowCreateModal] = useState(false);
+  const [teamName, setTeamName] = useState('');
+  const [teamDescription, setTeamDescription] = useState('');
+  const [teamPattern, setTeamPattern] = useState<'sequential' | 'parallel' | 'pipeline'>('sequential');
+  const [selectedAgents, setSelectedAgents] = useState<string[]>([]);
+  const [isCreating, setIsCreating] = useState(false);
+ 
+  useEffect(() => {
+    try {
+      loadTeams();
+    } catch (err) {
+      console.error('[TeamList] Failed to load teams:', err);
+    }
+  }, [loadTeams]);
+ 
+  const handleSelectTeam = (teamId: string) => {
+    const team = teams.find(t => t.id === teamId);
+    if (team) {
+      setActiveTeam(team);
+      onSelectTeam?.(teamId);
+    }
+  };
+ 
+  const handleCreateTeam = async () => {
+    if (!teamName.trim() || selectedAgents.length === 0) return;
+ 
+    setIsCreating(true);
+    try {
+      const roleAssignments: { agentId: string; role: TeamMemberRole }[] = selectedAgents.map((agentId, index) => ({
+        agentId,
+        role: (index === 0 ? 'orchestrator' : index === 1 ? 'reviewer' : 'worker') as TeamMemberRole,
+      }));
+ 
+      const team = await createTeam({
+        name: teamName.trim(),
+        description: teamDescription.trim() || undefined,
+        pattern: teamPattern,
+        memberAgents: roleAssignments,
+      });
+ 
+      if (team) {
+        setShowCreateModal(false);
+        setTeamName('');
+        setTeamDescription('');
+        setSelectedAgents([]);
+        setTeamPattern('sequential');
+        setActiveTeam(team);
+        onSelectTeam?.(team.id);
+      }
+    } finally {
+      setIsCreating(false);
+    }
+  };
+ 
+  const toggleAgentSelection = (agentId: string) => {
+    setSelectedAgents(prev =>
+      prev.includes(agentId)
+        ? prev.filter(id => id !== agentId)
+        : [...prev, agentId]
+    );
+  };
+ 
+  const getStatusIcon = (status: string) => {
+    switch (status) {
+      case 'active':
+        return <Activity className="w-3 h-3 text-green-500" />;
+      case 'paused':
+        return <AlertTriangle className="w-3 h-3 text-yellow-500" />;
+      case 'completed':
+        return <CheckCircle className="w-3 h-3 text-blue-500" />;
+      default:
+        return <Activity className="w-3 h-3 text-gray-400" />;
+    }
+  };
+ 
+  // Merge clones and agents for display - normalize to common type with defensive checks
+  const availableAgents: Array<{ id: string; name: string; role?: string }> =
+    (clones && clones.length > 0)
+      ? clones.map(c => ({ id: c.id, name: c.name, role: c.role }))
+      : (agents && agents.length > 0)
+        ? agents.map(a => ({
+            id: a.id,
+            name: a.name,
+            role: '默认助手',
+          }))
+        : [];
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* Header */}
+      <div className="p-3 border-b border-gray-200 dark:border-gray-700">
+        <div className="flex items-center justify-between">
+          <h3 className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
+            团队
+          </h3>
+          <button
+            onClick={() => setShowCreateModal(true)}
+            className="p-1 hover:bg-gray-100 dark:hover:bg-gray-800 rounded transition-colors"
+            title="创建团队"
+          >
+            <Plus className="w-4 h-4 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200" />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Create Team Modal */}
+      {showCreateModal && (
+        <div className="absolute inset-0 bg-black/50 flex items-center justify-center z-50">
+          <div className="bg-white dark:bg-gray-800 rounded-xl shadow-xl w-80 max-h-[90vh] overflow-y-auto">
+            <div className="p-4 border-b border-gray-200 dark:border-gray-700">
+              <div className="flex items-center justify-between">
+                <h3 className="text-sm font-semibold text-gray-900 dark:text-white">创建团队</h3>
+                <button
+                  onClick={() => setShowCreateModal(false)}
+                  className="p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded"
+                >
+                  <X className="w-4 h-4 text-gray-400" />
+                </button>
+              </div>
+            </div>
+ 
+            <div className="p-4 space-y-4">
+              {/* Team Name */}
+              <div>
+                <label className="block text-xs font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  团队名称 *
+                </label>
+                <input
+                  type="text"
+                  value={teamName}
+                  onChange={(e) => setTeamName(e.target.value)}
+                  placeholder="例如:开发团队 Alpha"
+                  className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-gray-400"
+                />
+              </div>
+ 
+              {/* Team Description */}
+              <div>
+                <label className="block text-xs font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  描述
+                </label>
+                <textarea
+                  value={teamDescription}
+                  onChange={(e) => setTeamDescription(e.target.value)}
+                  placeholder="这个团队将负责什么工作?"
+                  rows={2}
+                  className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-gray-400 resize-none"
+                />
+              </div>
+ 
+              {/* Collaboration Pattern */}
+              <div>
+                <label className="block text-xs font-medium text-gray-700 dark:text-gray-300 mb-1">
+                  协作模式
+                </label>
+                <select
+                  value={teamPattern}
+                  onChange={(e) => setTeamPattern(e.target.value as typeof teamPattern)}
+                  className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-gray-400"
+                >
+                  <option value="sequential">顺序执行(逐个任务)</option>
+                  <option value="parallel">并行执行(同时工作)</option>
+                  <option value="pipeline">流水线(输出传递给下一步)</option>
+                </select>
+              </div>
+ 
+              {/* Agent Selection */}
+              <div>
+                <label className="block text-xs font-medium text-gray-700 dark:text-gray-300 mb-2">
+                  选择智能体 (已选择 {selectedAgents.length} 个) *
+                </label>
+                <div className="space-y-2 max-h-40 overflow-y-auto">
+                  {availableAgents.map((agent) => (
+                    <button
+                      key={agent.id}
+                      onClick={() => toggleAgentSelection(agent.id)}
+                      className={`w-full p-2 rounded-lg text-left text-sm transition-colors flex items-center gap-2 ${
+                        selectedAgents.includes(agent.id)
+                          ? 'bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-800'
+                          : 'bg-gray-50 dark:bg-gray-700 border border-transparent hover:bg-gray-100 dark:hover:bg-gray-600'
+                      }`}
+                    >
+                      <div className="w-6 h-6 rounded-full bg-gray-600 flex items-center justify-center text-white text-xs">
+                        <Bot className="w-3 h-3" />
+                      </div>
+                      <span className="text-gray-900 dark:text-white truncate">{agent.name}</span>
+                      {selectedAgents.includes(agent.id) && (
+                        <CheckCircle className="w-4 h-4 text-blue-500 ml-auto" />
+                      )}
+                    </button>
+                  ))}
+                  {availableAgents.length === 0 && (
+                    <p className="text-xs text-gray-500 dark:text-gray-400 text-center py-2">
+                      暂无可用智能体,请先创建一个智能体。
+                    </p>
+                  )}
+                </div>
+              </div>
+            </div>
+ 
+            {/* Footer */}
+            <div className="p-4 border-t border-gray-200 dark:border-gray-700 flex gap-2">
+              <button
+                onClick={() => setShowCreateModal(false)}
+                className="flex-1 px-4 py-2 text-sm text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors"
+              >
+                取消
+              </button>
+              <button
+                onClick={handleCreateTeam}
+                disabled={!teamName.trim() || selectedAgents.length === 0 || isCreating}
+                className="flex-1 px-4 py-2 text-sm text-white bg-gray-700 dark:bg-gray-600 rounded-lg hover:bg-gray-800 dark:hover:bg-gray-500 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
+              >
+                {isCreating ? '创建中...' : '创建'}
+              </button>
+            </div>
+          </div>
+        </div>
+      )}
+ 
+      {/* Team List */}
+      <div className="flex-1 overflow-y-auto">
+        {isLoading ? (
+          <div className="p-4 text-center text-gray-400 text-sm">加载中...</div>
+        ) : !Array.isArray(teams) || teams.length === 0 ? (
+          <div className="p-4 text-center">
+            <Users className="w-8 h-8 mx-auto mb-2 text-gray-300 dark:text-gray-600" />
+            <p className="text-xs text-gray-400 dark:text-gray-500">
+              暂无团队
+            </p>
+            <p className="text-xs text-gray-400 dark:text-gray-500 mt-1">
+              点击 + 创建一个团队
+            </p>
+          </div>
+        ) : (
+          <div className="space-y-1 p-2">
+            {teams.map((team) => (
+              <button
+                key={team.id}
+                onClick={() => handleSelectTeam(team.id)}
+                className={`w-full p-2 rounded-lg text-left transition-colors ${
+                  selectedTeamId === team.id
+                    ? 'bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-800'
+                    : 'hover:bg-gray-100 dark:hover:bg-gray-800'
+                }`}
+              >
+                <div className="flex items-center gap-2">
+                  {getStatusIcon(team.status)}
+                  <span className="text-sm font-medium text-gray-900 dark:text-white truncate">
+                    {team.name}
+                  </span>
+                </div>
+                <div className="mt-1 flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400">
+                  <span className="flex items-center gap-1">
+                    <Users className="w-3 h-3" />
+                    {team.members.length}
+                  </span>
+                  <span>·</span>
+                  <span>{team.tasks.length} 个任务</span>
+                </div>
+              </button>
+            ))}
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default TeamList;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/TeamOrchestrator.tsx.html b/desktop/coverage/src/components/TeamOrchestrator.tsx.html new file mode 100644 index 0000000..191f4cc --- /dev/null +++ b/desktop/coverage/src/components/TeamOrchestrator.tsx.html @@ -0,0 +1,1825 @@ + + + + + + Code coverage report for src/components/TeamOrchestrator.tsx + + + + + + + + + +
+
+

All files / src/components TeamOrchestrator.tsx

+
+ +
+ 0% + Statements + 0/440 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/440 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * TeamOrchestrator - Multi-Agent Team Orchestration UI
+ *
+ * Provides an interface for creating teams, assigning agents,
+ * managing tasks, and monitoring collaboration workflows.
+ *
+ * @module components/TeamOrchestrator
+ */
+ 
+import { useState, useEffect } from 'react';
+import { useTeamStore } from '../store/teamStore';
+import { useAgentStore } from '../store/agentStore';
+import { DevQALoopPanel } from './DevQALoop';
+import type {
+  TeamMember,
+  TeamTask,
+  TeamMemberRole,
+  TaskPriority,
+  CollaborationPattern,
+} from '../types/team';
+import {
+  Users, Plus, Trash2, X,
+  Bot, Clock, AlertTriangle, CheckCircle,
+  Play, UserPlus, FileText, RefreshCw,
+} from 'lucide-react';
+ 
+// === Sub-Components ===
+ 
+interface MemberCardProps {
+  member: TeamMember;
+  isSelected: boolean;
+  onSelect: () => void;
+  onRoleChange: (role: TeamMemberRole) => void;
+  onRemove: () => void;
+}
+ 
+function MemberCard({ member, isSelected, onSelect, onRoleChange, onRemove }: MemberCardProps) {
+  const [showRoleMenu, setShowRoleMenu] = useState(false);
+ 
+  const roleColors: Record<TeamMemberRole, string> = {
+    orchestrator: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300',
+    developer: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300',
+    reviewer: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300',
+    tester: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300',
+    architect: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300',
+    specialist: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-300',
+  };
+ 
+  const statusColors = {
+    idle: 'bg-gray-400',
+    running: 'bg-green-500 animate-pulse',
+    paused: 'bg-yellow-500',
+    error: 'bg-red-500',
+  };
+ 
+  return (
+    <div
+      className={`p-3 rounded-lg border cursor-pointer transition-all ${
+        isSelected
+          ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20'
+          : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+      }`}
+      onClick={onSelect}
+    >
+      <div className="flex items-center justify-between">
+        <div className="flex items-center gap-2">
+          <div className={`w-2 h-2 rounded-full ${statusColors[member.status]}`} />
+          <Bot className="w-4 h-4 text-gray-500" />
+          <span className="font-medium text-gray-900 dark:text-white">{member.name}</span>
+        </div>
+        <div className="flex items-center gap-1">
+          <button
+            onClick={(e) => { e.stopPropagation(); setShowRoleMenu(!showRoleMenu); }}
+            className={`px-2 py-0.5 rounded text-xs font-medium ${roleColors[member.role]}`}
+          >
+            {member.role}
+          </button>
+          <button
+            onClick={(e) => { e.stopPropagation(); onRemove(); }}
+            className="p-1 text-gray-400 hover:text-red-500"
+          >
+            <Trash2 className="w-3.5 h-3.5" />
+          </button>
+        </div>
+      </div>
+ 
+      {showRoleMenu && (
+        <div className="mt-2 flex flex-wrap gap-1">
+          {(['orchestrator', 'developer', 'reviewer', 'tester', 'architect', 'specialist'] as TeamMemberRole[]).map(role => (
+            <button
+              key={role}
+              onClick={(e) => { e.stopPropagation(); onRoleChange(role); setShowRoleMenu(false); }}
+              className={`px-2 py-0.5 rounded text-xs ${roleColors[role]} hover:opacity-80`}
+            >
+              {role}
+            </button>
+          ))}
+        </div>
+      )}
+ 
+      <div className="mt-2 flex items-center gap-3 text-xs text-gray-500 dark:text-gray-400">
+        <span>Workload: {member.workload}%</span>
+        <span>Tasks: {member.currentTasks.length}</span>
+      </div>
+    </div>
+  );
+}
+ 
+interface TaskCardProps {
+  task: TeamTask;
+  members: TeamMember[];
+  isSelected: boolean;
+  onSelect: () => void;
+  onAssign: (memberId: string) => void;
+  onStatusChange: (status: TeamTask['status']) => void;
+}
+ 
+function TaskCard({ task, members, isSelected, onSelect, onAssign, onStatusChange: _onStatusChange }: TaskCardProps) {
+  const [showAssignMenu, setShowAssignMenu] = useState(false);
+ 
+  const priorityColors: Record<TaskPriority, string> = {
+    critical: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300',
+    high: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300',
+    medium: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300',
+    low: 'bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-300',
+  };
+ 
+  const statusIcons: Record<TeamTask['status'], React.ReactNode> = {
+    pending: <Clock className="w-4 h-4 text-gray-400" />,
+    assigned: <UserPlus className="w-4 h-4 text-blue-400" />,
+    in_progress: <Play className="w-4 h-4 text-green-400" />,
+    review: <FileText className="w-4 h-4 text-yellow-400" />,
+    blocked: <AlertTriangle className="w-4 h-4 text-red-400" />,
+    completed: <CheckCircle className="w-4 h-4 text-green-500" />,
+    failed: <X className="w-4 h-4 text-red-500" />,
+  };
+ 
+  const assignee = members.find(m => m.id === task.assigneeId);
+ 
+  return (
+    <div
+      className={`p-3 rounded-lg border cursor-pointer transition-all ${
+        isSelected
+          ? 'border-blue-500 bg-blue-50 dark:bg-blue-900/20'
+          : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'
+      }`}
+      onClick={onSelect}
+    >
+      <div className="flex items-start justify-between gap-2">
+        <div className="flex-1">
+          <div className="flex items-center gap-2">
+            {statusIcons[task.status]}
+            <span className="font-medium text-gray-900 dark:text-white">{task.title}</span>
+          </div>
+          {task.description && (
+            <p className="mt-1 text-xs text-gray-500 dark:text-gray-400 line-clamp-2">
+              {task.description}
+            </p>
+          )}
+        </div>
+        <span className={`px-2 py-0.5 rounded text-xs font-medium ${priorityColors[task.priority]}`}>
+          {task.priority}
+        </span>
+      </div>
+ 
+      <div className="mt-2 flex items-center justify-between">
+        <div className="flex items-center gap-2">
+          <button
+            onClick={(e) => { e.stopPropagation(); setShowAssignMenu(!showAssignMenu); }}
+            className={`px-2 py-1 rounded text-xs border ${
+              assignee
+                ? 'border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-800 dark:bg-blue-900/30 dark:text-blue-300'
+                : 'border-gray-200 text-gray-500 hover:border-gray-300 dark:border-gray-700 dark:text-gray-400'
+            }`}
+          >
+            {assignee ? assignee.name : 'Assign...'}
+          </button>
+          <span className="text-xs text-gray-400">{task.type}</span>
+        </div>
+        {task.estimate && (
+          <span className="text-xs text-gray-400">{task.estimate}pts</span>
+        )}
+      </div>
+ 
+      {showAssignMenu && (
+        <div className="mt-2 flex flex-wrap gap-1">
+          {members.map(member => (
+            <button
+              key={member.id}
+              onClick={(e) => { e.stopPropagation(); onAssign(member.id); setShowAssignMenu(false); }}
+              className="px-2 py-1 rounded text-xs border border-gray-200 dark:border-gray-700 hover:bg-gray-100 dark:hover:bg-gray-800"
+            >
+              {member.name}
+            </button>
+          ))}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+// === Main Component ===
+ 
+interface TeamOrchestratorProps {
+  isOpen: boolean;
+  onClose: () => void;
+}
+ 
+export function TeamOrchestrator({ isOpen, onClose }: TeamOrchestratorProps) {
+  const [view, setView] = useState<'teams' | 'tasks' | 'members' | 'review'>('teams');
+  const [isCreating, setIsCreating] = useState(false);
+  const [newTeamName, setNewTeamName] = useState('');
+  const [newTeamPattern, setNewTeamPattern] = useState<CollaborationPattern>('sequential');
+ 
+  const {
+    teams,
+    activeTeam,
+    metrics,
+    error,
+    selectedTaskId,
+    selectedMemberId,
+    loadTeams,
+    createTeam,
+    deleteTeam,
+    setActiveTeam,
+    addTask,
+    updateTaskStatus,
+    assignTask,
+    addMember,
+    removeMember,
+    updateMemberRole,
+    setSelectedTask,
+    setSelectedMember,
+    startDevQALoop,
+  } = useTeamStore();
+ 
+  const clones = useAgentStore((s) => s.clones);
+ 
+  useEffect(() => {
+    if (isOpen) {
+      loadTeams();
+    }
+  }, [isOpen, loadTeams]);
+ 
+  const handleCreateTeam = async () => {
+    if (!newTeamName.trim()) return;
+    const team = await createTeam({
+      name: newTeamName.trim(),
+      pattern: newTeamPattern,
+      memberAgents: [],
+    });
+    if (team) {
+      setActiveTeam(team);
+      setNewTeamName('');
+      setIsCreating(false);
+    }
+  };
+ 
+  const handleAddMember = async (agentId: string) => {
+    if (!activeTeam) return;
+    await addMember(activeTeam.id, agentId, 'developer');
+  };
+ 
+  const handleAddTask = async () => {
+    if (!activeTeam) return;
+    await addTask({
+      teamId: activeTeam.id,
+      title: `Task ${activeTeam.tasks.length + 1}`,
+      priority: 'medium',
+      type: 'implementation',
+    });
+  };
+ 
+  if (!isOpen) return null;
+ 
+  return (
+    <div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
+      <div className="bg-white dark:bg-gray-900 rounded-xl shadow-2xl w-[90vw] h-[85vh] flex flex-col overflow-hidden">
+        {/* Header */}
+        <div className="px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between">
+          <div className="flex items-center gap-3">
+            <Users className="w-6 h-6 text-blue-500" />
+            <h2 className="text-xl font-bold text-gray-900 dark:text-white">Team Orchestrator</h2>
+          </div>
+          <div className="flex items-center gap-2">
+            {metrics && (
+              <div className="flex items-center gap-4 mr-4 text-sm text-gray-500 dark:text-gray-400">
+                <span>Completed: {metrics.tasksCompleted}</span>
+                <span>Pass Rate: {metrics.passRate.toFixed(0)}%</span>
+                <span>Efficiency: {metrics.efficiency.toFixed(0)}%</span>
+              </div>
+            )}
+            <button onClick={onClose} className="p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg">
+              <X className="w-5 h-5 text-gray-500" />
+            </button>
+          </div>
+        </div>
+ 
+        {/* Content */}
+        <div className="flex-1 flex overflow-hidden">
+          {/* Sidebar - Team List */}
+          <div className="w-64 border-r border-gray-200 dark:border-gray-700 p-4 overflow-y-auto">
+            <div className="flex items-center justify-between mb-4">
+              <h3 className="font-semibold text-gray-900 dark:text-white">Teams</h3>
+              <button
+                onClick={() => setIsCreating(true)}
+                className="p-1 hover:bg-gray-100 dark:hover:bg-gray-800 rounded"
+              >
+                <Plus className="w-4 h-4 text-gray-500" />
+              </button>
+            </div>
+ 
+            {isCreating && (
+              <div className="mb-4 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
+                <input
+                  type="text"
+                  value={newTeamName}
+                  onChange={(e) => setNewTeamName(e.target.value)}
+                  placeholder="Team name..."
+                  className="w-full px-2 py-1 text-sm border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white"
+                />
+                <select
+                  value={newTeamPattern}
+                  onChange={(e) => setNewTeamPattern(e.target.value as CollaborationPattern)}
+                  className="w-full mt-2 px-2 py-1 text-sm border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white"
+                >
+                  <option value="sequential">Sequential</option>
+                  <option value="parallel">Parallel</option>
+                  <option value="pipeline">Pipeline</option>
+                  <option value="review_loop">Dev↔QA Loop</option>
+                </select>
+                <div className="mt-2 flex gap-2">
+                  <button
+                    onClick={handleCreateTeam}
+                    className="flex-1 px-2 py-1 text-xs bg-blue-500 text-white rounded hover:bg-blue-600"
+                  >
+                    Create
+                  </button>
+                  <button
+                    onClick={() => setIsCreating(false)}
+                    className="flex-1 px-2 py-1 text-xs border rounded hover:bg-gray-100 dark:hover:bg-gray-700"
+                  >
+                    Cancel
+                  </button>
+                </div>
+              </div>
+            )}
+ 
+            <div className="space-y-2">
+              {teams.map(team => (
+                <div
+                  key={team.id}
+                  onClick={() => setActiveTeam(team)}
+                  className={`p-3 rounded-lg cursor-pointer transition-all ${
+                    activeTeam?.id === team.id
+                      ? 'bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-800'
+                      : 'hover:bg-gray-50 dark:hover:bg-gray-800'
+                  }`}
+                >
+                  <div className="flex items-center justify-between">
+                    <span className="font-medium text-gray-900 dark:text-white">{team.name}</span>
+                    <button
+                      onClick={(e) => { e.stopPropagation(); deleteTeam(team.id); }}
+                      className="p-1 text-gray-400 hover:text-red-500"
+                    >
+                      <Trash2 className="w-3.5 h-3.5" />
+                    </button>
+                  </div>
+                  <div className="mt-1 flex items-center gap-2 text-xs text-gray-500">
+                    <Users className="w-3 h-3" />
+                    <span>{team.members.length} members</span>
+                    <span>·</span>
+                    <span>{team.tasks.length} tasks</span>
+                  </div>
+                  <div className="mt-1">
+                    <span className="px-1.5 py-0.5 text-xs bg-gray-100 dark:bg-gray-700 rounded">
+                      {team.pattern}
+                    </span>
+                  </div>
+                </div>
+              ))}
+            </div>
+          </div>
+ 
+          {/* Main Content */}
+          {activeTeam ? (
+            <div className="flex-1 flex flex-col overflow-hidden">
+              {/* View Tabs */}
+              <div className="px-6 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center gap-4">
+                <button
+                  onClick={() => setView('tasks')}
+                  className={`px-3 py-1.5 rounded-lg text-sm font-medium ${
+                    view === 'tasks'
+                      ? 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300'
+                      : 'text-gray-500 hover:text-gray-700 dark:text-gray-400'
+                  }`}
+                >
+                  Tasks
+                </button>
+                <button
+                  onClick={() => setView('members')}
+                  className={`px-3 py-1.5 rounded-lg text-sm font-medium ${
+                    view === 'members'
+                      ? 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300'
+                      : 'text-gray-500 hover:text-gray-700 dark:text-gray-400'
+                  }`}
+                >
+                  Members
+                </button>
+                <button
+                  onClick={() => setView('review')}
+                  className={`px-3 py-1.5 rounded-lg text-sm font-medium flex items-center gap-1 ${
+                    view === 'review'
+                      ? 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300'
+                      : 'text-gray-500 hover:text-gray-700 dark:text-gray-400'
+                  }`}
+                >
+                  <RefreshCw className="w-4 h-4" />
+                  Review
+                  {activeTeam.activeLoops.length > 0 && (
+                    <span className="ml-1 px-1.5 py-0.5 text-xs bg-yellow-200 dark:bg-yellow-800 rounded-full">
+                      {activeTeam.activeLoops.length}
+                    </span>
+                  )}
+                </button>
+              </div>
+ 
+              {/* Tasks View */}
+              {view === 'tasks' && (
+                <div className="flex-1 p-6 overflow-y-auto">
+                  <div className="flex items-center justify-between mb-4">
+                    <h3 className="font-semibold text-gray-900 dark:text-white">Tasks</h3>
+                    <button
+                      onClick={handleAddTask}
+                      className="flex items-center gap-1 px-3 py-1.5 text-sm bg-blue-500 text-white rounded-lg hover:bg-blue-600"
+                    >
+                      <Plus className="w-4 h-4" />
+                      Add Task
+                    </button>
+                  </div>
+ 
+                  <div className="space-y-3">
+                    {activeTeam.tasks.length === 0 ? (
+                      <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+                        No tasks yet. Click "Add Task" to create one.
+                      </div>
+                    ) : (
+                      activeTeam.tasks.map(task => (
+                        <TaskCard
+                          key={task.id}
+                          task={task}
+                          members={activeTeam.members}
+                          isSelected={selectedTaskId === task.id}
+                          onSelect={() => setSelectedTask(task.id)}
+                          onAssign={(memberId) => assignTask(activeTeam.id, task.id, memberId)}
+                          onStatusChange={(status) => updateTaskStatus(activeTeam.id, task.id, status)}
+                        />
+                      ))
+                    )}
+                  </div>
+                </div>
+              )}
+ 
+              {/* Members View */}
+              {view === 'members' && (
+                <div className="flex-1 p-6 overflow-y-auto">
+                  <div className="flex items-center justify-between mb-4">
+                    <h3 className="font-semibold text-gray-900 dark:text-white">Members</h3>
+                    <div className="flex items-center gap-2">
+                      <select
+                        className="px-3 py-1.5 text-sm border rounded-lg dark:bg-gray-800 dark:border-gray-700 dark:text-white"
+                        onChange={(e) => handleAddMember(e.target.value)}
+                        value=""
+                      >
+                        <option value="">Add Agent...</option>
+                        {clones.map(clone => (
+                          <option key={clone.id} value={clone.id}>
+                            {clone.name || clone.nickname || clone.id}
+                          </option>
+                        ))}
+                      </select>
+                    </div>
+                  </div>
+ 
+                  <div className="grid grid-cols-2 gap-4">
+                    {activeTeam.members.length === 0 ? (
+                      <div className="col-span-2 text-center py-8 text-gray-500 dark:text-gray-400">
+                        No members yet. Select an agent to add.
+                      </div>
+                    ) : (
+                      activeTeam.members.map(member => (
+                        <MemberCard
+                          key={member.id}
+                          member={member}
+                          isSelected={selectedMemberId === member.id}
+                          onSelect={() => setSelectedMember(member.id)}
+                          onRoleChange={(role) => updateMemberRole(activeTeam.id, member.id, role)}
+                          onRemove={() => removeMember(activeTeam.id, member.id)}
+                        />
+                      ))
+                    )}
+                  </div>
+                </div>
+              )}
+ 
+              {/* Review View - Dev↔QA Loop */}
+              {view === 'review' && (
+                <div className="flex-1 p-6 overflow-y-auto">
+                  <div className="flex items-center justify-between mb-4">
+                    <h3 className="font-semibold text-gray-900 dark:text-white">Dev↔QA Review Loops</h3>
+                    <button
+                      onClick={async () => {
+                        // Start a new Dev↔QA loop with the first available task and members
+                        if (activeTeam.tasks.length > 0 && activeTeam.members.length >= 2) {
+                          const devMember = activeTeam.members.find(m => m.role === 'developer');
+                          const reviewerMember = activeTeam.members.find(m => m.role === 'reviewer');
+                          if (devMember && reviewerMember) {
+                            const task = activeTeam.tasks.find(t => t.status === 'pending' || t.status === 'in_progress');
+                            if (task) {
+                              await startDevQALoop(activeTeam.id, task.id, devMember.id, reviewerMember.id);
+                            }
+                          }
+                        }
+                      }}
+                      disabled={activeTeam.tasks.length === 0 || activeTeam.members.length < 2}
+                      className="flex items-center gap-1 px-3 py-1.5 text-sm bg-yellow-500 text-white rounded-lg hover:bg-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed"
+                    >
+                      <Plus className="w-4 h-4" />
+                      Start Review Loop
+                    </button>
+                  </div>
+ 
+                  {activeTeam.activeLoops.length === 0 ? (
+                    <div className="text-center py-8 text-gray-500 dark:text-gray-400">
+                      <RefreshCw className="w-12 h-12 mx-auto mb-4 text-gray-300 dark:text-gray-600" />
+                      <p>No active review loops.</p>
+                      <p className="text-sm mt-2">Add tasks and members, then start a Dev↔QA loop.</p>
+                    </div>
+                  ) : (
+                    <div className="space-y-4">
+                      {activeTeam.activeLoops.map(loop => {
+                        const task = activeTeam.tasks.find(t => t.id === loop.taskId);
+                        const developer = activeTeam.members.find(m => m.id === loop.developerId);
+                        const reviewer = activeTeam.members.find(m => m.id === loop.reviewerId);
+ 
+                        return (
+                          <DevQALoopPanel
+                            key={loop.id}
+                            loop={loop}
+                            teamId={activeTeam.id}
+                            developerName={developer?.name || 'Unknown Developer'}
+                            reviewerName={reviewer?.name || 'Unknown Reviewer'}
+                            taskTitle={task?.title || 'Unknown Task'}
+                          />
+                        );
+                      })}
+                    </div>
+                  )}
+                </div>
+              )}
+            </div>
+          ) : (
+            <div className="flex-1 flex items-center justify-center text-gray-500 dark:text-gray-400">
+              <div className="text-center">
+                <Users className="w-12 h-12 mx-auto mb-4 text-gray-300 dark:text-gray-600" />
+                <p>Select or create a team to get started</p>
+              </div>
+            </div>
+          )}
+        </div>
+ 
+        {/* Footer */}
+        <div className="px-6 py-3 border-t border-gray-200 dark:border-gray-700 flex items-center justify-between text-sm text-gray-500 dark:text-gray-400">
+          <span>{teams.length} teams total</span>
+          {error && <span className="text-red-500">{error}</span>}
+        </div>
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/TopBar.tsx.html b/desktop/coverage/src/components/TopBar.tsx.html new file mode 100644 index 0000000..f871561 --- /dev/null +++ b/desktop/coverage/src/components/TopBar.tsx.html @@ -0,0 +1,244 @@ + + + + + + Code coverage report for src/components/TopBar.tsx + + + + + + + + + +
+
+

All files / src/components TopBar.tsx

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ClipboardList } from 'lucide-react';
+import { Button } from './ui';
+ 
+interface TopBarProps {
+  title: string;
+  subtitle?: string;
+  onOpenDetail?: () => void;
+  showDetailButton?: boolean;
+}
+ 
+export function TopBar({
+  title,
+  subtitle,
+  onOpenDetail,
+  showDetailButton = true
+}: TopBarProps) {
+  return (
+    <header className="h-14 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700 flex items-center px-4 flex-shrink-0">
+      {/* 左侧标题 */}
+      <div className="flex items-center gap-2">
+        <div className="w-8 h-8 bg-gradient-to-br from-emerald-400 to-teal-500 rounded-lg flex items-center justify-center text-white font-bold shadow-sm">
+          <span className="text-sm">Z</span>
+        </div>
+        <div>
+          <span className="font-bold text-lg text-gray-900 dark:text-gray-100">{title}</span>
+          {subtitle && (
+            <span className="ml-2 text-sm text-gray-500 dark:text-gray-400">{subtitle}</span>
+          )}
+        </div>
+      </div>
+ 
+      {/* 中间区域 */}
+      <div className="flex-1" />
+ 
+      {/* 右侧按钮 */}
+      <div className="flex items-center gap-1">
+        {/* 详情按钮 */}
+        {showDetailButton && onOpenDetail && (
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={onOpenDetail}
+            className="flex items-center gap-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100"
+            title="显示详情面板"
+          >
+            <ClipboardList className="w-4 h-4" />
+            <span className="text-sm">详情</span>
+          </Button>
+        )}
+      </div>
+    </header>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/TriggersPanel.tsx.html b/desktop/coverage/src/components/TriggersPanel.tsx.html new file mode 100644 index 0000000..d235b5d --- /dev/null +++ b/desktop/coverage/src/components/TriggersPanel.tsx.html @@ -0,0 +1,814 @@ + + + + + + Code coverage report for src/components/TriggersPanel.tsx + + + + + + + + + +
+
+

All files / src/components TriggersPanel.tsx

+
+ +
+ 0% + Statements + 0/183 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/183 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * TriggersPanel - OpenFang Triggers Management UI
+ *
+ * Displays available OpenFang Triggers and allows creating and toggling them.
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore } from '../store/handStore';
+import type { Trigger } from '../store/handStore';
+import { CreateTriggerModal } from './CreateTriggerModal';
+import {
+  Zap,
+  RefreshCw,
+  Plus,
+  Globe,
+  Bell,
+  MessageSquare,
+  X,
+} from 'lucide-react';
+ 
+// === Trigger Type Config ===
+ 
+const TRIGGER_TYPE_CONFIG: Record<string, { icon: typeof Zap; label: string; color: string }> = {
+  webhook: { icon: Globe, label: 'Webhook', color: 'text-blue-500' },
+  event: { icon: Bell, label: '事件', color: 'text-amber-500' },
+  message: { icon: MessageSquare, label: '消息', color: 'text-green-500' },
+  schedule: { icon: Zap, label: '定时', color: 'text-purple-500' },
+  file: { icon: Zap, label: '文件', color: 'text-cyan-500' },
+  manual: { icon: Zap, label: '手动', color: 'text-gray-500' },
+};
+ 
+interface TriggerCardProps {
+  trigger: Trigger;
+  onToggle: (id: string, enabled: boolean) => Promise<void>;
+  onDelete: (id: string) => Promise<void>;
+  isToggling: boolean;
+  isDeleting: boolean;
+}
+ 
+function TriggerCard({ trigger, onToggle, onDelete, isToggling, isDeleting }: TriggerCardProps) {
+  const handleToggle = async () => {
+    await onToggle(trigger.id, !trigger.enabled);
+  };
+ 
+  const handleDelete = async () => {
+    if (confirm(`确定要删除触发器 "${trigger.id}" 吗?`)) {
+      await onDelete(trigger.id);
+    }
+  };
+ 
+  const typeConfig = TRIGGER_TYPE_CONFIG[trigger.type] || { icon: Zap, label: trigger.type, color: 'text-gray-500' };
+  const TypeIcon = typeConfig.icon;
+ 
+  return (
+    <div className={`bg-white dark:bg-gray-800 rounded-lg border p-4 shadow-sm transition-colors ${
+      trigger.enabled
+        ? 'border-green-200 dark:border-green-800'
+        : 'border-gray-200 dark:border-gray-700'
+    }`}>
+      <div className="flex items-center justify-between">
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2">
+            <TypeIcon className={`w-4 h-4 ${typeConfig.color}`} />
+            <h3 className="font-medium text-gray-900 dark:text-white truncate">{trigger.id}</h3>
+            <span className={`w-2 h-2 rounded-full flex-shrink-0 ${
+              trigger.enabled ? 'bg-green-500' : 'bg-gray-400'
+            }`} />
+          </div>
+          <div className="flex items-center gap-2 mt-1">
+            <span className="text-xs px-2 py-0.5 rounded bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400">
+              {typeConfig.label}
+            </span>
+            <span className={`text-xs ${trigger.enabled ? 'text-green-600 dark:text-green-400' : 'text-gray-500 dark:text-gray-400'}`}>
+              {trigger.enabled ? '已启用' : '已禁用'}
+            </span>
+          </div>
+        </div>
+        <div className="flex items-center gap-2 flex-shrink-0">
+          <button
+            onClick={handleDelete}
+            disabled={isDeleting}
+            className="p-1.5 text-gray-400 hover:text-red-500 rounded-md disabled:opacity-50"
+            title="删除"
+          >
+            <X className="w-4 h-4" />
+          </button>
+          <button
+            onClick={handleToggle}
+            disabled={isToggling || isDeleting}
+            className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${
+              trigger.enabled ? 'bg-blue-600' : 'bg-gray-300 dark:bg-gray-600'
+            } ${(isToggling || isDeleting) ? 'opacity-50 cursor-not-allowed' : ''}`}
+            title={trigger.enabled ? '点击禁用' : '点击启用'}
+          >
+            <span
+              className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
+                trigger.enabled ? 'translate-x-6' : 'translate-x-1'
+              }`}
+            />
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export function TriggersPanel() {
+  const triggers = useHandStore((s) => s.triggers);
+  const loadTriggers = useHandStore((s) => s.loadTriggers);
+  const updateTrigger = useHandStore((s) => s.updateTrigger);
+  const deleteTrigger = useHandStore((s) => s.deleteTrigger);
+  const isLoading = useHandStore((s) => s.isLoading);
+  const [togglingTrigger, setTogglingTrigger] = useState<string | null>(null);
+  const [deletingTrigger, setDeletingTrigger] = useState<string | null>(null);
+  const [refreshing, setRefreshing] = useState(false);
+  const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);
+ 
+  useEffect(() => {
+    loadTriggers();
+  }, [loadTriggers]);
+ 
+  const handleToggle = useCallback(async (id: string, enabled: boolean) => {
+    setTogglingTrigger(id);
+    try {
+      await updateTrigger(id, { enabled });
+      await loadTriggers();
+    } catch (error) {
+      console.error('Failed to toggle trigger:', error);
+    } finally {
+      setTogglingTrigger(null);
+    }
+  }, [updateTrigger, loadTriggers]);
+ 
+  const handleDelete = useCallback(async (id: string) => {
+    setDeletingTrigger(id);
+    try {
+      await deleteTrigger(id);
+      await loadTriggers();
+    } catch (error) {
+      console.error('Failed to delete trigger:', error);
+    } finally {
+      setDeletingTrigger(null);
+    }
+  }, [deleteTrigger, loadTriggers]);
+ 
+  const handleRefresh = useCallback(async () => {
+    setRefreshing(true);
+    try {
+      await loadTriggers();
+    } finally {
+      setRefreshing(false);
+    }
+  }, [loadTriggers]);
+ 
+  const handleCreateSuccess = useCallback(() => {
+    loadTriggers();
+  }, [loadTriggers]);
+ 
+  if (isLoading && triggers.length === 0) {
+    return (
+      <div className="p-4 text-center text-gray-500 dark:text-gray-400">
+        加载中...
+      </div>
+    );
+  }
+ 
+  const enabledCount = triggers.filter(t => t.enabled).length;
+  const totalCount = triggers.length;
+ 
+  return (
+    <>
+      <div className="space-y-4">
+        <div className="flex items-center justify-between">
+          <div className="flex items-center gap-2">
+            <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+              事件触发器
+            </h2>
+            <span className="text-sm text-gray-500 dark:text-gray-400">
+              {enabledCount}/{totalCount} 已启用
+            </span>
+          </div>
+          <div className="flex items-center gap-2">
+            <button
+              onClick={handleRefresh}
+              disabled={refreshing}
+              className="text-sm text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-50 flex items-center gap-1"
+            >
+              <RefreshCw className={`w-3.5 h-3.5 ${refreshing ? 'animate-spin' : ''}`} />
+              {refreshing ? '刷新中...' : '刷新'}
+            </button>
+            <button
+              onClick={() => setIsCreateModalOpen(true)}
+              className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-amber-600 text-white rounded-lg hover:bg-amber-700 transition-colors"
+            >
+              <Plus className="w-4 h-4" />
+              新建触发器
+            </button>
+          </div>
+        </div>
+ 
+        {triggers.length === 0 ? (
+          <div className="p-8 text-center bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
+            <div className="w-12 h-12 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-3">
+              <Zap className="w-6 h-6 text-amber-600 dark:text-amber-400" />
+            </div>
+            <p className="text-sm text-gray-500 dark:text-gray-400 mb-2">暂无事件触发器</p>
+            <p className="text-xs text-gray-400 dark:text-gray-500 mb-4 max-w-sm mx-auto">
+              事件触发器在系统事件(如收到消息、文件更改或 API webhook)发生时触发代理执行。
+            </p>
+            <button
+              onClick={() => setIsCreateModalOpen(true)}
+              className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm bg-amber-600 text-white rounded-lg hover:bg-amber-700 transition-colors"
+            >
+              <Plus className="w-4 h-4" />
+              创建事件触发器
+            </button>
+          </div>
+        ) : (
+          <div className="grid gap-3">
+            {triggers.map((trigger) => (
+              <TriggerCard
+                key={trigger.id}
+                trigger={trigger}
+                onToggle={handleToggle}
+                onDelete={handleDelete}
+                isToggling={togglingTrigger === trigger.id}
+                isDeleting={deletingTrigger === trigger.id}
+              />
+            ))}
+          </div>
+        )}
+      </div>
+ 
+      <CreateTriggerModal
+        isOpen={isCreateModalOpen}
+        onClose={() => setIsCreateModalOpen(false)}
+        onSuccess={handleCreateSuccess}
+      />
+    </>
+  );
+}
+ 
+export default TriggersPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/VikingPanel.tsx.html b/desktop/coverage/src/components/VikingPanel.tsx.html new file mode 100644 index 0000000..ad01751 --- /dev/null +++ b/desktop/coverage/src/components/VikingPanel.tsx.html @@ -0,0 +1,949 @@ + + + + + + Code coverage report for src/components/VikingPanel.tsx + + + + + + + + + +
+
+

All files / src/components VikingPanel.tsx

+
+ +
+ 0% + Statements + 0/221 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/221 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * VikingPanel - OpenViking Semantic Memory UI
+ *
+ * Provides interface for semantic search and knowledge base management.
+ * OpenViking is an optional sidecar for semantic memory operations.
+ */
+import { useState, useEffect } from 'react';
+import {
+  Search,
+  RefreshCw,
+  AlertCircle,
+  CheckCircle,
+  FileText,
+  Server,
+  Play,
+  Square,
+} from 'lucide-react';
+import {
+  getVikingStatus,
+  findVikingResources,
+  getVikingServerStatus,
+  startVikingServer,
+  stopVikingServer,
+} from '../lib/viking-client';
+import type { VikingStatus, VikingFindResult } from '../lib/viking-client';
+ 
+export function VikingPanel() {
+  const [status, setStatus] = useState<VikingStatus | null>(null);
+  const [isLoading, setIsLoading] = useState(true);
+  const [searchQuery, setSearchQuery] = useState('');
+  const [searchResults, setSearchResults] = useState<VikingFindResult[]>([]);
+  const [isSearching, setIsSearching] = useState(false);
+  const [serverRunning, setServerRunning] = useState(false);
+  const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
+ 
+  const loadStatus = async () => {
+    setIsLoading(true);
+    try {
+      const vikingStatus = await getVikingStatus();
+      setStatus(vikingStatus);
+ 
+      const serverStatus = await getVikingServerStatus();
+      setServerRunning(serverStatus.running);
+    } catch (error) {
+      console.error('Failed to load Viking status:', error);
+      setStatus({ available: false, error: String(error) });
+    } finally {
+      setIsLoading(false);
+    }
+  };
+ 
+  useEffect(() => {
+    loadStatus();
+  }, []);
+ 
+  const handleSearch = async () => {
+    if (!searchQuery.trim()) return;
+ 
+    setIsSearching(true);
+    setMessage(null);
+    try {
+      const results = await findVikingResources(searchQuery, undefined, 10);
+      setSearchResults(results);
+      if (results.length === 0) {
+        setMessage({ type: 'error', text: '未找到匹配的资源' });
+      }
+    } catch (error) {
+      setMessage({
+        type: 'error',
+        text: `搜索失败: ${error instanceof Error ? error.message : '未知错误'}`,
+      });
+    } finally {
+      setIsSearching(false);
+    }
+  };
+ 
+  const handleServerToggle = async () => {
+    try {
+      if (serverRunning) {
+        await stopVikingServer();
+        setServerRunning(false);
+        setMessage({ type: 'success', text: '服务器已停止' });
+      } else {
+        await startVikingServer();
+        setServerRunning(true);
+        setMessage({ type: 'success', text: '服务器已启动' });
+      }
+    } catch (error) {
+      setMessage({
+        type: 'error',
+        text: `操作失败: ${error instanceof Error ? error.message : '未知错误'}`,
+      });
+    }
+  };
+ 
+  return (
+    <div className="max-w-4xl">
+      {/* Header */}
+      <div className="flex justify-between items-center mb-6">
+        <div>
+          <h1 className="text-xl font-bold text-gray-900 dark:text-white">语义记忆</h1>
+          <p className="text-xs text-gray-500 dark:text-gray-400 mt-1">
+            OpenViking 语义搜索引擎
+          </p>
+        </div>
+        <div className="flex gap-2 items-center">
+          {status?.available && (
+            <span className="text-xs flex items-center gap-1 text-green-600">
+              <CheckCircle className="w-3 h-3" /> 可用
+            </span>
+          )}
+          <button
+            onClick={loadStatus}
+            disabled={isLoading}
+            className="text-xs text-white bg-orange-500 hover:bg-orange-600 px-3 py-1.5 rounded-lg flex items-center gap-1 transition-colors disabled:opacity-50"
+          >
+            <RefreshCw className={`w-3 h-3 ${isLoading ? 'animate-spin' : ''}`} /> 刷新
+          </button>
+        </div>
+      </div>
+ 
+      {/* Status Banner */}
+      {!status?.available && (
+        <div className="mb-6 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg">
+          <div className="flex items-start gap-2">
+            <AlertCircle className="w-4 h-4 text-amber-500 mt-0.5" />
+            <div className="text-xs text-amber-700 dark:text-amber-300">
+              <p className="font-medium">OpenViking CLI 不可用</p>
+              <p className="mt-1">
+                请安装 OpenViking CLI 或设置{' '}
+                <code className="bg-amber-100 dark:bg-amber-800 px-1 rounded">ZCLAW_VIKING_BIN</code> 环境变量。
+              </p>
+              {status?.error && (
+                <p className="mt-1 text-amber-600 dark:text-amber-400 font-mono text-xs">
+                  {status.error}
+                </p>
+              )}
+            </div>
+          </div>
+        </div>
+      )}
+ 
+      {/* Message */}
+      {message && (
+        <div
+          className={`mb-4 p-3 rounded-lg flex items-center gap-2 ${
+            message.type === 'success'
+              ? 'bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-300'
+              : 'bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300'
+          }`}
+        >
+          {message.type === 'success' ? (
+            <CheckCircle className="w-4 h-4" />
+          ) : (
+            <AlertCircle className="w-4 h-4" />
+          )}
+          {message.text}
+        </div>
+      )}
+ 
+      {/* Server Control */}
+      {status?.available && (
+        <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-4 mb-6 shadow-sm">
+          <div className="flex items-center justify-between">
+            <div className="flex items-center gap-3">
+              <div
+                className={`w-10 h-10 rounded-xl flex items-center justify-center ${
+                  serverRunning
+                    ? 'bg-gradient-to-br from-green-500 to-emerald-500 text-white'
+                    : 'bg-gray-200 dark:bg-gray-700 text-gray-400'
+                }`}
+              >
+                <Server className="w-4 h-4" />
+              </div>
+              <div>
+                <div className="text-sm font-medium text-gray-900 dark:text-white">
+                  Viking Server
+                </div>
+                <div className="text-xs text-gray-500 dark:text-gray-400">
+                  {serverRunning ? '运行中' : '已停止'}
+                </div>
+              </div>
+            </div>
+            <button
+              onClick={handleServerToggle}
+              className={`px-4 py-2 rounded-lg flex items-center gap-2 text-sm transition-colors ${
+                serverRunning
+                  ? 'bg-red-100 text-red-600 hover:bg-red-200 dark:bg-red-900/30 dark:text-red-400'
+                  : 'bg-green-100 text-green-600 hover:bg-green-200 dark:bg-green-900/30 dark:text-green-400'
+              }`}
+            >
+              {serverRunning ? (
+                <>
+                  <Square className="w-4 h-4" /> 停止
+                </>
+              ) : (
+                <>
+                  <Play className="w-4 h-4" /> 启动
+                </>
+              )}
+            </button>
+          </div>
+        </div>
+      )}
+ 
+      {/* Search Box */}
+      {status?.available && (
+        <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-4 mb-6 shadow-sm">
+          <h3 className="text-sm font-medium text-gray-900 dark:text-white mb-3">语义搜索</h3>
+          <div className="flex gap-2">
+            <input
+              type="text"
+              value={searchQuery}
+              onChange={(e) => setSearchQuery(e.target.value)}
+              onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
+              placeholder="输入自然语言查询..."
+              className="flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-900 text-gray-900 dark:text-white text-sm focus:ring-2 focus:ring-blue-500 focus:border-transparent"
+            />
+            <button
+              onClick={handleSearch}
+              disabled={isSearching || !searchQuery.trim()}
+              className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 flex items-center gap-2 text-sm"
+            >
+              {isSearching ? (
+                <RefreshCw className="w-4 h-4 animate-spin" />
+              ) : (
+                <Search className="w-4 h-4" />
+              )}
+              搜索
+            </button>
+          </div>
+        </div>
+      )}
+ 
+      {/* Search Results */}
+      {searchResults.length > 0 && (
+        <div className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-sm divide-y divide-gray-100 dark:divide-gray-700">
+          <div className="p-3 border-b border-gray-200 dark:border-gray-700">
+            <span className="text-xs text-gray-500">
+              找到 {searchResults.length} 个结果
+            </span>
+          </div>
+          {searchResults.map((result, index) => (
+            <div key={`${result.uri}-${index}`} className="p-4">
+              <div className="flex items-start gap-3">
+                <div className="w-8 h-8 rounded-lg bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center flex-shrink-0">
+                  <FileText className="w-4 h-4 text-blue-600 dark:text-blue-400" />
+                </div>
+                <div className="flex-1 min-w-0">
+                  <div className="flex items-center gap-2">
+                    <span className="text-sm font-medium text-gray-900 dark:text-white truncate">
+                      {result.uri}
+                    </span>
+                    <span className="text-xs text-gray-400 bg-gray-100 dark:bg-gray-700 px-2 py-0.5 rounded">
+                      {result.level}
+                    </span>
+                    <span className="text-xs text-blue-600 dark:text-blue-400">
+                      {Math.round(result.score * 100)}%
+                    </span>
+                  </div>
+                  {result.overview && (
+                    <p className="text-xs text-gray-500 dark:text-gray-400 mt-1 line-clamp-2">
+                      {result.overview}
+                    </p>
+                  )}
+                  <p className="text-xs text-gray-600 dark:text-gray-300 mt-2 line-clamp-3 font-mono">
+                    {result.content}
+                  </p>
+                </div>
+              </div>
+            </div>
+          ))}
+        </div>
+      )}
+ 
+      {/* Info Section */}
+      <div className="mt-6 p-4 bg-gray-50 dark:bg-gray-800/50 rounded-lg border border-gray-200 dark:border-gray-700">
+        <h3 className="text-sm font-medium text-gray-900 dark:text-white mb-2">关于 OpenViking</h3>
+        <ul className="text-xs text-gray-500 dark:text-gray-400 space-y-1">
+          <li>• 语义搜索引擎,支持自然语言查询</li>
+          <li>• 自动提取和索引知识资源</li>
+          <li>• 支持多种文档格式和代码文件</li>
+          <li>• 可作为本地知识库增强 AI 对话</li>
+        </ul>
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/NodePalette.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/NodePalette.tsx.html new file mode 100644 index 0000000..c4d745b --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/NodePalette.tsx.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/NodePalette.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder NodePalette.tsx

+
+ +
+ 0% + Statements + 0/60 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/60 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Node Palette Component
+ *
+ * Draggable palette of available node types.
+ */
+ 
+import { DragEvent } from 'react';
+import type { NodePaletteItem, NodeCategory } from '../../lib/workflow-builder/types';
+ 
+interface NodePaletteProps {
+  categories: Record<NodeCategory, NodePaletteItem[]>;
+  onDragStart: (type: string) => void;
+  onDragEnd: () => void;
+}
+ 
+const categoryLabels: Record<NodeCategory, { label: string; color: string }> = {
+  input: { label: 'Input', color: 'emerald' },
+  ai: { label: 'AI & Skills', color: 'violet' },
+  action: { label: 'Actions', color: 'amber' },
+  control: { label: 'Control Flow', color: 'orange' },
+  output: { label: 'Output', color: 'blue' },
+};
+ 
+export function NodePalette({ categories, onDragStart, onDragEnd }: NodePaletteProps) {
+  const handleDragStart = (event: DragEvent, type: string) => {
+    event.dataTransfer.setData('application/reactflow', type);
+    event.dataTransfer.effectAllowed = 'move';
+    onDragStart(type);
+  };
+ 
+  const handleDragEnd = () => {
+    onDragEnd();
+  };
+ 
+  return (
+    <div className="w-64 bg-white border-r border-gray-200 overflow-y-auto">
+      <div className="p-4 border-b border-gray-200">
+        <h2 className="font-semibold text-gray-800">Nodes</h2>
+        <p className="text-sm text-gray-500">Drag nodes to canvas</p>
+      </div>
+ 
+      <div className="p-2">
+        {(Object.keys(categories) as NodeCategory[]).map((category) => {
+          const items = categories[category];
+          if (items.length === 0) return null;
+ 
+          const { label, color } = categoryLabels[category];
+ 
+          return (
+            <div key={category} className="mb-4">
+              <h3
+                className={`text-sm font-medium text-${color}-700 mb-2 px-2`}
+              >
+                {label}
+              </h3>
+ 
+              <div className="space-y-1">
+                {items.map((item) => (
+                  <div
+                    key={item.type}
+                    draggable
+                    onDragStart={(e) => handleDragStart(e, item.type)}
+                    onDragEnd={handleDragEnd}
+                    className={`
+                      flex items-center gap-3 px-3 py-2 rounded-lg
+                      bg-gray-50 hover:bg-gray-100 cursor-grab
+                      border border-transparent hover:border-gray-200
+                      transition-all duration-150
+                      active:cursor-grabbing
+                    `}
+                  >
+                    <span className="text-lg">{item.icon}</span>
+                    <div className="flex-1 min-w-0">
+                      <div className="font-medium text-gray-700 text-sm">
+                        {item.label}
+                      </div>
+                      <div className="text-xs text-gray-500 truncate">
+                        {item.description}
+                      </div>
+                    </div>
+                  </div>
+                ))}
+              </div>
+            </div>
+          );
+        })}
+      </div>
+    </div>
+  );
+}
+ 
+export default NodePalette;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/PropertyPanel.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/PropertyPanel.tsx.html new file mode 100644 index 0000000..5391b00 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/PropertyPanel.tsx.html @@ -0,0 +1,967 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/PropertyPanel.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder PropertyPanel.tsx

+
+ +
+ 0% + Statements + 0/236 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/236 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Property Panel Component
+ *
+ * Panel for editing node properties.
+ */
+ 
+import { useState, useEffect } from 'react';
+import type { WorkflowNodeData } from '../../lib/workflow-builder/types';
+ 
+interface PropertyPanelProps {
+  nodeId: string;
+  nodeData: WorkflowNodeData | undefined;
+  onUpdate: (data: Partial<WorkflowNodeData>) => void;
+  onDelete: () => void;
+  onClose: () => void;
+}
+ 
+export function PropertyPanel({
+  nodeData,
+  onUpdate,
+  onDelete,
+  onClose,
+}: PropertyPanelProps) {
+  const [localData, setLocalData] = useState<Partial<WorkflowNodeData>>({});
+ 
+  useEffect(() => {
+    if (nodeData) {
+      setLocalData(nodeData);
+    }
+  }, [nodeData]);
+ 
+  if (!nodeData) return null;
+ 
+  const handleChange = (field: string, value: unknown) => {
+    const updated = { ...localData, [field]: value };
+    setLocalData(updated);
+    onUpdate({ [field]: value } as Partial<WorkflowNodeData>);
+  };
+ 
+  return (
+    <div className="w-80 bg-white border-l border-gray-200 overflow-y-auto">
+      {/* Header */}
+      <div className="flex items-center justify-between px-4 py-3 border-b border-gray-200">
+        <h2 className="font-semibold text-gray-800">Properties</h2>
+        <button
+          onClick={onClose}
+          className="text-gray-400 hover:text-gray-600"
+        >
+          ✕
+        </button>
+      </div>
+ 
+      {/* Content */}
+      <div className="p-4 space-y-4">
+        {/* Common Fields */}
+        <div>
+          <label className="block text-sm font-medium text-gray-700 mb-1">
+            Label
+          </label>
+          <input
+            type="text"
+            value={localData.label || ''}
+            onChange={(e) => handleChange('label', e.target.value)}
+            className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
+          />
+        </div>
+ 
+        {/* Type-specific Fields */}
+        {renderTypeSpecificFields(nodeData.type, localData, handleChange)}
+ 
+        {/* Delete Button */}
+        <div className="pt-4 border-t border-gray-200">
+          <button
+            onClick={onDelete}
+            className="w-full px-4 py-2 text-red-600 bg-red-50 border border-red-200 rounded-lg hover:bg-red-100"
+          >
+            Delete Node
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+function renderTypeSpecificFields(
+  type: string,
+  data: Partial<WorkflowNodeData>,
+  onChange: (field: string, value: unknown) => void
+) {
+  switch (type) {
+    case 'input':
+      return (
+        <>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Variable Name
+            </label>
+            <input
+              type="text"
+              value={(data as any).variableName || ''}
+              onChange={(e) => onChange('variableName', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg font-mono"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Default Value
+            </label>
+            <textarea
+              value={(data as any).defaultValue || ''}
+              onChange={(e) => {
+                try {
+                  const parsed = JSON.parse(e.target.value);
+                  onChange('defaultValue', parsed);
+                } catch {
+                  onChange('defaultValue', e.target.value);
+                }
+              }}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg font-mono text-sm"
+              rows={3}
+              placeholder="JSON or string value"
+            />
+          </div>
+        </>
+      );
+ 
+    case 'llm':
+      return (
+        <>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Template
+            </label>
+            <textarea
+              value={(data as any).template || ''}
+              onChange={(e) => onChange('template', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg font-mono text-sm"
+              rows={6}
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Model Override
+            </label>
+            <input
+              type="text"
+              value={(data as any).model || ''}
+              onChange={(e) => onChange('model', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg"
+              placeholder="e.g., gpt-4"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Temperature
+            </label>
+            <input
+              type="number"
+              min="0"
+              max="2"
+              step="0.1"
+              value={(data as any).temperature ?? ''}
+              onChange={(e) => onChange('temperature', parseFloat(e.target.value))}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg"
+            />
+          </div>
+          <div className="flex items-center gap-2">
+            <input
+              type="checkbox"
+              checked={(data as any).jsonMode || false}
+              onChange={(e) => onChange('jsonMode', e.target.checked)}
+              className="w-4 h-4 text-blue-600 rounded"
+            />
+            <label className="text-sm text-gray-700">JSON Mode</label>
+          </div>
+        </>
+      );
+ 
+    case 'skill':
+      return (
+        <>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Skill ID
+            </label>
+            <input
+              type="text"
+              value={(data as any).skillId || ''}
+              onChange={(e) => onChange('skillId', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg font-mono"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Input Mappings (JSON)
+            </label>
+            <textarea
+              value={JSON.stringify((data as any).inputMappings || {}, null, 2)}
+              onChange={(e) => {
+                try {
+                  const parsed = JSON.parse(e.target.value);
+                  onChange('inputMappings', parsed);
+                } catch {
+                  // Invalid JSON, ignore
+                }
+              }}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg font-mono text-sm"
+              rows={4}
+            />
+          </div>
+        </>
+      );
+ 
+    case 'hand':
+      return (
+        <>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Hand ID
+            </label>
+            <input
+              type="text"
+              value={(data as any).handId || ''}
+              onChange={(e) => onChange('handId', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg font-mono"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Action
+            </label>
+            <input
+              type="text"
+              value={(data as any).action || ''}
+              onChange={(e) => onChange('action', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg"
+            />
+          </div>
+        </>
+      );
+ 
+    case 'export':
+      return (
+        <>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Formats
+            </label>
+            <div className="space-y-2">
+              {['json', 'markdown', 'html', 'pptx', 'pdf'].map((format) => (
+                <label key={format} className="flex items-center gap-2">
+                  <input
+                    type="checkbox"
+                    checked={((data as any).formats || []).includes(format)}
+                    onChange={(e) => {
+                      const formats = (data as any).formats || [];
+                      if (e.target.checked) {
+                        onChange('formats', [...formats, format]);
+                      } else {
+                        onChange('formats', formats.filter((f: string) => f !== format));
+                      }
+                    }}
+                    className="w-4 h-4 text-blue-600 rounded"
+                  />
+                  <span className="text-sm text-gray-700 capitalize">{format}</span>
+                </label>
+              ))}
+            </div>
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-gray-700 mb-1">
+              Output Directory
+            </label>
+            <input
+              type="text"
+              value={(data as any).outputDir || ''}
+              onChange={(e) => onChange('outputDir', e.target.value)}
+              className="w-full px-3 py-2 border border-gray-300 rounded-lg"
+              placeholder="./output"
+            />
+          </div>
+        </>
+      );
+ 
+    default:
+      return (
+        <div className="text-sm text-gray-500 italic">
+          No additional properties for this node type.
+        </div>
+      );
+  }
+}
+ 
+export default PropertyPanel;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/WorkflowBuilder.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/WorkflowBuilder.tsx.html new file mode 100644 index 0000000..e6b8b54 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/WorkflowBuilder.tsx.html @@ -0,0 +1,1057 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/WorkflowBuilder.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder WorkflowBuilder.tsx

+
+ +
+ 0% + Statements + 0/222 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/222 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Builder Component
+ *
+ * Visual workflow editor using React Flow for creating and editing
+ * Pipeline DSL configurations.
+ */
+ 
+import { useCallback, useRef, useEffect } from 'react';
+import {
+  ReactFlow,
+  Controls,
+  Background,
+  MiniMap,
+  BackgroundVariant,
+  Connection,
+  addEdge,
+  useNodesState,
+  useEdgesState,
+  Node,
+  NodeChange,
+  EdgeChange,
+  Edge,
+  NodeTypes,
+  ReactFlowProvider,
+  useReactFlow,
+} from '@xyflow/react';
+import '@xyflow/react/dist/style.css';
+ 
+import { useWorkflowBuilderStore, paletteCategories } from '../../store/workflowBuilderStore';
+import type { WorkflowNodeData, WorkflowNodeType } from '../../lib/workflow-builder/types';
+ 
+// Import custom node components
+import { InputNode } from './nodes/InputNode';
+import { LlmNode } from './nodes/LlmNode';
+import { SkillNode } from './nodes/SkillNode';
+import { HandNode } from './nodes/HandNode';
+import { ConditionNode } from './nodes/ConditionNode';
+import { ParallelNode } from './nodes/ParallelNode';
+import { ExportNode } from './nodes/ExportNode';
+import { HttpNode } from './nodes/HttpNode';
+import { OrchestrationNode } from './nodes/OrchestrationNode';
+ 
+import { NodePalette } from './NodePalette';
+import { PropertyPanel } from './PropertyPanel';
+import { WorkflowToolbar } from './WorkflowToolbar';
+ 
+// =============================================================================
+// Node Types Configuration
+// =============================================================================
+ 
+const nodeTypes: NodeTypes = {
+  input: InputNode,
+  llm: LlmNode,
+  skill: SkillNode,
+  hand: HandNode,
+  condition: ConditionNode,
+  parallel: ParallelNode,
+  export: ExportNode,
+  http: HttpNode,
+  orchestration: OrchestrationNode,
+};
+ 
+// =============================================================================
+// Main Component
+// =============================================================================
+ 
+export function WorkflowBuilderInternal() {
+  const reactFlowWrapper = useRef<HTMLDivElement>(null);
+  const { screenToFlowPosition } = useReactFlow();
+ 
+  const {
+    canvas,
+    isDirty,
+    selectedNodeId,
+    validation,
+    addNode,
+    updateNode,
+    deleteNode,
+    addEdge: addStoreEdge,
+    selectNode,
+    saveWorkflow,
+    validate,
+    setDragging,
+  } = useWorkflowBuilderStore();
+ 
+  // Local state for React Flow
+  const [nodes, setNodes, onNodesChange] = useNodesState<Node<WorkflowNodeData>>([]);
+  const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);
+ 
+  // Sync canvas state with React Flow
+  useEffect(() => {
+    if (canvas) {
+      setNodes(canvas.nodes.map(n => ({
+        id: n.id,
+        type: n.type,
+        position: n.position,
+        data: n.data as WorkflowNodeData,
+      })));
+      setEdges(canvas.edges.map(e => ({
+        id: e.id,
+        source: e.source,
+        target: e.target,
+        type: e.type || 'default',
+        animated: true,
+      })));
+    } else {
+      setNodes([]);
+      setEdges([]);
+    }
+  }, [canvas?.id]);
+ 
+  // Handle node changes (position, selection)
+  const handleNodesChange = useCallback(
+    (changes: NodeChange<Node<WorkflowNodeData>>[]) => {
+      onNodesChange(changes);
+ 
+      // Sync position changes back to store
+      for (const change of changes) {
+        if (change.type === 'position' && change.position) {
+          const node = nodes.find(n => n.id === change.id);
+          if (node) {
+            // Position updates are handled by React Flow internally
+          }
+        }
+        if (change.type === 'select') {
+          selectNode(change.selected ? change.id : null);
+        }
+      }
+    },
+    [onNodesChange, nodes, selectNode]
+  );
+ 
+  // Handle edge changes
+  const handleEdgesChange = useCallback(
+    (changes: EdgeChange[]) => {
+      onEdgesChange(changes);
+    },
+    [onEdgesChange]
+  );
+ 
+  // Handle new connections
+  const onConnect = useCallback(
+    (connection: Connection) => {
+      if (connection.source && connection.target) {
+        addStoreEdge(connection.source, connection.target);
+        setEdges((eds) =>
+          addEdge(
+            {
+              ...connection,
+              type: 'default',
+              animated: true,
+            },
+            eds
+          )
+        );
+      }
+    },
+    [addStoreEdge, setEdges]
+  );
+ 
+  // Handle node click
+  const onNodeClick = useCallback(
+    (_event: React.MouseEvent, node: Node) => {
+      selectNode(node.id);
+    },
+    [selectNode]
+  );
+ 
+  // Handle pane click (deselect)
+  const onPaneClick = useCallback(() => {
+    selectNode(null);
+  }, [selectNode]);
+ 
+  // Handle drag over for palette items
+  const onDragOver = useCallback((event: React.DragEvent) => {
+    event.preventDefault();
+    event.dataTransfer.dropEffect = 'move';
+  }, []);
+ 
+  // Handle drop from palette
+  const onDrop = useCallback(
+    (event: React.DragEvent) => {
+      event.preventDefault();
+ 
+      const type = event.dataTransfer.getData('application/reactflow') as WorkflowNodeType;
+      if (!type) return;
+ 
+      const position = screenToFlowPosition({
+        x: event.clientX,
+        y: event.clientY,
+      });
+ 
+      addNode(type, position);
+    },
+    [screenToFlowPosition, addNode]
+  );
+ 
+  // Handle keyboard shortcuts
+  useEffect(() => {
+    const handleKeyDown = (event: KeyboardEvent) => {
+      // Delete selected node
+      if ((event.key === 'Delete' || event.key === 'Backspace') && selectedNodeId) {
+        deleteNode(selectedNodeId);
+      }
+ 
+      // Save workflow
+      if ((event.ctrlKey || event.metaKey) && event.key === 's') {
+        event.preventDefault();
+        saveWorkflow();
+      }
+    };
+ 
+    window.addEventListener('keydown', handleKeyDown);
+    return () => window.removeEventListener('keydown', handleKeyDown);
+  }, [selectedNodeId, deleteNode, saveWorkflow]);
+ 
+  if (!canvas) {
+    return (
+      <div className="flex items-center justify-center h-full bg-gray-50">
+        <div className="text-center">
+          <p className="text-gray-500 mb-4">No workflow loaded</p>
+          <button
+            onClick={() => useWorkflowBuilderStore.getState().createNewWorkflow('New Workflow')}
+            className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
+          >
+            Create New Workflow
+          </button>
+        </div>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="flex h-full">
+      {/* Node Palette */}
+      <NodePalette
+        categories={paletteCategories}
+        onDragStart={() => {
+          setDragging(true);
+        }}
+        onDragEnd={() => {
+          setDragging(false);
+        }}
+      />
+ 
+      {/* Canvas */}
+      <div className="flex-1 flex flex-col">
+        <WorkflowToolbar
+          workflowName={canvas.name}
+          isDirty={isDirty}
+          validation={validation}
+          onSave={saveWorkflow}
+          onValidate={validate}
+        />
+ 
+        <div ref={reactFlowWrapper} className="flex-1">
+          <ReactFlow
+            nodes={nodes}
+            edges={edges}
+            onNodesChange={handleNodesChange}
+            onEdgesChange={handleEdgesChange}
+            onConnect={onConnect}
+            onNodeClick={onNodeClick}
+            onPaneClick={onPaneClick}
+            onDragOver={onDragOver}
+            onDrop={onDrop}
+            nodeTypes={nodeTypes}
+            fitView
+            snapToGrid
+            snapGrid={[15, 15]}
+            defaultEdgeOptions={{
+              animated: true,
+              type: 'smoothstep',
+            }}
+          >
+            <Controls />
+            <MiniMap
+              nodeColor={(node) => {
+                switch (node.type) {
+                  case 'input':
+                    return '#10b981';
+                  case 'llm':
+                    return '#8b5cf6';
+                  case 'skill':
+                    return '#f59e0b';
+                  case 'hand':
+                    return '#ef4444';
+                  case 'export':
+                    return '#3b82f6';
+                  default:
+                    return '#6b7280';
+                }
+              }}
+              maskColor="rgba(0, 0, 0, 0.1)"
+            />
+            <Background variant={BackgroundVariant.Dots} gap={20} size={1} />
+          </ReactFlow>
+        </div>
+      </div>
+ 
+      {/* Property Panel */}
+      {selectedNodeId && (
+        <PropertyPanel
+          nodeId={selectedNodeId}
+          nodeData={nodes.find(n => n.id === selectedNodeId)?.data as WorkflowNodeData}
+          onUpdate={(data) => updateNode(selectedNodeId, data)}
+          onDelete={() => deleteNode(selectedNodeId)}
+          onClose={() => selectNode(null)}
+        />
+      )}
+    </div>
+  );
+}
+ 
+// Export with provider
+export function WorkflowBuilder() {
+  return (
+    <ReactFlowProvider>
+      <WorkflowBuilderInternal />
+    </ReactFlowProvider>
+  );
+}
+ 
+export default WorkflowBuilder;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/WorkflowToolbar.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/WorkflowToolbar.tsx.html new file mode 100644 index 0000000..3c47cd2 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/WorkflowToolbar.tsx.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/WorkflowToolbar.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder WorkflowToolbar.tsx

+
+ +
+ 0% + Statements + 0/114 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/114 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Toolbar Component
+ *
+ * Toolbar with actions for the workflow builder.
+ */
+ 
+import { useState } from 'react';
+import type { ValidationResult } from '../../lib/workflow-builder/types';
+import { canvasToYaml } from '../../lib/workflow-builder/yaml-converter';
+import { useWorkflowBuilderStore } from '../../store/workflowBuilderStore';
+ 
+interface WorkflowToolbarProps {
+  workflowName: string;
+  isDirty: boolean;
+  validation: ValidationResult | null;
+  onSave: () => void;
+  onValidate: () => ValidationResult;
+}
+ 
+export function WorkflowToolbar({
+  workflowName,
+  isDirty,
+  validation,
+  onSave,
+  onValidate,
+}: WorkflowToolbarProps) {
+  const [isPreviewOpen, setIsPreviewOpen] = useState(false);
+  const [yamlPreview, setYamlPreview] = useState('');
+  const canvas = useWorkflowBuilderStore(state => state.canvas);
+ 
+  const handlePreviewYaml = () => {
+    if (canvas) {
+      const yaml = canvasToYaml(canvas);
+      setYamlPreview(yaml);
+      setIsPreviewOpen(true);
+    }
+  };
+ 
+  const handleCopyYaml = async () => {
+    try {
+      await navigator.clipboard.writeText(yamlPreview);
+      alert('YAML copied to clipboard!');
+    } catch (err) {
+      console.error('Failed to copy:', err);
+    }
+  };
+ 
+  const handleDownloadYaml = () => {
+    const blob = new Blob([yamlPreview], { type: 'text/yaml' });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement('a');
+    a.href = url;
+    a.download = `${workflowName.replace(/\s+/g, '-').toLowerCase()}.yaml`;
+    a.click();
+    URL.revokeObjectURL(url);
+  };
+ 
+  return (
+    <>
+      <div className="flex items-center justify-between px-4 py-2 bg-white border-b border-gray-200">
+        {/* Left: Workflow Name */}
+        <div className="flex items-center gap-3">
+          <h1 className="font-semibold text-gray-800">{workflowName}</h1>
+          {isDirty && (
+            <span className="text-sm text-amber-600 flex items-center gap-1">
+              <span className="w-2 h-2 bg-amber-400 rounded-full animate-pulse" />
+              Unsaved
+            </span>
+          )}
+        </div>
+ 
+        {/* Center: Validation Status */}
+        {validation && (
+          <div className="flex items-center gap-2">
+            {validation.valid ? (
+              <span className="text-sm text-green-600 flex items-center gap-1">
+                ✓ Valid
+              </span>
+            ) : (
+              <span className="text-sm text-red-600 flex items-center gap-1">
+                ✕ {validation.errors.length} error(s)
+              </span>
+            )}
+            {validation.warnings.length > 0 && (
+              <span className="text-sm text-amber-600">
+                {validation.warnings.length} warning(s)
+              </span>
+            )}
+          </div>
+        )}
+ 
+        {/* Right: Actions */}
+        <div className="flex items-center gap-2">
+          <button
+            onClick={onValidate}
+            className="px-3 py-1.5 text-sm text-gray-600 hover:text-gray-800 hover:bg-gray-100 rounded-lg"
+          >
+            Validate
+          </button>
+ 
+          <button
+            onClick={handlePreviewYaml}
+            className="px-3 py-1.5 text-sm text-gray-600 hover:text-gray-800 hover:bg-gray-100 rounded-lg"
+          >
+            Preview YAML
+          </button>
+ 
+          <button
+            onClick={onSave}
+            disabled={!isDirty}
+            className={`
+              px-4 py-1.5 text-sm rounded-lg font-medium
+              ${isDirty
+                ? 'bg-blue-500 text-white hover:bg-blue-600'
+                : 'bg-gray-100 text-gray-400 cursor-not-allowed'
+              }
+            `}
+          >
+            Save
+          </button>
+        </div>
+      </div>
+ 
+      {/* YAML Preview Modal */}
+      {isPreviewOpen && (
+        <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50">
+          <div className="bg-white rounded-xl shadow-xl w-[800px] max-h-[80vh] overflow-hidden">
+            {/* Modal Header */}
+            <div className="flex items-center justify-between px-4 py-3 border-b border-gray-200">
+              <h2 className="font-semibold text-gray-800">Pipeline YAML</h2>
+              <div className="flex items-center gap-2">
+                <button
+                  onClick={handleCopyYaml}
+                  className="px-3 py-1.5 text-sm text-gray-600 hover:bg-gray-100 rounded-lg"
+                >
+                  Copy
+                </button>
+                <button
+                  onClick={handleDownloadYaml}
+                  className="px-3 py-1.5 text-sm text-gray-600 hover:bg-gray-100 rounded-lg"
+                >
+                  Download
+                </button>
+                <button
+                  onClick={() => setIsPreviewOpen(false)}
+                  className="px-3 py-1.5 text-sm text-gray-400 hover:text-gray-600"
+                >
+                  ✕
+                </button>
+              </div>
+            </div>
+ 
+            {/* YAML Content */}
+            <div className="p-4 overflow-y-auto max-h-[60vh]">
+              <pre className="text-sm font-mono text-gray-800 whitespace-pre-wrap">
+                {yamlPreview}
+              </pre>
+            </div>
+          </div>
+        </div>
+      )}
+    </>
+  );
+}
+ 
+export default WorkflowToolbar;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/index.html b/desktop/coverage/src/components/WorkflowBuilder/index.html new file mode 100644 index 0000000..e7407d7 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder + + + + + + + + + +
+
+

All files src/components/WorkflowBuilder

+
+ +
+ 0% + Statements + 0/633 +
+ + +
+ 0% + Branches + 0/5 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 0% + Lines + 0/633 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
NodePalette.tsx +
+
0%0/600%0/10%0/10%0/60
PropertyPanel.tsx +
+
0%0/2360%0/10%0/10%0/236
WorkflowBuilder.tsx +
+
0%0/2220%0/10%0/10%0/222
WorkflowToolbar.tsx +
+
0%0/1140%0/10%0/10%0/114
index.ts +
+
0%0/10%0/10%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/index.ts.html b/desktop/coverage/src/components/WorkflowBuilder/index.ts.html new file mode 100644 index 0000000..30410bf --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/index.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/index.ts + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Builder Components
+ *
+ * Export all workflow builder components.
+ */
+ 
+export { WorkflowBuilder, WorkflowBuilderInternal } from './WorkflowBuilder';
+export { NodePalette } from './NodePalette';
+export { PropertyPanel } from './PropertyPanel';
+export { WorkflowToolbar } from './WorkflowToolbar';
+ 
+// Node components
+export { InputNode } from './nodes/InputNode';
+export { LlmNode } from './nodes/LlmNode';
+export { SkillNode } from './nodes/SkillNode';
+export { HandNode } from './nodes/HandNode';
+export { ConditionNode } from './nodes/ConditionNode';
+export { ParallelNode } from './nodes/ParallelNode';
+export { ExportNode } from './nodes/ExportNode';
+export { HttpNode } from './nodes/HttpNode';
+export { OrchestrationNode } from './nodes/OrchestrationNode';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/ConditionNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/ConditionNode.tsx.html new file mode 100644 index 0000000..379ddd9 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/ConditionNode.tsx.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/ConditionNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes ConditionNode.tsx

+
+ +
+ 0% + Statements + 0/52 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Condition Node Component
+ *
+ * Node for conditional branching.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { ConditionNodeData } from '../../../lib/workflow-builder/types';
+ 
+type ConditionNodeType = Node<ConditionNodeData>;
+ 
+export const ConditionNode = memo(({ data, selected }: NodeProps<ConditionNodeType>) => {
+  const branchCount = data.branches.length + (data.hasDefault ? 1 : 0);
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[200px]
+        bg-orange-50 border-orange-300
+        ${selected ? 'border-orange-500 shadow-lg shadow-orange-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-orange-400 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">🔀</span>
+        <span className="font-medium text-orange-800">{data.label}</span>
+      </div>
+ 
+      {/* Condition Preview */}
+      <div className="text-sm text-orange-600 bg-orange-100 rounded px-2 py-1 font-mono mb-2">
+        {data.condition || 'No condition'}
+      </div>
+ 
+      {/* Branches */}
+      <div className="space-y-1">
+        {data.branches.map((branch: { label?: string; when: string }, index: number) => (
+          <div key={index} className="flex items-center justify-between">
+            <div className="relative">
+              {/* Branch Output Handle */}
+              <Handle
+                type="source"
+                position={Position.Right}
+                id={`branch-${index}`}
+                style={{ top: `${((index + 1) / (branchCount + 1)) * 100}%` }}
+                className="w-3 h-3 bg-orange-400 border-2 border-white"
+              />
+            </div>
+            <span className="text-xs text-orange-500 truncate max-w-[120px]">
+              {branch.label || branch.when}
+            </span>
+          </div>
+        ))}
+ 
+        {data.hasDefault && (
+          <div className="flex items-center justify-between">
+            <Handle
+              type="source"
+              position={Position.Right}
+              id="default"
+              style={{ top: '100%' }}
+              className="w-3 h-3 bg-gray-400 border-2 border-white"
+            />
+            <span className="text-xs text-gray-500">Default</span>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+});
+ 
+ConditionNode.displayName = 'ConditionNode';
+ 
+export default ConditionNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/ExportNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/ExportNode.tsx.html new file mode 100644 index 0000000..ade03db --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/ExportNode.tsx.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/ExportNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes ExportNode.tsx

+
+ +
+ 0% + Statements + 0/44 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Export Node Component
+ *
+ * Node for exporting workflow results to various formats.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { ExportNodeData } from '../../../lib/workflow-builder/types';
+ 
+export const ExportNode = memo(({ data, selected }: NodeProps<Node<ExportNodeData>>) => {
+  const formatLabels: Record<string, string> = {
+    pptx: 'PowerPoint',
+    html: 'HTML',
+    pdf: 'PDF',
+    markdown: 'Markdown',
+    json: 'JSON',
+  };
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[180px]
+        bg-blue-50 border-blue-300
+        ${selected ? 'border-blue-500 shadow-lg shadow-blue-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-blue-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-blue-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">📤</span>
+        <span className="font-medium text-blue-800">{data.label}</span>
+      </div>
+ 
+      {/* Formats */}
+      <div className="flex flex-wrap gap-1">
+        {data.formats.map((format) => (
+          <span
+            key={format}
+            className="text-xs bg-blue-100 text-blue-700 px-2 py-0.5 rounded"
+          >
+            {formatLabels[format] || format}
+          </span>
+        ))}
+      </div>
+ 
+      {/* Output Directory */}
+      {data.outputDir && (
+        <div className="text-xs text-blue-500 mt-2 truncate">
+          📁 {data.outputDir}
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+ExportNode.displayName = 'ExportNode';
+ 
+export default ExportNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/HandNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/HandNode.tsx.html new file mode 100644 index 0000000..18b04de --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/HandNode.tsx.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/HandNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes HandNode.tsx

+
+ +
+ 0% + Statements + 0/43 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hand Node Component
+ *
+ * Node for executing hand actions.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { HandNodeData } from '../../../lib/workflow-builder/types';
+ 
+type HandNodeType = Node<HandNodeData>;
+ 
+export const HandNode = memo(({ data, selected }: NodeProps<HandNodeType>) => {
+  const hasHand = Boolean(data.handId);
+  const hasAction = Boolean(data.action);
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[180px]
+        bg-rose-50 border-rose-300
+        ${selected ? 'border-rose-500 shadow-lg shadow-rose-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-rose-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-rose-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">✋</span>
+        <span className="font-medium text-rose-800">{data.label}</span>
+      </div>
+ 
+      {/* Hand Info */}
+      <div className="space-y-1">
+        <div className={`text-sm ${hasHand ? 'text-rose-600' : 'text-rose-400 italic'}`}>
+          {hasHand ? (
+            <span className="font-mono bg-rose-100 px-1.5 py-0.5 rounded">
+              {data.handName || data.handId}
+            </span>
+          ) : (
+            'No hand selected'
+          )}
+        </div>
+ 
+        {hasAction && (
+          <div className="text-xs text-rose-500">
+            Action: <span className="font-mono">{data.action}</span>
+          </div>
+        )}
+      </div>
+ 
+      {/* Params Count */}
+      {Object.keys(data.params).length > 0 && (
+        <div className="text-xs text-rose-500 mt-1">
+          {Object.keys(data.params).length} param(s)
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+HandNode.displayName = 'HandNode';
+ 
+export default HandNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/HttpNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/HttpNode.tsx.html new file mode 100644 index 0000000..9f22574 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/HttpNode.tsx.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/HttpNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes HttpNode.tsx

+
+ +
+ 0% + Statements + 0/47 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/47 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * HTTP Node Component
+ *
+ * Node for making HTTP requests.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { HttpNodeData } from '../../../lib/workflow-builder/types';
+ 
+const methodColors: Record<string, string> = {
+  GET: 'bg-green-100 text-green-700',
+  POST: 'bg-blue-100 text-blue-700',
+  PUT: 'bg-yellow-100 text-yellow-700',
+  DELETE: 'bg-red-100 text-red-700',
+  PATCH: 'bg-purple-100 text-purple-700',
+};
+ 
+export const HttpNode = memo(({ data, selected }: NodeProps<Node<HttpNodeData>>) => {
+  const hasUrl = Boolean(data.url);
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[200px]
+        bg-slate-50 border-slate-300
+        ${selected ? 'border-slate-500 shadow-lg shadow-slate-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-slate-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-slate-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">🌐</span>
+        <span className="font-medium text-slate-800">{data.label}</span>
+      </div>
+ 
+      {/* Method Badge */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className={`text-xs font-bold px-2 py-0.5 rounded ${methodColors[data.method]}`}>
+          {data.method}
+        </span>
+      </div>
+ 
+      {/* URL */}
+      <div className={`text-sm font-mono bg-slate-100 rounded px-2 py-1 truncate ${hasUrl ? 'text-slate-600' : 'text-slate-400 italic'}`}>
+        {hasUrl ? data.url : 'No URL specified'}
+      </div>
+ 
+      {/* Headers Count */}
+      {Object.keys(data.headers).length > 0 && (
+        <div className="text-xs text-slate-500 mt-2">
+          {Object.keys(data.headers).length} header(s)
+        </div>
+      )}
+ 
+      {/* Body Indicator */}
+      {data.body && (
+        <div className="text-xs text-slate-500 mt-1">
+          Has body content
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+HttpNode.displayName = 'HttpNode';
+ 
+export default HttpNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/InputNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/InputNode.tsx.html new file mode 100644 index 0000000..078a491 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/InputNode.tsx.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/InputNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes InputNode.tsx

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Input Node Component
+ *
+ * Node for defining workflow input variables.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { InputNodeData } from '../../../lib/workflow-builder/types';
+ 
+export const InputNode = memo(({ data, selected }: NodeProps<Node<InputNodeData>>) => {
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[180px]
+        bg-emerald-50 border-emerald-300
+        ${selected ? 'border-emerald-500 shadow-lg shadow-emerald-200' : ''}
+      `}
+    >
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-emerald-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">📥</span>
+        <span className="font-medium text-emerald-800">{data.label}</span>
+      </div>
+ 
+      {/* Variable Name */}
+      <div className="text-sm text-emerald-600">
+        <span className="font-mono bg-emerald-100 px-1.5 py-0.5 rounded">
+          {data.variableName}
+        </span>
+      </div>
+ 
+      {/* Default Value Indicator */}
+      {data.defaultValue !== undefined && (
+        <div className="text-xs text-emerald-500 mt-1">
+          default: {typeof data.defaultValue === 'string'
+            ? `"${data.defaultValue}"`
+            : JSON.stringify(data.defaultValue)}
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+InputNode.displayName = 'InputNode';
+ 
+export default InputNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/LlmNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/LlmNode.tsx.html new file mode 100644 index 0000000..012421d --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/LlmNode.tsx.html @@ -0,0 +1,295 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/LlmNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes LlmNode.tsx

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * LLM Node Component
+ *
+ * Node for LLM generation actions.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { LlmNodeData } from '../../../lib/workflow-builder/types';
+ 
+export const LlmNode = memo(({ data, selected }: NodeProps<Node<LlmNodeData>>) => {
+  const templatePreview = data.template.length > 50
+    ? data.template.slice(0, 50) + '...'
+    : data.template || 'No template';
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[200px]
+        bg-violet-50 border-violet-300
+        ${selected ? 'border-violet-500 shadow-lg shadow-violet-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-violet-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-violet-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">🤖</span>
+        <span className="font-medium text-violet-800">{data.label}</span>
+        {data.jsonMode && (
+          <span className="text-xs bg-violet-200 text-violet-700 px-1.5 py-0.5 rounded">
+            JSON
+          </span>
+        )}
+      </div>
+ 
+      {/* Template Preview */}
+      <div className="text-sm text-violet-600 bg-violet-100 rounded px-2 py-1 font-mono">
+        {data.isTemplateFile ? '📄 ' : ''}
+        {templatePreview}
+      </div>
+ 
+      {/* Model Info */}
+      {(data.model || data.temperature !== undefined) && (
+        <div className="flex gap-2 mt-2 text-xs text-violet-500">
+          {data.model && <span>Model: {data.model}</span>}
+          {data.temperature !== undefined && (
+            <span>Temp: {data.temperature}</span>
+          )}
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+LlmNode.displayName = 'LlmNode';
+ 
+export default LlmNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/OrchestrationNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/OrchestrationNode.tsx.html new file mode 100644 index 0000000..4e18a71 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/OrchestrationNode.tsx.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/OrchestrationNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes OrchestrationNode.tsx

+
+ +
+ 0% + Statements + 0/48 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Orchestration Node Component
+ *
+ * Node for executing skill orchestration graphs (DAGs).
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { OrchestrationNodeData } from '../../../lib/workflow-builder/types';
+ 
+export const OrchestrationNode = memo(({ data, selected }: NodeProps<Node<OrchestrationNodeData>>) => {
+  const hasGraphId = Boolean(data.graphId);
+  const hasGraph = Boolean(data.graph);
+  const inputCount = Object.keys(data.inputMappings).length;
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[200px]
+        bg-gradient-to-br from-indigo-50 to-purple-50
+        border-indigo-300
+        ${selected ? 'border-indigo-500 shadow-lg shadow-indigo-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-indigo-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-indigo-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">🔀</span>
+        <span className="font-medium text-indigo-800">{data.label}</span>
+      </div>
+ 
+      {/* Graph Reference */}
+      <div className={`text-sm mb-2 ${hasGraphId || hasGraph ? 'text-indigo-600' : 'text-indigo-400 italic'}`}>
+        {hasGraphId ? (
+          <div className="flex items-center gap-1.5 bg-indigo-100 rounded px-2 py-1">
+            <span className="text-xs">📋</span>
+            <span className="font-mono text-xs">{data.graphId}</span>
+          </div>
+        ) : hasGraph ? (
+          <div className="flex items-center gap-1.5 bg-indigo-100 rounded px-2 py-1">
+            <span className="text-xs">📊</span>
+            <span className="text-xs">Inline graph</span>
+          </div>
+        ) : (
+          'No graph configured'
+        )}
+      </div>
+ 
+      {/* Input Mappings */}
+      {inputCount > 0 && (
+        <div className="text-xs text-indigo-500 mt-2">
+          {inputCount} input mapping(s)
+        </div>
+      )}
+ 
+      {/* Description */}
+      {data.description && (
+        <div className="text-xs text-indigo-400 mt-2 line-clamp-2">
+          {data.description}
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+OrchestrationNode.displayName = 'OrchestrationNode';
+ 
+export default OrchestrationNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/ParallelNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/ParallelNode.tsx.html new file mode 100644 index 0000000..fd924a1 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/ParallelNode.tsx.html @@ -0,0 +1,250 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/ParallelNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes ParallelNode.tsx

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Parallel Node Component
+ *
+ * Node for parallel execution of steps.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { ParallelNodeData } from '../../../lib/workflow-builder/types';
+ 
+export const ParallelNode = memo(({ data, selected }: NodeProps<Node<ParallelNodeData>>) => {
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[180px]
+        bg-cyan-50 border-cyan-300
+        ${selected ? 'border-cyan-500 shadow-lg shadow-cyan-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-cyan-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-cyan-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">⚡</span>
+        <span className="font-medium text-cyan-800">{data.label}</span>
+      </div>
+ 
+      {/* Each Expression */}
+      <div className="text-sm text-cyan-600 bg-cyan-100 rounded px-2 py-1 font-mono">
+        each: {data.each || '${inputs.items}'}
+      </div>
+ 
+      {/* Max Workers */}
+      <div className="text-xs text-cyan-500 mt-2">
+        Max workers: {data.maxWorkers}
+      </div>
+    </div>
+  );
+});
+ 
+ParallelNode.displayName = 'ParallelNode';
+ 
+export default ParallelNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/SkillNode.tsx.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/SkillNode.tsx.html new file mode 100644 index 0000000..10231ed --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/SkillNode.tsx.html @@ -0,0 +1,280 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes/SkillNode.tsx + + + + + + + + + +
+
+

All files / src/components/WorkflowBuilder/nodes SkillNode.tsx

+
+ +
+ 0% + Statements + 0/36 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Skill Node Component
+ *
+ * Node for executing skills.
+ */
+ 
+import { memo } from 'react';
+import { Handle, Position, NodeProps, Node } from '@xyflow/react';
+import type { SkillNodeData } from '../../../lib/workflow-builder/types';
+ 
+export const SkillNode = memo(({ data, selected }: NodeProps<Node<SkillNodeData>>) => {
+  const hasSkill = Boolean(data.skillId);
+ 
+  return (
+    <div
+      className={`
+        px-4 py-3 rounded-lg border-2 min-w-[180px]
+        bg-amber-50 border-amber-300
+        ${selected ? 'border-amber-500 shadow-lg shadow-amber-200' : ''}
+      `}
+    >
+      {/* Input Handle */}
+      <Handle
+        type="target"
+        position={Position.Left}
+        className="w-3 h-3 bg-amber-400 border-2 border-white"
+      />
+ 
+      {/* Output Handle */}
+      <Handle
+        type="source"
+        position={Position.Right}
+        className="w-3 h-3 bg-amber-500 border-2 border-white"
+      />
+ 
+      {/* Header */}
+      <div className="flex items-center gap-2 mb-2">
+        <span className="text-lg">⚡</span>
+        <span className="font-medium text-amber-800">{data.label}</span>
+      </div>
+ 
+      {/* Skill ID */}
+      <div className={`text-sm ${hasSkill ? 'text-amber-600' : 'text-amber-400 italic'}`}>
+        {hasSkill ? (
+          <span className="font-mono bg-amber-100 px-1.5 py-0.5 rounded">
+            {data.skillName || data.skillId}
+          </span>
+        ) : (
+          'No skill selected'
+        )}
+      </div>
+ 
+      {/* Input Mappings Count */}
+      {Object.keys(data.inputMappings).length > 0 && (
+        <div className="text-xs text-amber-500 mt-1">
+          {Object.keys(data.inputMappings).length} input mapping(s)
+        </div>
+      )}
+    </div>
+  );
+});
+ 
+SkillNode.displayName = 'SkillNode';
+ 
+export default SkillNode;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowBuilder/nodes/index.html b/desktop/coverage/src/components/WorkflowBuilder/nodes/index.html new file mode 100644 index 0000000..40bf902 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowBuilder/nodes/index.html @@ -0,0 +1,236 @@ + + + + + + Code coverage report for src/components/WorkflowBuilder/nodes + + + + + + + + + +
+
+

All files src/components/WorkflowBuilder/nodes

+
+ +
+ 0% + Statements + 0/370 +
+ + +
+ 0% + Branches + 0/9 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/370 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ConditionNode.tsx +
+
0%0/520%0/10%0/10%0/52
ExportNode.tsx +
+
0%0/440%0/10%0/10%0/44
HandNode.tsx +
+
0%0/430%0/10%0/10%0/43
HttpNode.tsx +
+
0%0/470%0/10%0/10%0/47
InputNode.tsx +
+
0%0/300%0/10%0/10%0/30
LlmNode.tsx +
+
0%0/400%0/10%0/10%0/40
OrchestrationNode.tsx +
+
0%0/480%0/10%0/10%0/48
ParallelNode.tsx +
+
0%0/300%0/10%0/10%0/30
SkillNode.tsx +
+
0%0/360%0/10%0/10%0/36
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowEditor.tsx.html b/desktop/coverage/src/components/WorkflowEditor.tsx.html new file mode 100644 index 0000000..11eb222 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowEditor.tsx.html @@ -0,0 +1,1522 @@ + + + + + + Code coverage report for src/components/WorkflowEditor.tsx + + + + + + + + + +
+
+

All files / src/components WorkflowEditor.tsx

+
+ +
+ 0% + Statements + 0/322 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/322 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * WorkflowEditor - OpenFang Workflow Editor Component
+ *
+ * Allows creating and editing multi-step workflows that chain
+ * multiple Hands together for complex task automation.
+ *
+ * Design based on OpenFang Dashboard v0.4.0
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useHandStore, type Hand } from '../store/handStore';
+import { useWorkflowStore, type Workflow } from '../store/workflowStore';
+import {
+  X,
+  Plus,
+  Trash2,
+  GripVertical,
+  ChevronDown,
+  ChevronUp,
+  ChevronLeft,
+  ChevronRight,
+  Save,
+  Loader2,
+  AlertCircle,
+  GitBranch,
+} from 'lucide-react';
+import { safeJsonParse } from '../lib/json-utils';
+ 
+// === Types ===
+ 
+interface WorkflowStep {
+  id: string;
+  handName: string;
+  name?: string;
+  params?: Record<string, unknown>;
+  condition?: string;
+}
+ 
+interface WorkflowEditorProps {
+  workflow?: Workflow; // If provided, edit mode; otherwise create mode
+  isOpen: boolean;
+  onClose: () => void;
+  onSave: (data: {
+    name: string;
+    description?: string;
+    steps: Array<{
+      handName: string;
+      name?: string;
+      params?: Record<string, unknown>;
+      condition?: string;
+    }>;
+  }) => Promise<void>;
+  isSaving: boolean;
+}
+ 
+// === Step Editor Component ===
+ 
+interface StepEditorProps {
+  step: WorkflowStep;
+  hands: Hand[];
+  index: number;
+  onUpdate: (step: WorkflowStep) => void;
+  onRemove: () => void;
+  onMoveUp?: () => void;
+  onMoveDown?: () => void;
+}
+ 
+function StepEditor({ step, hands, index, onUpdate, onRemove, onMoveUp, onMoveDown }: StepEditorProps) {
+  const [isExpanded, setIsExpanded] = useState(true);
+  const selectedHand = hands.find(h => h.name === step.handName);
+ 
+  return (
+    <div className="bg-gray-50 dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-700">
+      {/* Header */}
+      <div className="flex items-center gap-2 p-3 border-b border-gray-200 dark:border-gray-700">
+        <GripVertical className="w-4 h-4 text-gray-400 cursor-grab" />
+        <span className="flex-shrink-0 w-6 h-6 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center text-xs font-medium text-blue-600 dark:text-blue-400">
+          {index + 1}
+        </span>
+        <div className="flex-1 min-w-0">
+          <select
+            value={step.handName}
+            onChange={(e) => onUpdate({ ...step, handName: e.target.value })}
+            className="w-full px-2 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+          >
+            <option value="">选择 Hand...</option>
+            {hands.map(hand => (
+              <option key={hand.id} value={hand.id}>
+                {hand.name} - {hand.description}
+              </option>
+            ))}
+          </select>
+        </div>
+        <button
+          onClick={() => setIsExpanded(!isExpanded)}
+          className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
+        >
+          {isExpanded ? <ChevronUp className="w-4 h-4" /> : <ChevronDown className="w-4 h-4" />}
+        </button>
+        {onMoveUp && (
+          <button
+            onClick={onMoveUp}
+            className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded"
+            title="上移"
+          >
+            <ChevronLeft className="w-4 h-4" />
+          </button>
+        )}
+        {onMoveDown && (
+          <button
+            onClick={onMoveDown}
+            className="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded"
+            title="下移"
+          >
+            <ChevronRight className="w-4 h-4" />
+          </button>
+        )}
+        <button
+          onClick={onRemove}
+          className="p-1 text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded"
+        >
+          <Trash2 className="w-4 h-4" />
+        </button>
+      </div>
+ 
+      {/* Expanded Content */}
+      {isExpanded && (
+        <div className="p-3 space-y-3">
+          {/* Step Name */}
+          <div>
+            <label className="block text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">
+              步骤名称 (可选)
+            </label>
+            <input
+              type="text"
+              value={step.name || ''}
+              onChange={(e) => onUpdate({ ...step, name: e.target.value || undefined })}
+              placeholder={`${step.handName || '步骤'} ${index + 1}`}
+              className="w-full px-2 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+            />
+          </div>
+ 
+          {/* Condition */}
+          <div>
+            <label className="block text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">
+              执行条件 (可选)
+            </label>
+            <input
+              type="text"
+              value={step.condition || ''}
+              onChange={(e) => onUpdate({ ...step, condition: e.target.value || undefined })}
+              placeholder="例如: previous_result.success == true"
+              className="w-full px-2 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+            />
+            <p className="mt-1 text-xs text-gray-400 dark:text-gray-500">
+              使用表达式决定是否执行此步骤
+            </p>
+          </div>
+ 
+          {/* Parameters */}
+          <div>
+            <label className="block text-xs font-medium text-gray-500 dark:text-gray-400 mb-1">
+              参数 (JSON 格式)
+            </label>
+            <textarea
+              value={step.params ? JSON.stringify(step.params, null, 2) : ''}
+              onChange={(e) => {
+                const text = e.target.value.trim();
+                if (text) {
+                  const result = safeJsonParse<Record<string, unknown>>(text);
+                  if (result.success) {
+                    onUpdate({ ...step, params: result.data });
+                  }
+                  // If parse fails, keep current params
+                } else {
+                  onUpdate({ ...step, params: undefined });
+                }
+              }}
+              placeholder='{"key": "value"}'
+              rows={3}
+              className="w-full px-2 py-1.5 text-sm font-mono border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+            />
+          </div>
+ 
+          {/* Hand Info */}
+          {selectedHand && (
+            <div className="p-2 bg-blue-50 dark:bg-blue-900/20 rounded-md text-xs text-blue-700 dark:text-blue-400">
+              <div className="font-medium mb-1">{selectedHand.description}</div>
+              {selectedHand.toolCount && (
+                <div>工具数量: {selectedHand.toolCount}</div>
+              )}
+            </div>
+          )}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+// === Main WorkflowEditor Component ===
+ 
+export function WorkflowEditor({ workflow, isOpen, onClose, onSave, isSaving }: WorkflowEditorProps) {
+  const hands = useHandStore((s) => s.hands);
+  const loadHands = useHandStore((s) => s.loadHands);
+  const getWorkflowDetail = useWorkflowStore((s) => s.getWorkflowDetail);
+  const [name, setName] = useState('');
+  const [description, setDescription] = useState('');
+  const [steps, setSteps] = useState<WorkflowStep[]>([]);
+  const [error, setError] = useState<string | null>(null);
+ 
+  const isEditMode = !!workflow;
+ 
+  // Load hands on mount
+  useEffect(() => {
+    loadHands();
+  }, [loadHands]);
+ 
+  // Initialize form when workflow changes (edit mode)
+  useEffect(() => {
+    if (workflow) {
+      setName(workflow.name);
+      setDescription(workflow.description || '');
+      
+      // Load full workflow details including steps
+      getWorkflowDetail(workflow.id)
+        .then((detail: { steps: Array<{ handName: string; name?: string; params?: Record<string, unknown>; condition?: string }> } | undefined) => {
+          if (detail && Array.isArray(detail.steps)) {
+            const editorSteps: WorkflowStep[] = detail.steps.map((step: { handName: string; name?: string; params?: Record<string, unknown>; condition?: string }, index: number) => ({
+              id: `step-${workflow.id}-${index}`,
+              handName: step.handName || '',
+              name: step.name,
+              params: step.params,
+              condition: step.condition,
+            }));
+            setSteps(editorSteps);
+          } else {
+            setSteps([]);
+          }
+        })
+        .catch(() => setSteps([]));
+    } else {
+      setName('');
+      setDescription('');
+      setSteps([]);
+    }
+    setError(null);
+  }, [workflow, getWorkflowDetail]);
+ 
+  // Add new step
+  const handleAddStep = useCallback(() => {
+    const newStep: WorkflowStep = {
+      id: `step-${Date.now()}`,
+      handName: '',
+    };
+    setSteps(prev => [...prev, newStep]);
+  }, []);
+ 
+  // Update step
+  const handleUpdateStep = useCallback((index: number, updatedStep: WorkflowStep) => {
+    setSteps(prev => prev.map((s, i) => i === index ? updatedStep : s));
+  }, []);
+ 
+  // Remove step
+  const handleRemoveStep = useCallback((index: number) => {
+    setSteps(prev => prev.filter((_, i) => i !== index));
+  }, []);
+ 
+  // Move step up
+  const handleMoveStepUp = useCallback((index: number) => {
+    if (index === 0) return;
+    setSteps(prev => {
+      const newSteps = [...prev];
+      [newSteps[index - 1], newSteps[index]] = [newSteps[index], newSteps[index - 1]];
+      return newSteps;
+    });
+  }, []);
+ 
+  // Move step down
+  const handleMoveStepDown = useCallback((index: number) => {
+    if (index === steps.length - 1) return;
+    setSteps(prev => {
+      const newSteps = [...prev];
+      [newSteps[index], newSteps[index + 1]] = [newSteps[index + 1], newSteps[index]];
+      return newSteps;
+    });
+  }, [steps.length]);
+ 
+  // Validate and save
+  const handleSave = async () => {
+    setError(null);
+ 
+    // Validation
+    if (!name.trim()) {
+      setError('请输入工作流名称');
+      return;
+    }
+ 
+    if (steps.length === 0) {
+      setError('请至少添加一个步骤');
+      return;
+    }
+ 
+    const invalidSteps = steps.filter(s => !s.handName);
+    if (invalidSteps.length > 0) {
+      setError('所有步骤都必须选择一个 Hand');
+      return;
+    }
+ 
+    try {
+      await onSave({
+        name: name.trim(),
+        description: description.trim() || undefined,
+        steps: steps.map(s => ({
+          handName: s.handName,
+          name: s.name,
+          params: s.params,
+          condition: s.condition,
+        })),
+      });
+      onClose();
+    } catch (err) {
+      setError(err instanceof Error ? err.message : '保存失败');
+    }
+  };
+ 
+  if (!isOpen) return null;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-2xl mx-4 max-h-[90vh] overflow-hidden flex flex-col">
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <div className="flex items-center gap-3">
+            <div className="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center">
+              <GitBranch className="w-4 h-4 text-blue-600 dark:text-blue-400" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                {isEditMode ? '编辑工作流' : '新建工作流'}
+              </h2>
+              {workflow && (
+                <p className="text-sm text-gray-500 dark:text-gray-400">{workflow.name}</p>
+              )}
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"
+          >
+            <X className="w-5 h-5" />
+          </button>
+        </div>
+ 
+        {/* Body */}
+        <div className="flex-1 overflow-y-auto p-4 space-y-4">
+          {/* Error */}
+          {error && (
+            <div className="p-3 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800 text-red-700 dark:text-red-400 text-sm flex items-center gap-2">
+              <AlertCircle className="w-4 h-4 flex-shrink-0" />
+              {error}
+            </div>
+          )}
+ 
+          {/* Basic Info */}
+          <div className="space-y-3">
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                工作流名称 *
+              </label>
+              <input
+                type="text"
+                value={name}
+                onChange={(e) => setName(e.target.value)}
+                placeholder="我的工作流"
+                className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+              />
+            </div>
+ 
+            <div>
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
+                描述
+              </label>
+              <textarea
+                value={description}
+                onChange={(e) => setDescription(e.target.value)}
+                placeholder="描述这个工作流的用途..."
+                rows={2}
+                className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+              />
+            </div>
+          </div>
+ 
+          {/* Steps */}
+          <div>
+            <div className="flex items-center justify-between mb-3">
+              <label className="block text-sm font-medium text-gray-700 dark:text-gray-300">
+                工作流步骤 ({steps.length})
+              </label>
+              <button
+                onClick={handleAddStep}
+                className="flex items-center gap-1 px-2 py-1 text-xs bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 rounded-md hover:bg-blue-200 dark:hover:bg-blue-900/50"
+              >
+                <Plus className="w-3 h-3" />
+                添加步骤
+              </button>
+            </div>
+ 
+            {steps.length === 0 ? (
+              <div className="p-8 text-center border-2 border-dashed border-gray-200 dark:border-gray-700 rounded-lg">
+                <GitBranch className="w-8 h-8 mx-auto text-gray-300 dark:text-gray-600 mb-2" />
+                <p className="text-sm text-gray-500 dark:text-gray-400 mb-2">
+                  还没有添加步骤
+                </p>
+                <button
+                  onClick={handleAddStep}
+                  className="inline-flex items-center gap-1 px-3 py-1.5 text-sm bg-gray-700 dark:bg-gray-600 text-white rounded-lg hover:bg-gray-800 dark:hover:bg-gray-500"
+                >
+                  <Plus className="w-4 h-4" />
+                  添加第一个步骤
+                </button>
+              </div>
+            ) : (
+              <div className="space-y-2">
+                {steps.map((step, index) => (
+                  <StepEditor
+                    key={step.id}
+                    step={step}
+                    hands={hands}
+                    index={index}
+                    onUpdate={(s) => handleUpdateStep(index, s)}
+                    onRemove={() => handleRemoveStep(index)}
+                    onMoveUp={index > 0 ? () => handleMoveStepUp(index) : undefined}
+                    onMoveDown={index < steps.length - 1 ? () => handleMoveStepDown(index) : undefined}
+                  />
+                ))}
+              </div>
+            )}
+          </div>
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0">
+          <button
+            onClick={onClose}
+            className="px-4 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
+          >
+            取消
+          </button>
+          <button
+            onClick={handleSave}
+            disabled={isSaving}
+            className="px-4 py-2 text-sm bg-gray-700 dark:bg-gray-600 text-white rounded-lg hover:bg-gray-800 dark:hover:bg-gray-500 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2"
+          >
+            {isSaving ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                保存中...
+              </>
+            ) : (
+              <>
+                <Save className="w-4 h-4" />
+                保存工作流
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+export default WorkflowEditor;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowHistory.tsx.html b/desktop/coverage/src/components/WorkflowHistory.tsx.html new file mode 100644 index 0000000..83a852a --- /dev/null +++ b/desktop/coverage/src/components/WorkflowHistory.tsx.html @@ -0,0 +1,928 @@ + + + + + + Code coverage report for src/components/WorkflowHistory.tsx + + + + + + + + + +
+
+

All files / src/components WorkflowHistory.tsx

+
+ +
+ 0% + Statements + 0/195 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/195 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * WorkflowHistory - OpenFang Workflow Execution History Component
+ *
+ * Displays the execution history of a specific workflow,
+ * showing run details, status, and results.
+ *
+ * Design based on OpenFang Dashboard v0.4.0
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useWorkflowStore, type Workflow, type WorkflowRun } from '../store/workflowStore';
+import {
+  ArrowLeft,
+  Clock,
+  CheckCircle,
+  XCircle,
+  AlertCircle,
+  Loader2,
+  ChevronRight,
+  RefreshCw,
+  History,
+} from 'lucide-react';
+ 
+interface WorkflowHistoryProps {
+  workflow: Workflow;
+  isOpen?: boolean;
+  onClose?: () => void;
+  onBack?: () => void;
+}
+ 
+// Status configuration
+const STATUS_CONFIG: Record<string, { label: string; className: string; icon: React.ComponentType<{ className?: string }> }> = {
+  pending: { label: '等待中', className: 'text-gray-500 bg-gray-100', icon: Clock },
+  running: { label: '运行中', className: 'text-blue-600 bg-blue-100', icon: Loader2 },
+  completed: { label: '已完成', className: 'text-green-600 bg-green-100', icon: CheckCircle },
+  success: { label: '成功', className: 'text-green-600 bg-green-100', icon: CheckCircle },
+  failed: { label: '失败', className: 'text-red-600 bg-red-100', icon: XCircle },
+  error: { label: '错误', className: 'text-red-600 bg-red-100', icon: XCircle },
+  cancelled: { label: '已取消', className: 'text-gray-500 bg-gray-100', icon: XCircle },
+  paused: { label: '已暂停', className: 'text-yellow-600 bg-yellow-100', icon: AlertCircle },
+};
+ 
+// Run Card Component
+interface RunCardProps {
+  run: WorkflowRun;
+  index: number;
+}
+ 
+function RunCard({ run, index }: RunCardProps) {
+  const [isExpanded, setIsExpanded] = useState(false);
+  const config = STATUS_CONFIG[run.status] || STATUS_CONFIG.pending;
+  const StatusIcon = config.icon;
+ 
+  // Format result for display
+  const resultText = run.result
+    ? (typeof run.result === 'string' ? run.result : JSON.stringify(run.result, null, 2))
+    : undefined;
+ 
+  return (
+    <div className="bg-gray-50 dark:bg-gray-900 rounded-lg border border-gray-100 dark:border-gray-700">
+      <div
+        className="flex items-center justify-between p-3 cursor-pointer"
+        onClick={() => setIsExpanded(!isExpanded)}
+      >
+        <div className="flex items-center gap-3 min-w-0">
+          <span className="flex-shrink-0 w-6 h-6 bg-gray-200 dark:bg-gray-700 rounded-full flex items-center justify-center text-xs font-medium text-gray-600 dark:text-gray-400">
+            {index + 1}
+          </span>
+          <StatusIcon className={`w-4 h-4 flex-shrink-0 ${run.status === 'running' ? 'animate-spin' : ''}`} />
+          <span className="text-sm font-medium text-gray-800 dark:text-gray-200 truncate">
+            运行 #{run.runId.slice(0, 8)}
+          </span>
+          {run.step && (
+            <span className="text-xs text-gray-500 dark:text-gray-400 truncate">
+              步骤: {run.step}
+            </span>
+          )}
+        </div>
+        <div className="flex items-center gap-2 flex-shrink-0">
+          <span className={`text-xs px-2 py-0.5 rounded ${config.className}`}>
+            {config.label}
+          </span>
+          <ChevronRight className={`w-4 h-4 text-gray-400 transition-transform ${isExpanded ? 'rotate-90' : ''}`} />
+        </div>
+      </div>
+ 
+      {/* Expanded Details */}
+      {isExpanded && (
+        <div className="px-3 pb-3 pt-0 border-t border-gray-200 dark:border-gray-700 space-y-2">
+          <div className="mt-3 text-xs text-gray-500 dark:text-gray-400 space-y-1">
+            <div className="flex justify-between">
+              <span>运行 ID</span>
+              <span className="font-mono">{run.runId}</span>
+            </div>
+          </div>
+ 
+          {resultText && (
+            <div className="p-2 bg-green-50 dark:bg-green-900/20 rounded border border-green-200 dark:border-green-800 text-green-700 dark:text-green-400 text-xs whitespace-pre-wrap max-h-60 overflow-auto">
+              <div className="font-medium mb-1">结果:</div>
+              {resultText}
+            </div>
+          )}
+ 
+          {run.status === 'failed' && !resultText && (
+            <div className="p-2 bg-red-50 dark:bg-red-900/20 rounded border border-red-200 dark:border-red-800 text-red-700 dark:text-red-400 text-xs">
+              执行失败,请检查日志获取详细信息。
+            </div>
+          )}
+        </div>
+      )}
+    </div>
+  );
+}
+ 
+export function WorkflowHistory({ workflow, onBack }: WorkflowHistoryProps) {
+  const loadWorkflowRuns = useWorkflowStore((s) => s.loadWorkflowRuns);
+  const cancelWorkflow = useWorkflowStore((s) => s.cancelWorkflow);
+  const isLoading = useWorkflowStore((s) => s.isLoading);
+  const [runs, setRuns] = useState<WorkflowRun[]>([]);
+  const [isRefreshing, setIsRefreshing] = useState(false);
+  const [cancellingRunId, setCancellingRunId] = useState<string | null>(null);
+ 
+  // Load workflow runs
+  const loadRuns = useCallback(async () => {
+    try {
+      const result = await loadWorkflowRuns(workflow.id, { limit: 50 });
+      setRuns(result || []);
+    } catch {
+      setRuns([]);
+    }
+  }, [workflow.id, loadWorkflowRuns]);
+ 
+  useEffect(() => {
+    loadRuns();
+  }, [loadRuns]);
+ 
+  // Refresh runs
+  const handleRefresh = useCallback(async () => {
+    setIsRefreshing(true);
+    try {
+      await loadRuns();
+    } finally {
+      setIsRefreshing(false);
+    }
+  }, [loadRuns]);
+ 
+  // Cancel running workflow
+  const handleCancel = useCallback(async (runId: string) => {
+    if (!confirm('确定要取消这个正在运行的工作流吗?')) return;
+ 
+    setCancellingRunId(runId);
+    try {
+      await cancelWorkflow(workflow.id, runId);
+      await loadRuns();
+    } catch (error) {
+      console.error('Failed to cancel workflow:', error);
+      alert(`取消失败: ${error instanceof Error ? error.message : '未知错误'}`);
+    } finally {
+      setCancellingRunId(null);
+    }
+  }, [workflow.id, cancelWorkflow, loadRuns]);
+ 
+  // Categorize runs
+  const runningRuns = runs.filter(r => r.status === 'running');
+  const completedRuns = runs.filter(r => ['completed', 'success', 'failed', 'error', 'cancelled'].includes(r.status));
+  const pendingRuns = runs.filter(r => ['pending', 'paused'].includes(r.status));
+ 
+  return (
+    <div className="h-full flex flex-col">
+      {/* Header */}
+      <div className="p-4 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 flex-shrink-0">
+        <div className="flex items-center gap-3">
+          <button
+            onClick={onBack}
+            className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors"
+          >
+            <ArrowLeft className="w-4 h-4" />
+          </button>
+          <div className="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center flex-shrink-0">
+            <History className="w-4 h-4 text-blue-600 dark:text-blue-400" />
+          </div>
+          <div className="flex-1 min-w-0">
+            <h2 className="text-lg font-semibold text-gray-900 dark:text-white truncate">
+              {workflow.name}
+            </h2>
+            <p className="text-xs text-gray-500 dark:text-gray-400">
+              执行历史 ({runs.length} 次运行)
+            </p>
+          </div>
+          <button
+            onClick={handleRefresh}
+            disabled={isRefreshing}
+            className="p-1.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-50"
+            title="刷新"
+          >
+            <RefreshCw className={`w-4 h-4 ${isRefreshing ? 'animate-spin' : ''}`} />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Content */}
+      <div className="flex-1 overflow-y-auto p-4 space-y-4">
+        {/* Loading State */}
+        {isLoading && runs.length === 0 && (
+          <div className="text-center py-8">
+            <Loader2 className="w-8 h-8 mx-auto text-gray-400 animate-spin mb-3" />
+            <p className="text-sm text-gray-500 dark:text-gray-400">加载执行历史中...</p>
+          </div>
+        )}
+ 
+        {/* Running Runs */}
+        {runningRuns.length > 0 && (
+          <div className="bg-blue-50 dark:bg-blue-900/20 rounded-lg p-4 border border-blue-200 dark:border-blue-800">
+            <h3 className="text-sm font-semibold text-blue-700 dark:text-blue-400 mb-3 flex items-center gap-2">
+              <Loader2 className="w-4 h-4 animate-spin" />
+              运行中 ({runningRuns.length})
+            </h3>
+            <div className="space-y-2">
+              {runningRuns.map((run, index) => (
+                <div key={run.runId} className="flex items-center justify-between">
+                  <RunCard run={run} index={index} />
+                  <button
+                    onClick={() => handleCancel(run.runId)}
+                    disabled={cancellingRunId === run.runId}
+                    className="ml-2 px-2 py-1 text-xs text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 rounded disabled:opacity-50"
+                  >
+                    {cancellingRunId === run.runId ? '取消中...' : '取消'}
+                  </button>
+                </div>
+              ))}
+            </div>
+          </div>
+        )}
+ 
+        {/* Pending Runs */}
+        {pendingRuns.length > 0 && (
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+            <h3 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3 flex items-center gap-2">
+              <Clock className="w-4 h-4" />
+              等待中 ({pendingRuns.length})
+            </h3>
+            <div className="space-y-2">
+              {pendingRuns.map((run, index) => (
+                <RunCard key={run.runId} run={run} index={index} />
+              ))}
+            </div>
+          </div>
+        )}
+ 
+        {/* Completed Runs */}
+        {completedRuns.length > 0 && (
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4">
+            <h3 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-3">
+              历史记录 ({completedRuns.length})
+            </h3>
+            <div className="space-y-2">
+              {completedRuns.map((run, index) => (
+                <RunCard key={run.runId} run={run} index={index} />
+              ))}
+            </div>
+          </div>
+        )}
+ 
+        {/* Empty State */}
+        {!isLoading && runs.length === 0 && (
+          <div className="text-center py-12">
+            <div className="w-16 h-16 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center mx-auto mb-4">
+              <History className="w-8 h-8 text-gray-400" />
+            </div>
+            <p className="text-sm text-gray-500 dark:text-gray-400 mb-1">暂无执行记录</p>
+            <p className="text-xs text-gray-400 dark:text-gray-500">
+              运行此工作流后将在此显示历史记录
+            </p>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ 
+export default WorkflowHistory;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowList.tsx.html b/desktop/coverage/src/components/WorkflowList.tsx.html new file mode 100644 index 0000000..804919b --- /dev/null +++ b/desktop/coverage/src/components/WorkflowList.tsx.html @@ -0,0 +1,1642 @@ + + + + + + Code coverage report for src/components/WorkflowList.tsx + + + + + + + + + +
+
+

All files / src/components WorkflowList.tsx

+
+ +
+ 0% + Statements + 0/355 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/355 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * WorkflowList - OpenFang Workflow Management UI
+ *
+ * Displays available OpenFang Workflows and allows executing them.
+ *
+ * Design based on OpenFang Dashboard v0.4.0
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+import { useWorkflowStore, type Workflow } from '../store/workflowStore';
+import { WorkflowEditor } from './WorkflowEditor';
+import { WorkflowHistory } from './WorkflowHistory';
+import {
+  Play,
+  Edit,
+  Trash2,
+  History,
+  Plus,
+  List,
+  GitBranch,
+  RefreshCw,
+  Loader2,
+  X,
+} from 'lucide-react';
+import { safeJsonParse } from '../lib/json-utils';
+ 
+// === View Toggle Types ===
+ 
+type ViewMode = 'list' | 'visual';
+ 
+// === Workflow Execute Modal ===
+ 
+interface ExecuteModalProps {
+  workflow: Workflow;
+  isOpen: boolean;
+  onClose: () => void;
+  onExecute: (id: string, input?: Record<string, unknown>) => Promise<void>;
+  isExecuting: boolean;
+}
+ 
+function ExecuteModal({ workflow, isOpen, onClose, onExecute, isExecuting }: ExecuteModalProps) {
+  const [input, setInput] = useState('');
+ 
+  const handleExecute = async () => {
+    let parsedInput: Record<string, unknown> | undefined;
+    if (input.trim()) {
+      const result = safeJsonParse<Record<string, unknown>>(input);
+      if (!result.success) {
+        alert('Input format error, please use valid JSON format.');
+        return;
+      }
+      parsedInput = result.data;
+    }
+    await onExecute(workflow.id, parsedInput);
+    setInput('');
+    onClose();
+  };
+ 
+  if (!isOpen) return null;
+ 
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center">
+      {/* Backdrop */}
+      <div
+        className="absolute inset-0 bg-black/50 backdrop-blur-sm"
+        onClick={onClose}
+      />
+ 
+      {/* Modal */}
+      <div className="relative bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-full max-w-md mx-4 overflow-hidden">
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700">
+          <div className="flex items-center gap-3">
+            <div className="w-8 h-8 bg-green-100 dark:bg-green-900/30 rounded-lg flex items-center justify-center">
+              <Play className="w-4 h-4 text-green-600 dark:text-green-400" />
+            </div>
+            <div>
+              <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                运行工作流
+              </h2>
+              <p className="text-sm text-gray-500 dark:text-gray-400">{workflow.name}</p>
+            </div>
+          </div>
+          <button
+            onClick={onClose}
+            className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"
+          >
+            <X className="w-5 h-5" />
+          </button>
+        </div>
+ 
+        {/* Body */}
+        <div className="p-4">
+          <div className="text-sm text-gray-600 dark:text-gray-400 mb-2">
+            输入参数 (JSON 格式,可选):
+          </div>
+          <textarea
+            className="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
+            rows={4}
+            placeholder='{"key": "value"}'
+            value={input}
+            onChange={(e) => setInput(e.target.value)}
+          />
+        </div>
+ 
+        {/* Footer */}
+        <div className="flex items-center justify-end gap-2 p-4 border-t border-gray-200 dark:border-gray-700">
+          <button
+            onClick={onClose}
+            className="px-4 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300"
+          >
+            取消
+          </button>
+          <button
+            onClick={handleExecute}
+            disabled={isExecuting}
+            className="px-4 py-2 text-sm bg-green-600 text-white rounded-lg hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2"
+          >
+            {isExecuting ? (
+              <>
+                <Loader2 className="w-4 h-4 animate-spin" />
+                运行中...
+              </>
+            ) : (
+              <>
+                <Play className="w-4 h-4" />
+                运行
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+// === Workflow Table Row ===
+ 
+interface WorkflowRowProps {
+  workflow: Workflow;
+  onExecute: (workflow: Workflow) => void;
+  onEdit: (workflow: Workflow) => void;
+  onDelete: (workflow: Workflow) => void;
+  onHistory: (workflow: Workflow) => void;
+  isExecuting: boolean;
+  isDeleting: boolean;
+}
+ 
+function WorkflowRow({ workflow, onExecute, onEdit, onDelete, onHistory, isExecuting, isDeleting }: WorkflowRowProps) {
+  // Format created date if available
+  const createdDate = workflow.createdAt
+    ? new Date(workflow.createdAt).toLocaleDateString('zh-CN')
+    : new Date().toLocaleDateString('zh-CN');
+ 
+  return (
+    <tr className="border-b border-gray-100 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors">
+      {/* Name */}
+      <td className="px-4 py-3">
+        <div className="flex items-center gap-2">
+          <div className="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center flex-shrink-0">
+            <GitBranch className="w-4 h-4 text-blue-600 dark:text-blue-400" />
+          </div>
+          <div className="min-w-0">
+            <div className="font-medium text-gray-900 dark:text-white truncate">
+              {workflow.name}
+            </div>
+            {workflow.description && (
+              <div className="text-xs text-gray-500 dark:text-gray-400 truncate">
+                {workflow.description}
+              </div>
+            )}
+          </div>
+        </div>
+      </td>
+ 
+      {/* Steps */}
+      <td className="px-4 py-3 text-center">
+        <span className="inline-flex items-center justify-center w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-full text-sm font-medium text-gray-700 dark:text-gray-300">
+          {workflow.steps}
+        </span>
+      </td>
+ 
+      {/* Created */}
+      <td className="px-4 py-3 text-sm text-gray-500 dark:text-gray-400">
+        {createdDate}
+      </td>
+ 
+      {/* Actions */}
+      <td className="px-4 py-3">
+        <div className="flex items-center justify-end gap-1">
+          <button
+            onClick={() => onExecute(workflow)}
+            disabled={isExecuting}
+            className="p-1.5 text-green-600 hover:bg-green-50 dark:hover:bg-green-900/20 rounded-md disabled:opacity-50 disabled:cursor-not-allowed"
+            title="Run"
+          >
+            {isExecuting ? (
+              <Loader2 className="w-4 h-4 animate-spin" />
+            ) : (
+              <Play className="w-4 h-4" />
+            )}
+          </button>
+          <button
+            onClick={() => onEdit(workflow)}
+            className="p-1.5 text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-md"
+            title="Edit"
+          >
+            <Edit className="w-4 h-4" />
+          </button>
+          <button
+            onClick={() => onHistory(workflow)}
+            className="p-1.5 text-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md"
+            title="History"
+          >
+            <History className="w-4 h-4" />
+          </button>
+          <button
+            onClick={() => onDelete(workflow)}
+            disabled={isDeleting}
+            className="p-1.5 text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md disabled:opacity-50 disabled:cursor-not-allowed"
+            title="删除"
+          >
+            {isDeleting ? (
+              <Loader2 className="w-4 h-4 animate-spin" />
+            ) : (
+              <Trash2 className="w-4 h-4" />
+            )}
+          </button>
+        </div>
+      </td>
+    </tr>
+  );
+}
+ 
+// === Main WorkflowList Component ===
+ 
+export function WorkflowList() {
+  const workflows = useWorkflowStore((s) => s.workflows);
+  const loadWorkflows = useWorkflowStore((s) => s.loadWorkflows);
+  const triggerWorkflow = useWorkflowStore((s) => s.triggerWorkflow);
+  const deleteWorkflow = useWorkflowStore((s) => s.deleteWorkflow);
+  const createWorkflow = useWorkflowStore((s) => s.createWorkflow);
+  const updateWorkflow = useWorkflowStore((s) => s.updateWorkflow);
+  const isLoading = useWorkflowStore((s) => s.isLoading);
+  const [viewMode, setViewMode] = useState<ViewMode>('list');
+  const [executingWorkflowId, setExecutingWorkflowId] = useState<string | null>(null);
+  const [deletingWorkflowId, setDeletingWorkflowId] = useState<string | null>(null);
+  const [selectedWorkflow, setSelectedWorkflow] = useState<Workflow | null>(null);
+  const [showExecuteModal, setShowExecuteModal] = useState(false);
+  const [showEditor, setShowEditor] = useState(false);
+  const [showHistory, setShowHistory] = useState(false);
+  const [editingWorkflow, setEditingWorkflow] = useState<Workflow | null>(null);
+  const [isSaving, setIsSaving] = useState(false);
+ 
+  useEffect(() => {
+    loadWorkflows();
+  }, [loadWorkflows]);
+ 
+  const handleExecute = useCallback(async (id: string, input?: Record<string, unknown>) => {
+    setExecutingWorkflowId(id);
+    try {
+      await triggerWorkflow(id, input);
+    } finally {
+      setExecutingWorkflowId(null);
+    }
+  }, [triggerWorkflow]);
+ 
+  const handleExecuteClick = useCallback((workflow: Workflow) => {
+    setSelectedWorkflow(workflow);
+    setShowExecuteModal(true);
+  }, []);
+ 
+  const handleEdit = useCallback((workflow: Workflow) => {
+    setEditingWorkflow(workflow);
+    setShowEditor(true);
+  }, []);
+ 
+  const handleDelete = useCallback(async (workflow: Workflow) => {
+    if (confirm(`确定要删除 "${workflow.name}" 吗?此操作不可撤销。`)) {
+      setDeletingWorkflowId(workflow.id);
+      try {
+        await deleteWorkflow(workflow.id);
+        // The store will update the workflows list automatically
+      } catch (error) {
+        console.error('Failed to delete workflow:', error);
+        alert(`删除工作流失败: ${error instanceof Error ? error.message : '未知错误'}`);
+      } finally {
+        setDeletingWorkflowId(null);
+      }
+    }
+  }, [deleteWorkflow]);
+ 
+  const handleHistory = useCallback((workflow: Workflow) => {
+    setSelectedWorkflow(workflow);
+    setShowHistory(true);
+  }, []);
+ 
+  const handleNewWorkflow = useCallback(() => {
+    setEditingWorkflow(null);
+    setShowEditor(true);
+  }, []);
+ 
+  const handleSaveWorkflow = useCallback(async (data: {
+    name: string;
+    description?: string;
+    steps: Array<{
+      handName: string;
+      name?: string;
+      params?: Record<string, unknown>;
+      condition?: string;
+    }>;
+  }) => {
+    setIsSaving(true);
+    try {
+      if (editingWorkflow) {
+        await updateWorkflow(editingWorkflow.id, data);
+      } else {
+        await createWorkflow(data);
+      }
+      await loadWorkflows();
+    } finally {
+      setIsSaving(false);
+    }
+  }, [editingWorkflow, createWorkflow, updateWorkflow, loadWorkflows]);
+ 
+  const handleCloseEditor = useCallback(() => {
+    setShowEditor(false);
+    setEditingWorkflow(null);
+  }, []);
+ 
+  const handleCloseModal = useCallback(() => {
+    setShowExecuteModal(false);
+    setSelectedWorkflow(null);
+  }, []);
+ 
+  // Loading state
+  if (isLoading && workflows.length === 0) {
+    return (
+      <div className="p-4 text-center">
+        <Loader2 className="w-6 h-6 animate-spin mx-auto text-gray-400 mb-2" />
+        <p className="text-sm text-gray-500 dark:text-gray-400">加载工作流中...</p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-4">
+      {/* Header */}
+      <div className="flex items-start justify-between gap-4">
+        <div>
+          <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+            工作流
+          </h2>
+          <p className="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
+            工作流将多个代理和工具串联在一起,用于完成复杂任务。
+          </p>
+        </div>
+        <button
+          onClick={() => loadWorkflows()}
+          disabled={isLoading}
+          className="text-sm text-blue-600 dark:text-blue-400 hover:underline flex items-center gap-1 disabled:opacity-50"
+        >
+          {isLoading ? (
+            <Loader2 className="w-3.5 h-3.5 animate-spin" />
+          ) : (
+            <RefreshCw className="w-3.5 h-3.5" />
+          )}
+          刷新
+        </button>
+      </div>
+ 
+      {/* Toolbar */}
+      <div className="flex items-center justify-between">
+        {/* View Toggle */}
+        <div className="flex items-center bg-gray-100 dark:bg-gray-800 rounded-lg p-1">
+          <button
+            onClick={() => setViewMode('list')}
+            className={`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${
+              viewMode === 'list'
+                ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
+                : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white'
+            }`}
+          >
+            <List className="w-3.5 h-3.5" />
+            列表
+          </button>
+          <button
+            onClick={() => setViewMode('visual')}
+            className={`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${
+              viewMode === 'visual'
+                ? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
+                : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white'
+            }`}
+          >
+            <GitBranch className="w-3.5 h-3.5" />
+            可视化编辑器
+          </button>
+        </div>
+ 
+        {/* New Workflow Button */}
+        <button
+          onClick={handleNewWorkflow}
+          className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
+        >
+          <Plus className="w-4 h-4" />
+          新建工作流
+        </button>
+      </div>
+ 
+      {/* Content */}
+      {viewMode === 'list' ? (
+        workflows.length === 0 ? (
+          // Empty State
+          <div className="p-8 text-center">
+            <div className="w-12 h-12 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center mx-auto mb-3">
+              <GitBranch className="w-6 h-6 text-gray-400" />
+            </div>
+            <p className="text-sm text-gray-500 dark:text-gray-400 mb-3">
+              暂无可用工作流
+            </p>
+            <p className="text-xs text-gray-400 dark:text-gray-500 mb-4">
+              创建你的第一个工作流来自动化复杂的多步骤任务。
+            </p>
+            <button
+              onClick={handleNewWorkflow}
+              className="inline-flex items-center gap-1.5 px-3 py-1.5 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
+            >
+              <Plus className="w-4 h-4" />
+              创建工作流
+            </button>
+          </div>
+        ) : (
+          // Table View
+          <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden">
+            <table className="w-full">
+              <thead>
+                <tr className="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50">
+                  <th className="px-4 py-2.5 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
+                    名称
+                  </th>
+                  <th className="px-4 py-2.5 text-center text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
+                    步骤
+                  </th>
+                  <th className="px-4 py-2.5 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
+                    创建时间
+                  </th>
+                  <th className="px-4 py-2.5 text-right text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider">
+                    操作
+                  </th>
+                </tr>
+              </thead>
+              <tbody>
+                {workflows.map((workflow) => (
+                  <WorkflowRow
+                    key={workflow.id}
+                    workflow={workflow}
+                    onExecute={handleExecuteClick}
+                    onEdit={handleEdit}
+                    onDelete={handleDelete}
+                    onHistory={handleHistory}
+                    isExecuting={executingWorkflowId === workflow.id}
+                    isDeleting={deletingWorkflowId === workflow.id}
+                  />
+                ))}
+              </tbody>
+            </table>
+          </div>
+        )
+      ) : (
+        // Visual Builder View (placeholder)
+        <div className="p-8 text-center bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
+          <div className="w-12 h-12 bg-gray-100 dark:bg-gray-700 rounded-full flex items-center justify-center mx-auto mb-3">
+            <GitBranch className="w-6 h-6 text-gray-400" />
+          </div>
+          <p className="text-sm text-gray-500 dark:text-gray-400 mb-2">
+            可视化工作流编辑器
+          </p>
+          <p className="text-xs text-gray-400 dark:text-gray-500">
+            拖拽式工作流编辑器即将推出!
+          </p>
+        </div>
+      )}
+ 
+      {/* Execute Modal */}
+      {selectedWorkflow && (
+        <ExecuteModal
+          workflow={selectedWorkflow}
+          isOpen={showExecuteModal}
+          onClose={handleCloseModal}
+          onExecute={handleExecute}
+          isExecuting={executingWorkflowId === selectedWorkflow.id}
+        />
+      )}
+ 
+      {/* Workflow Editor */}
+      <WorkflowEditor
+        workflow={editingWorkflow || undefined}
+        isOpen={showEditor}
+        onClose={handleCloseEditor}
+        onSave={handleSaveWorkflow}
+        isSaving={isSaving}
+      />
+ 
+      {/* Workflow History */}
+      {selectedWorkflow && (
+        <WorkflowHistory
+          workflow={selectedWorkflow}
+          isOpen={showHistory}
+          onClose={() => {
+            setShowHistory(false);
+            setSelectedWorkflow(null);
+          }}
+        />
+      )}
+    </div>
+  );
+}
+ 
+export default WorkflowList;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/WorkflowRecommendations.tsx.html b/desktop/coverage/src/components/WorkflowRecommendations.tsx.html new file mode 100644 index 0000000..29d64b0 --- /dev/null +++ b/desktop/coverage/src/components/WorkflowRecommendations.tsx.html @@ -0,0 +1,1105 @@ + + + + + + Code coverage report for src/components/WorkflowRecommendations.tsx + + + + + + + + + +
+
+

All files / src/components WorkflowRecommendations.tsx

+
+ +
+ 0% + Statements + 0/254 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/254 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Recommendations Component
+ *
+ * Displays proactive workflow recommendations from the Adaptive Intelligence Mesh.
+ * Shows detected patterns and suggested workflows based on user behavior.
+ */
+ 
+import React, { useState, useEffect } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { useMeshStore } from '../store/meshStore';
+import type { WorkflowRecommendation, BehaviorPattern, PatternTypeVariant } from '../lib/intelligence-client';
+ 
+// === Main Component ===
+ 
+export const WorkflowRecommendations: React.FC = () => {
+  const {
+    recommendations,
+    patterns,
+    isLoading,
+    error,
+    analyze,
+    acceptRecommendation,
+    dismissRecommendation,
+  } = useMeshStore();
+ 
+  const [selectedPattern, setSelectedPattern] = useState<string | null>(null);
+ 
+  useEffect(() => {
+    // Initial analysis
+    analyze();
+  }, [analyze]);
+ 
+  if (isLoading) {
+    return (
+      <div className="flex items-center justify-center p-8">
+        <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500" />
+        <span className="ml-3 text-gray-400">Analyzing patterns...</span>
+      </div>
+    );
+  }
+ 
+  if (error) {
+    return (
+      <div className="p-4 bg-red-500/10 border border-red-500/20 rounded-lg">
+        <p className="text-red-400 text-sm">{error}</p>
+      </div>
+    );
+  }
+ 
+  return (
+    <div className="space-y-6">
+      {/* Recommendations Section */}
+      <section>
+        <h3 className="text-lg font-semibold text-white mb-4 flex items-center gap-2">
+          <span className="text-2xl">💡</span>
+          Recommended Workflows
+          {recommendations.length > 0 && (
+            <span className="ml-2 px-2 py-0.5 bg-blue-500/20 text-blue-400 text-xs rounded-full">
+              {recommendations.length}
+            </span>
+          )}
+        </h3>
+ 
+        <AnimatePresence mode="popLayout">
+          {recommendations.length === 0 ? (
+            <motion.div
+              initial={{ opacity: 0 }}
+              animate={{ opacity: 1 }}
+              className="p-6 bg-gray-800/30 rounded-lg border border-gray-700/50 text-center"
+            >
+              <p className="text-gray-400">No recommendations available yet.</p>
+              <p className="text-gray-500 text-sm mt-2">
+                Continue using the app to build up behavior patterns.
+              </p>
+            </motion.div>
+          ) : (
+            <div className="space-y-3">
+              {recommendations.map((rec) => (
+                <RecommendationCard
+                  key={rec.id}
+                  recommendation={rec}
+                  onAccept={() => acceptRecommendation(rec.id)}
+                  onDismiss={() => dismissRecommendation(rec.id)}
+                />
+              ))}
+            </div>
+          )}
+        </AnimatePresence>
+      </section>
+ 
+      {/* Detected Patterns Section */}
+      <section>
+        <h3 className="text-lg font-semibold text-white mb-4 flex items-center gap-2">
+          <span className="text-2xl">📊</span>
+          Detected Patterns
+          {patterns.length > 0 && (
+            <span className="ml-2 px-2 py-0.5 bg-purple-500/20 text-purple-400 text-xs rounded-full">
+              {patterns.length}
+            </span>
+          )}
+        </h3>
+ 
+        {patterns.length === 0 ? (
+          <div className="p-6 bg-gray-800/30 rounded-lg border border-gray-700/50 text-center">
+            <p className="text-gray-400">No patterns detected yet.</p>
+          </div>
+        ) : (
+          <div className="grid gap-3">
+            {patterns.map((pattern) => (
+              <PatternCard
+                key={pattern.id}
+                pattern={pattern}
+                isSelected={selectedPattern === pattern.id}
+                onClick={() =>
+                  setSelectedPattern(
+                    selectedPattern === pattern.id ? null : pattern.id
+                  )
+                }
+              />
+            ))}
+          </div>
+        )}
+      </section>
+    </div>
+  );
+};
+ 
+// === Sub-Components ===
+ 
+interface RecommendationCardProps {
+  recommendation: WorkflowRecommendation;
+  onAccept: () => void;
+  onDismiss: () => void;
+}
+ 
+const RecommendationCard: React.FC<RecommendationCardProps> = ({
+  recommendation,
+  onAccept,
+  onDismiss,
+}) => {
+  const confidencePercent = Math.round(recommendation.confidence * 100);
+ 
+  const getConfidenceColor = (confidence: number) => {
+    if (confidence >= 0.8) return 'text-green-400';
+    if (confidence >= 0.6) return 'text-yellow-400';
+    return 'text-orange-400';
+  };
+ 
+  return (
+    <motion.div
+      layout
+      initial={{ opacity: 0, y: -10 }}
+      animate={{ opacity: 1, y: 0 }}
+      exit={{ opacity: 0, scale: 0.95 }}
+      className="p-4 bg-gray-800/50 rounded-lg border border-gray-700/50 hover:border-blue-500/30 transition-colors"
+    >
+      <div className="flex items-start justify-between gap-4">
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2 mb-2">
+            <h4 className="text-white font-medium truncate">
+              {recommendation.pipeline_id}
+            </h4>
+            <span
+              className={`text-xs font-mono ${getConfidenceColor(
+                recommendation.confidence
+              )}`}
+            >
+              {confidencePercent}%
+            </span>
+          </div>
+ 
+          <p className="text-gray-400 text-sm mb-3">{recommendation.reason}</p>
+ 
+          {/* Suggested Inputs */}
+          {Object.keys(recommendation.suggested_inputs).length > 0 && (
+            <div className="mb-3">
+              <p className="text-xs text-gray-500 mb-1">Suggested inputs:</p>
+              <div className="flex flex-wrap gap-1">
+                {Object.entries(recommendation.suggested_inputs).map(
+                  ([key, value]) => (
+                    <span
+                      key={key}
+                      className="px-2 py-0.5 bg-gray-700/50 text-gray-300 text-xs rounded"
+                    >
+                      {key}: {String(value).slice(0, 20)}
+                    </span>
+                  )
+                )}
+              </div>
+            </div>
+          )}
+ 
+          {/* Matched Patterns */}
+          {recommendation.patterns_matched.length > 0 && (
+            <div className="text-xs text-gray-500">
+              Based on {recommendation.patterns_matched.length} pattern(s)
+            </div>
+          )}
+        </div>
+ 
+        {/* Actions */}
+        <div className="flex gap-2 shrink-0">
+          <button
+            onClick={onAccept}
+            className="px-3 py-1.5 bg-blue-500 hover:bg-blue-600 text-white text-sm rounded transition-colors"
+          >
+            Accept
+          </button>
+          <button
+            onClick={onDismiss}
+            className="px-3 py-1.5 bg-gray-700 hover:bg-gray-600 text-gray-300 text-sm rounded transition-colors"
+          >
+            Dismiss
+          </button>
+        </div>
+      </div>
+ 
+      {/* Confidence Bar */}
+      <div className="mt-3 h-1 bg-gray-700 rounded-full overflow-hidden">
+        <motion.div
+          initial={{ width: 0 }}
+          animate={{ width: `${confidencePercent}%` }}
+          className={`h-full ${
+            recommendation.confidence >= 0.8
+              ? 'bg-green-500'
+              : recommendation.confidence >= 0.6
+              ? 'bg-yellow-500'
+              : 'bg-orange-500'
+          }`}
+        />
+      </div>
+    </motion.div>
+  );
+};
+ 
+interface PatternCardProps {
+  pattern: BehaviorPattern;
+  isSelected: boolean;
+  onClick: () => void;
+}
+ 
+const PatternCard: React.FC<PatternCardProps> = ({
+  pattern,
+  isSelected,
+  onClick,
+}) => {
+  const getPatternTypeLabel = (type: PatternTypeVariant | string) => {
+    // Handle object format
+    const typeStr = typeof type === 'string' ? type : type.type;
+ 
+    switch (typeStr) {
+      case 'SkillCombination':
+        return { label: 'Skill Combo', icon: '⚡' };
+      case 'TemporalTrigger':
+        return { label: 'Time Trigger', icon: '⏰' };
+      case 'TaskPipelineMapping':
+        return { label: 'Task Mapping', icon: '🔄' };
+      case 'InputPattern':
+        return { label: 'Input Pattern', icon: '📝' };
+      default:
+        return { label: typeStr, icon: '📊' };
+    }
+  };
+ 
+  const { label, icon } = getPatternTypeLabel(pattern.pattern_type as PatternTypeVariant);
+  const confidencePercent = Math.round(pattern.confidence * 100);
+ 
+  return (
+    <motion.div
+      layout
+      onClick={onClick}
+      className={`p-3 rounded-lg border cursor-pointer transition-colors ${
+        isSelected
+          ? 'bg-purple-500/10 border-purple-500/50'
+          : 'bg-gray-800/30 border-gray-700/50 hover:border-gray-600'
+      }`}
+    >
+      <div className="flex items-center justify-between">
+        <div className="flex items-center gap-2">
+          <span className="text-lg">{icon}</span>
+          <span className="text-white font-medium">{label}</span>
+        </div>
+        <div className="flex items-center gap-2">
+          <span className="text-xs text-gray-400">
+            {pattern.frequency}x used
+          </span>
+          <span
+            className={`text-xs font-mono ${
+              pattern.confidence >= 0.6
+                ? 'text-green-400'
+                : 'text-yellow-400'
+            }`}
+          >
+            {confidencePercent}%
+          </span>
+        </div>
+      </div>
+ 
+      <AnimatePresence>
+        {isSelected && (
+          <motion.div
+            initial={{ height: 0, opacity: 0 }}
+            animate={{ height: 'auto', opacity: 1 }}
+            exit={{ height: 0, opacity: 0 }}
+            className="mt-3 pt-3 border-t border-gray-700/50 overflow-hidden"
+          >
+            <div className="space-y-2 text-sm">
+              <div>
+                <span className="text-gray-500">ID:</span>{' '}
+                <span className="text-gray-300 font-mono text-xs">
+                  {pattern.id}
+                </span>
+              </div>
+              <div>
+                <span className="text-gray-500">First seen:</span>{' '}
+                <span className="text-gray-300">
+                  {new Date(pattern.first_occurrence).toLocaleDateString()}
+                </span>
+              </div>
+              <div>
+                <span className="text-gray-500">Last seen:</span>{' '}
+                <span className="text-gray-300">
+                  {new Date(pattern.last_occurrence).toLocaleDateString()}
+                </span>
+              </div>
+              {pattern.context.intent && (
+                <div>
+                  <span className="text-gray-500">Intent:</span>{' '}
+                  <span className="text-gray-300">{pattern.context.intent}</span>
+                </div>
+              )}
+            </div>
+          </motion.div>
+        )}
+      </AnimatePresence>
+    </motion.div>
+  );
+};
+ 
+export default WorkflowRecommendations;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/index.html b/desktop/coverage/src/components/index.html new file mode 100644 index 0000000..09f4b25 --- /dev/null +++ b/desktop/coverage/src/components/index.html @@ -0,0 +1,866 @@ + + + + + + Code coverage report for src/components + + + + + + + + + +
+
+

All files src/components

+
+ +
+ 0% + Statements + 0/15761 +
+ + +
+ 0% + Branches + 0/51 +
+ + +
+ 0% + Functions + 0/51 +
+ + +
+ 0% + Lines + 0/15761 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ActiveLearningPanel.tsx +
+
0%0/3070%0/10%0/10%0/307
AgentOnboardingWizard.tsx +
+
0%0/4970%0/10%0/10%0/497
ApprovalsPanel.tsx +
+
0%0/3040%0/10%0/10%0/304
AuditLogsPanel.tsx +
+
0%0/6880%0/10%0/10%0/688
AutonomyConfig.tsx +
+
0%0/3620%0/10%0/10%0/362
ChannelList.tsx +
+
0%0/950%0/10%0/10%0/95
ChatArea.tsx +
+
0%0/5120%0/10%0/10%0/512
ClassroomPreviewer.tsx +
+
0%0/3560%0/10%0/10%0/356
CloneManager.tsx +
+
0%0/1290%0/10%0/10%0/129
CodeSnippetPanel.tsx +
+
0%0/2510%0/10%0/10%0/251
ConnectionStatus.tsx +
+
0%0/1960%0/10%0/10%0/196
ConversationList.tsx +
+
0%0/930%0/10%0/10%0/93
CreateTriggerModal.tsx +
+
0%0/4370%0/10%0/10%0/437
DetailDrawer.tsx +
+
0%0/360%0/10%0/10%0/36
DevQALoop.tsx +
+
0%0/3550%0/10%0/10%0/355
ErrorNotification.tsx +
+
0%0/1770%0/10%0/10%0/177
FirstConversationPrompt.tsx +
+
0%0/790%0/10%0/10%0/79
HandApprovalModal.tsx +
+
0%0/3960%0/10%0/10%0/396
HandList.tsx +
+
0%0/980%0/10%0/10%0/98
HandParamsForm.tsx +
+
0%0/5940%0/10%0/10%0/594
HandTaskPanel.tsx +
+
0%0/2340%0/10%0/10%0/234
HandsPanel.tsx +
+
0%0/4490%0/10%0/10%0/449
HeartbeatConfig.tsx +
+
0%0/4030%0/10%0/10%0/403
IdentityChangeProposal.tsx +
+
0%0/3550%0/10%0/10%0/355
MemoryGraph.tsx +
+
0%0/4400%0/10%0/10%0/440
MemoryPanel.tsx +
+
0%0/3090%0/10%0/10%0/309
MessageSearch.tsx +
+
0%0/3410%0/10%0/10%0/341
OfflineIndicator.tsx +
+
0%0/2490%0/10%0/10%0/249
PersonalitySelector.tsx +
+
0%0/870%0/10%0/10%0/87
PipelineResultPreview.tsx +
+
0%0/2180%0/10%0/10%0/218
PipelinesPanel.tsx +
+
0%0/3890%0/10%0/10%0/389
ReflectionLog.tsx +
+
0%0/5640%0/10%0/10%0/564
RightPanel.tsx +
+
0%0/6220%0/10%0/10%0/622
ScenarioTags.tsx +
+
0%0/1140%0/10%0/10%0/114
SchedulerPanel.tsx +
+
0%0/7430%0/10%0/10%0/743
SecurityLayersPanel.tsx +
+
0%0/5840%0/10%0/10%0/584
SecurityStatus.tsx +
+
0%0/2240%0/10%0/10%0/224
Sidebar.tsx +
+
0%0/1170%0/10%0/10%0/117
SkillMarket.tsx +
+
0%0/2910%0/10%0/10%0/291
SwarmDashboard.tsx +
+
0%0/4480%0/10%0/10%0/448
TaskList.tsx +
+
0%0/860%0/10%0/10%0/86
TeamCollaborationView.tsx +
+
0%0/3000%0/10%0/10%0/300
TeamList.tsx +
+
0%0/2280%0/10%0/10%0/228
TeamOrchestrator.tsx +
+
0%0/4400%0/10%0/10%0/440
TopBar.tsx +
+
0%0/340%0/10%0/10%0/34
TriggersPanel.tsx +
+
0%0/1830%0/10%0/10%0/183
VikingPanel.tsx +
+
0%0/2210%0/10%0/10%0/221
WorkflowEditor.tsx +
+
0%0/3220%0/10%0/10%0/322
WorkflowHistory.tsx +
+
0%0/1950%0/10%0/10%0/195
WorkflowList.tsx +
+
0%0/3550%0/10%0/10%0/355
WorkflowRecommendations.tsx +
+
0%0/2540%0/10%0/10%0/254
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/Badge.tsx.html b/desktop/coverage/src/components/ui/Badge.tsx.html new file mode 100644 index 0000000..1deb672 --- /dev/null +++ b/desktop/coverage/src/components/ui/Badge.tsx.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for src/components/ui/Badge.tsx + + + + + + + + + +
+
+

All files / src/components/ui Badge.tsx

+
+ +
+ 0% + Statements + 0/20 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { cn } from '../../lib/utils';
+ 
+type BadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';
+ 
+interface BadgeProps {
+  children: React.ReactNode;
+  variant?: BadgeVariant;
+  className?: string;
+}
+ 
+const variantStyles: Record<BadgeVariant, string> = {
+  default: 'bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300',
+  primary: 'bg-primary-light text-primary',
+  success: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',
+  warning: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
+  error: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+  info: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',
+};
+ 
+export function Badge({ children, variant = 'default', className }: BadgeProps) {
+  return (
+    <span
+      className={cn(
+        'inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium',
+        variantStyles[variant],
+        className
+      )}
+    >
+      {children}
+    </span>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/Button.tsx.html b/desktop/coverage/src/components/ui/Button.tsx.html new file mode 100644 index 0000000..3172dee --- /dev/null +++ b/desktop/coverage/src/components/ui/Button.tsx.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for src/components/ui/Button.tsx + + + + + + + + + +
+
+

All files / src/components/ui Button.tsx

+
+ +
+ 0% + Statements + 0/35 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { forwardRef } from 'react';
+import { motion, HTMLMotionProps } from 'framer-motion';
+import { cn } from '../../lib/utils';
+import { Loader2 } from 'lucide-react';
+ 
+export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'outline';
+export type ButtonSize = 'sm' | 'md' | 'lg';
+ 
+export interface ButtonProps extends Omit<HTMLMotionProps<'button'>, 'children'> {
+  variant?: ButtonVariant;
+  size?: ButtonSize;
+  loading?: boolean;
+  children?: React.ReactNode;
+}
+ 
+const variantStyles: Record<ButtonVariant, string> = {
+  primary: 'bg-primary text-white hover:bg-primary-hover',
+  secondary: 'bg-gray-100 text-gray-900 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-100 dark:hover:bg-gray-600',
+  ghost: 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700',
+  danger: 'bg-red-500 text-white hover:bg-red-600',
+  outline: 'border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800',
+};
+ 
+const sizeStyles: Record<ButtonSize, string> = {
+  sm: 'px-3 py-1.5 text-xs rounded-md',
+  md: 'px-4 py-2 text-sm rounded-lg',
+  lg: 'px-6 py-3 text-base rounded-lg',
+};
+ 
+export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
+  ({ className, variant = 'primary', size = 'md', loading, disabled, children, ...props }, ref) => {
+    return (
+      <motion.button
+        ref={ref}
+        whileTap={{ scale: 0.98 }}
+        className={cn(
+          'inline-flex items-center justify-center font-medium transition-colors duration-fast',
+          'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',
+          'disabled:opacity-50 disabled:cursor-not-allowed',
+          variantStyles[variant],
+          sizeStyles[size],
+          className
+        )}
+        disabled={disabled || loading}
+        {...props}
+      >
+        {loading && <Loader2 className="w-4 h-4 mr-2 animate-spin" />}
+        {children}
+      </motion.button>
+    );
+  }
+);
+ 
+Button.displayName = 'Button';
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/Card.tsx.html b/desktop/coverage/src/components/ui/Card.tsx.html new file mode 100644 index 0000000..a3f7e2e --- /dev/null +++ b/desktop/coverage/src/components/ui/Card.tsx.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for src/components/ui/Card.tsx + + + + + + + + + +
+
+

All files / src/components/ui Card.tsx

+
+ +
+ 0% + Statements + 0/33 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { motion, HTMLMotionProps } from 'framer-motion';
+import { cn } from '../../lib/utils';
+import { cardHover } from '../../lib/animations';
+ 
+interface CardProps extends Omit<HTMLMotionProps<'div'>, 'children'> {
+  children: React.ReactNode;
+  hoverable?: boolean;
+}
+ 
+export function Card({ children, className, hoverable = false, ...props }: CardProps) {
+  return (
+    <motion.div
+      className={cn(
+        'rounded-xl border border-gray-200 bg-white p-4 shadow-sm',
+        'dark:border-gray-700 dark:bg-gray-800',
+        hoverable && 'cursor-pointer transition-shadow duration-200',
+        className
+      )}
+      {...(hoverable && { whileHover: cardHover })}
+      {...props}
+    >
+      {children}
+    </motion.div>
+  );
+}
+ 
+interface CardHeaderProps {
+  children: React.ReactNode;
+  className?: string;
+}
+ 
+export function CardHeader({ children, className }: CardHeaderProps) {
+  return (
+    <div className={cn('mb-3', className)}>
+      {children}
+    </div>
+  );
+}
+ 
+interface CardTitleProps {
+  children: React.ReactNode;
+  className?: string;
+}
+ 
+export function CardTitle({ children, className }: CardTitleProps) {
+  return (
+    <h3 className={cn('text-sm font-semibold text-gray-900 dark:text-gray-100', className)}>
+      {children}
+    </h3>
+  );
+}
+ 
+interface CardContentProps {
+  children: React.ReactNode;
+  className?: string;
+}
+ 
+export function CardContent({ children, className }: CardContentProps) {
+  return (
+    <div className={cn('text-sm text-gray-600 dark:text-gray-300', className)}>
+      {children}
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/EmojiPicker.tsx.html b/desktop/coverage/src/components/ui/EmojiPicker.tsx.html new file mode 100644 index 0000000..043b72d --- /dev/null +++ b/desktop/coverage/src/components/ui/EmojiPicker.tsx.html @@ -0,0 +1,394 @@ + + + + + + Code coverage report for src/components/ui/EmojiPicker.tsx + + + + + + + + + +
+
+

All files / src/components/ui EmojiPicker.tsx

+
+ +
+ 0% + Statements + 0/70 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * EmojiPicker - Emoji selection component for Agent onboarding
+ *
+ * Displays categorized emoji presets for users to choose from.
+ */
+import { useState } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { cn } from '../../lib/utils';
+import { EMOJI_PRESETS, ALL_EMOJIS } from '../../lib/personality-presets';
+ 
+type EmojiCategory = 'all' | 'animals' | 'objects' | 'expressions';
+ 
+export interface EmojiPickerProps {
+  value?: string;
+  onChange: (emoji: string) => void;
+  className?: string;
+}
+ 
+const categoryLabels: Record<EmojiCategory, string> = {
+  all: '全部',
+  animals: '动物',
+  objects: '物体',
+  expressions: '表情',
+};
+ 
+export function EmojiPicker({ value, onChange, className }: EmojiPickerProps) {
+  const [activeCategory, setActiveCategory] = useState<EmojiCategory>('all');
+ 
+  const getEmojisForCategory = (category: EmojiCategory): string[] => {
+    if (category === 'all') {
+      return ALL_EMOJIS;
+    }
+    return EMOJI_PRESETS[category] || [];
+  };
+ 
+  const emojis = getEmojisForCategory(activeCategory);
+ 
+  return (
+    <div className={cn('space-y-3', className)}>
+      {/* Category Tabs */}
+      <div className="flex gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg">
+        {(Object.keys(categoryLabels) as EmojiCategory[]).map((category) => (
+          <button
+            key={category}
+            type="button"
+            onClick={() => setActiveCategory(category)}
+            className={cn(
+              'flex-1 px-3 py-1.5 text-xs font-medium rounded-md transition-colors',
+              activeCategory === category
+                ? 'bg-white dark:bg-gray-700 text-primary shadow-sm'
+                : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'
+            )}
+          >
+            {categoryLabels[category]}
+          </button>
+        ))}
+      </div>
+ 
+      {/* Emoji Grid */}
+      <motion.div
+        layout
+        className="grid grid-cols-8 gap-1"
+      >
+        <AnimatePresence mode="popLayout">
+          {emojis.map((emoji) => (
+            <motion.button
+              key={emoji}
+              type="button"
+              layout
+              initial={{ opacity: 0, scale: 0.8 }}
+              animate={{ opacity: 1, scale: 1 }}
+              exit={{ opacity: 0, scale: 0.8 }}
+              transition={{ duration: 0.15 }}
+              onClick={() => onChange(emoji)}
+              className={cn(
+                'w-9 h-9 flex items-center justify-center text-xl rounded-lg transition-all',
+                'hover:bg-gray-100 dark:hover:bg-gray-700',
+                'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-1',
+                value === emoji && 'bg-primary/10 ring-2 ring-primary'
+              )}
+            >
+              {emoji}
+            </motion.button>
+          ))}
+        </AnimatePresence>
+      </motion.div>
+ 
+      {/* Selected Preview */}
+      {value && (
+        <motion.div
+          initial={{ opacity: 0, y: 5 }}
+          animate={{ opacity: 1, y: 0 }}
+          className="flex items-center gap-2 p-2 bg-primary/5 rounded-lg"
+        >
+          <span className="text-2xl">{value}</span>
+          <span className="text-sm text-gray-600 dark:text-gray-400">
+            已选择
+          </span>
+        </motion.div>
+      )}
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/EmptyState.tsx.html b/desktop/coverage/src/components/ui/EmptyState.tsx.html new file mode 100644 index 0000000..d13472d --- /dev/null +++ b/desktop/coverage/src/components/ui/EmptyState.tsx.html @@ -0,0 +1,688 @@ + + + + + + Code coverage report for src/components/ui/EmptyState.tsx + + + + + + + + + +
+
+

All files / src/components/ui EmptyState.tsx

+
+ +
+ 0% + Statements + 0/139 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/139 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { cn } from '../../lib/utils';
+import { MessageSquare, Inbox, Search, FileX, Wifi, Bot } from 'lucide-react';
+ 
+interface EmptyStateProps {
+  icon: React.ReactNode;
+  title: string;
+  description: string;
+  action?: React.ReactNode;
+  className?: string;
+  /** Size variant */
+  size?: 'sm' | 'md' | 'lg';
+}
+ 
+export function EmptyState({
+  icon,
+  title,
+  description,
+  action,
+  className,
+  size = 'md'
+}: EmptyStateProps) {
+  const sizeClasses = {
+    sm: {
+      container: 'py-4',
+      iconWrapper: 'w-12 h-12',
+      icon: 'w-5 h-5',
+      title: 'text-sm',
+      description: 'text-xs',
+    },
+    md: {
+      container: 'p-6',
+      iconWrapper: 'w-16 h-16',
+      icon: 'w-8 h-8',
+      title: 'text-base',
+      description: 'text-sm',
+    },
+    lg: {
+      container: 'p-8',
+      iconWrapper: 'w-20 h-20',
+      icon: 'w-10 h-10',
+      title: 'text-lg',
+      description: 'text-base',
+    },
+  };
+ 
+  const sizes = sizeClasses[size];
+ 
+  return (
+    <div className={cn('h-full flex items-center justify-center', sizes.container, className)}>
+      <div className="text-center max-w-sm">
+        <div
+          className={cn(
+            'rounded-full flex items-center justify-center mx-auto mb-4 text-gray-400',
+            sizes.iconWrapper,
+            'bg-gray-100 dark:bg-gray-800'
+          )}
+        >
+          {icon}
+        </div>
+        <h3 className={cn('font-semibold text-gray-700 dark:text-gray-300 mb-2', sizes.title)}>
+          {title}
+        </h3>
+        <p className={cn('text-gray-500 dark:text-gray-400 mb-4', sizes.description)}>
+          {description}
+        </p>
+        {action}
+      </div>
+    </div>
+  );
+}
+ 
+// === Pre-built Empty State Variants ===
+ 
+interface PrebuiltEmptyStateProps {
+  action?: React.ReactNode;
+  className?: string;
+  size?: 'sm' | 'md' | 'lg';
+}
+ 
+/**
+ * Empty state for no messages in chat.
+ */
+export function EmptyMessages({ action, className, size }: PrebuiltEmptyStateProps) {
+  return (
+    <EmptyState
+      icon={<MessageSquare className="w-8 h-8" />}
+      title="No messages yet"
+      description="Start the conversation by sending a message below."
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ 
+/**
+ * Empty state for no conversations.
+ */
+export function EmptyConversations({ action, className, size }: PrebuiltEmptyStateProps) {
+  return (
+    <EmptyState
+      icon={<Inbox className="w-8 h-8" />}
+      title="No conversations"
+      description="Your conversation history will appear here."
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ 
+/**
+ * Empty state for search with no results.
+ */
+export function EmptySearchResults({ query, action, className, size }: PrebuiltEmptyStateProps & { query?: string }) {
+  return (
+    <EmptyState
+      icon={<Search className="w-8 h-8" />}
+      title="No results found"
+      description={query ? `No messages matching "${query}"` : 'Try adjusting your search terms.'}
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ 
+/**
+ * Empty state for no files or attachments.
+ */
+export function EmptyFiles({ action, className, size }: PrebuiltEmptyStateProps) {
+  return (
+    <EmptyState
+      icon={<FileX className="w-8 h-8" />}
+      title="No files"
+      description="No files or attachments here yet."
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ 
+/**
+ * Empty state for offline/disconnected state.
+ */
+export function EmptyOffline({ action, className, size }: PrebuiltEmptyStateProps) {
+  return (
+    <EmptyState
+      icon={<Wifi className="w-8 h-8 text-orange-400" />}
+      title="Offline"
+      description="Please check your connection and try again."
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ 
+/**
+ * Empty state for no agents/clones available.
+ */
+export function EmptyAgents({ action, className, size }: PrebuiltEmptyStateProps) {
+  return (
+    <EmptyState
+      icon={<Bot className="w-8 h-8" />}
+      title="No agents"
+      description="Create an agent to get started with personalized conversations."
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ 
+/**
+ * Empty state for welcome screen.
+ */
+export function WelcomeEmptyState({
+  title = "Welcome to ZCLAW",
+  description = "Send a message to start the conversation.",
+  connected = true,
+  action,
+  className,
+  size,
+}: PrebuiltEmptyStateProps & {
+  title?: string;
+  description?: string;
+  connected?: boolean;
+}) {
+  return (
+    <EmptyState
+      icon={<MessageSquare className="w-8 h-8" />}
+      title={title}
+      description={connected ? description : 'Please connect to Gateway first.'}
+      action={action}
+      className={className}
+      size={size}
+    />
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/ErrorAlert.tsx.html b/desktop/coverage/src/components/ui/ErrorAlert.tsx.html new file mode 100644 index 0000000..8a4ce67 --- /dev/null +++ b/desktop/coverage/src/components/ui/ErrorAlert.tsx.html @@ -0,0 +1,1120 @@ + + + + + + Code coverage report for src/components/ui/ErrorAlert.tsx + + + + + + + + + +
+
+

All files / src/components/ui ErrorAlert.tsx

+
+ +
+ 0% + Statements + 0/240 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/240 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useCallback } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import {
+  AlertTriangle,
+  Wifi,
+  Shield,
+  Clock,
+  Settings,
+  AlertCircle,
+  ChevronDown,
+  ChevronUp,
+  Copy,
+  CheckCircle,
+  ExternalLink,
+} from 'lucide-react';
+import { cn } from '../../lib/utils';
+import { Button } from './Button';
+import {
+  AppError,
+  ErrorCategory,
+  classifyError,
+  formatErrorForClipboard,
+  getErrorIcon as getIconByCategory,
+  getErrorColor as getColorByCategory,
+} from '../../lib/error-types';
+ 
+import { reportError } from '../../lib/error-handling';
+ 
+// === Props ===
+ 
+export interface ErrorAlertProps {
+  error: AppError | string | Error | null;
+  onDismiss?: () => void;
+  onRetry?: () => void;
+  showTechnicalDetails?: boolean;
+  className?: string;
+  compact?: boolean;
+}
+ 
+interface ErrorAlertState {
+  showDetails: boolean;
+  copied: boolean;
+}
+ 
+// === Category Configuration ===
+ 
+const CATEGORY_CONFIG: Record<ErrorCategory, {
+  icon: typeof Wifi | typeof Shield | typeof Clock | typeof Settings | typeof AlertCircle | typeof AlertTriangle;
+  color: string;
+  bgColor: string;
+  label: string;
+}> = {
+  network: {
+    icon: Wifi,
+    color: 'text-orange-500',
+    bgColor: 'bg-orange-50 dark:bg-orange-900/20',
+    label: 'Network',
+  },
+  auth: {
+    icon: Shield,
+    color: 'text-red-500',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    label: 'Authentication',
+  },
+  permission: {
+    icon: Shield,
+    color: 'text-purple-500',
+    bgColor: 'bg-purple-50 dark:bg-purple-900/20',
+    label: 'Permission',
+  },
+  validation: {
+    icon: AlertCircle,
+    color: 'text-yellow-600',
+    bgColor: 'bg-yellow-50 dark:bg-yellow-900/20',
+    label: 'Validation',
+  },
+  timeout: {
+    icon: Clock,
+    color: 'text-amber-500',
+    bgColor: 'bg-amber-50 dark:bg-amber-900/20',
+    label: 'Timeout',
+  },
+  server: {
+    icon: AlertTriangle,
+    color: 'text-red-500',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    label: 'Server',
+  },
+  client: {
+    icon: AlertCircle,
+    color: 'text-blue-500',
+    bgColor: 'bg-blue-50 dark:bg-blue-900/20',
+    label: 'Client',
+  },
+  config: {
+    icon: Settings,
+    color: 'text-gray-500',
+    bgColor: 'bg-gray-50 dark:bg-gray-900/20',
+    label: 'Configuration',
+  },
+  system: {
+    icon: AlertTriangle,
+    color: 'text-red-600',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    label: 'System',
+  },
+};
+ 
+/**
+ * Get icon component for error category
+ */
+export function getIconByCategory(category: ErrorCategory): typeof Wifi | typeof Shield | typeof Clock | typeof Settings | typeof AlertCircle | typeof AlertTriangle {
+  return CATEGORY_CONFIG[category]?.icon ?? AlertCircle;
+}
+ 
+/**
+ * Get color class for error category
+ */
+export function getColorByCategory(category: ErrorCategory): string {
+  return CATEGORY_CONFIG[category]?.color ?? 'text-gray-500';
+}
+ 
+/**
+ * ErrorAlert Component
+ *
+ * Displays detailed error information with recovery suggestions,
+ * technical details, and action buttons.
+ */
+export function ErrorAlert({
+  error: errorProp,
+  onDismiss,
+  onRetry,
+  showTechnicalDetails = true,
+  className,
+  compact = false,
+}: ErrorAlertProps) {
+  const [state, setState] = useState<ErrorAlertState>({
+    showDetails: false,
+    copied: false,
+  });
+ 
+  // Normalize error input
+  const appError = typeof errorProp === 'string'
+    ? classifyError(new Error(errorProp))
+    : errorProp instanceof Error
+      ? classifyError(errorProp)
+      : errorProp;
+ 
+  const {
+    category,
+    title,
+    message,
+    technicalDetails,
+    recoverable,
+    recoverySteps,
+    timestamp,
+  } = appError;
+ 
+  const config = CATEGORY_CONFIG[category] || CATEGORY_CONFIG.system!;
+  const IconComponent = config.icon;
+ 
+  const handleCopyDetails = useCallback(async () => {
+    const text = formatErrorForClipboard(appError);
+    try {
+      await navigator.clipboard.writeText(text);
+      setState({ copied: true });
+      setTimeout(() => setState({ copied: false }), 2000);
+    } catch (err) {
+      console.error('Failed to copy error details:', err);
+    }
+  }, [appError]);
+ 
+  const handleReport = useCallback(() => {
+    reportError(appError.originalError || appError, {
+      errorId: appError.id,
+      category: appError.category,
+      title: appError.title,
+      message: appError.message,
+      timestamp: appError.timestamp.toISOString(),
+    });
+  }, [appError]);
+ 
+  const toggleDetails = useCallback(() => {
+    setState((prev) => ({ showDetails: !prev.showDetails }));
+  }, []);
+ 
+  const handleRetry = useCallback(() => {
+    onRetry?.();
+  }, [onRetry]);
+ 
+  return (
+    <motion.div
+      initial={{ opacity: 0, y: -10 }}
+      animate={{ opacity: 1, y: 0 }}
+      exit={{ opacity: 0, y: -10 }}
+      className={cn(
+        'rounded-lg border overflow-hidden',
+        config.bgColor,
+        'border-gray-200 dark:border-gray-700',
+        className
+      )}
+    >
+      {/* Header */}
+      <div className="flex items-start gap-3 p-3 bg-white/50 dark:bg-gray-800/50">
+        <div className={cn('p-2 rounded-lg', config.bgColor)}>
+          <IconComponent className={cn('w-5 h-5', config.color)} />
+        </div>
+        <div className="flex-1 min-w-0">
+          <div className="flex items-center gap-2">
+            <span className={cn('text-xs font-medium', config.color)}>
+              {config.label}
+            </span>
+            <span className="text-xs text-gray-400">
+              {timestamp.toLocaleTimeString()}
+            </span>
+          </div>
+          <h4 className="text-sm font-medium text-gray-900 dark:text-gray-100 mt-1">
+            {title}
+          </h4>
+        </div>
+        {onDismiss && (
+          <button
+            onClick={onDismiss}
+            className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 p-1"
+            aria-label="Dismiss"
+          >
+            <svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+              <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
+            </svg>
+          </button>
+        )}
+      </div>
+ 
+      {/* Body */}
+      <div className="px-3 pb-2">
+        <p className={cn(
+          'text-gray-700 dark:text-gray-300',
+          compact ? 'text-sm line-clamp-2' : 'text-sm'
+        )}>
+          {message}
+        </p>
+ 
+        {/* Recovery Steps */}
+        {recoverySteps.length > 0 && !compact && (
+          <div className="mt-3 space-y-2">
+            <p className="text-xs font-medium text-gray-500 dark:text-gray-400 flex items-center gap-1">
+              <CheckCircle className="w-3 h-3" />
+              Recovery Suggestions
+            </p>
+            <ul className="space-y-1">
+              {recoverySteps.slice(0, 3).map((step, index) => (
+                <li key={index} className="text-xs text-gray-600 dark:text-gray-400 flex items-start gap-2">
+                  <span className="text-gray-400">-</span>
+                  {step.description}
+                  {step.action && step.label && (
+                    <button
+                      onClick={step.action}
+                      className="text-blue-500 hover:text-blue-600 ml-1"
+                    >
+                      {step.label}
+                    </button>
+                  )}
+                </li>
+              ))}
+            </ul>
+          </div>
+        )}
+ 
+        {/* Technical Details Toggle */}
+        {showTechnicalDetails && technicalDetails && !compact && (
+          <div className="mt-2">
+            <button
+              onClick={toggleDetails}
+              className="flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
+            >
+              {state.showDetails ? (
+                <ChevronUp className="w-3 h-3" />
+              ) : (
+                <ChevronDown className="w-3 h-3" />
+              )}
+              Technical Details
+            </button>
+            <AnimatePresence>
+              {state.showDetails && (
+                <motion.div
+                  initial={{ height: 0, opacity: 0 }}
+                  animate={{ height: 'auto', opacity: 1 }}
+                  exit={{ height: 0, opacity: 0 }}
+                  className="overflow-hidden"
+                >
+                  <pre className="mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded text-xs text-gray-600 dark:text-gray-400 overflow-x-auto whitespace-pre-wrap break-all">
+                    {technicalDetails}
+                  </pre>
+                </motion.div>
+              )}
+            </AnimatePresence>
+          </div>
+        )}
+      </div>
+ 
+      {/* Actions */}
+      <div className="flex items-center justify-between gap-2 p-3 pt-2 border-t border-gray-100 dark:border-gray-700 bg-white/30 dark:bg-gray-800/30">
+        <div className="flex items-center gap-2">
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={handleCopyDetails}
+            className="text-xs"
+          >
+            {state.copied ? (
+              <>
+                <CheckCircle className="w-3 h-3 mr-1" />
+                Copied
+              </>
+            ) : (
+              <>
+                <Copy className="w-3 h-3 mr-1" />
+                Copy
+              </>
+            )}
+          </Button>
+          <Button
+            variant="ghost"
+            size="sm"
+            onClick={handleReport}
+            className="text-xs"
+          >
+            <ExternalLink className="w-3 h-3 mr-1" />
+            Report
+          </Button>
+        </div>
+        {recoverable && onRetry && (
+          <Button
+            variant="primary"
+            size="sm"
+            onClick={handleRetry}
+            className="text-xs"
+          >
+            Try Again
+          </Button>
+        )}
+      </div>
+    </motion.div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/ErrorBoundary.tsx.html b/desktop/coverage/src/components/ui/ErrorBoundary.tsx.html new file mode 100644 index 0000000..a04ea95 --- /dev/null +++ b/desktop/coverage/src/components/ui/ErrorBoundary.tsx.html @@ -0,0 +1,1663 @@ + + + + + + Code coverage report for src/components/ui/ErrorBoundary.tsx + + + + + + + + + +
+
+

All files / src/components/ui ErrorBoundary.tsx

+
+ +
+ 0% + Statements + 0/360 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/360 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Component, ReactNode, ErrorInfo as ReactErrorInfo } from 'react';
+import { motion } from 'framer-motion';
+import { AlertTriangle, RefreshCcw, Bug, Home, WifiOff } from 'lucide-react';
+import { Button } from './Button';
+import { reportError } from '../../lib/error-handling';
+import { classifyError, AppError } from '../../lib/error-types';
+ 
+// === Types ===
+ 
+/** Extended error info with additional metadata */
+interface ExtendedErrorInfo extends ReactErrorInfo {
+  errorName?: string;
+  errorMessage?: string;
+}
+ 
+interface ErrorBoundaryProps {
+  children: ReactNode;
+  fallback?: ReactNode;
+  onError?: (error: Error, errorInfo: ReactErrorInfo) => void;
+  onReset?: () => void;
+  /** Whether to show connection status indicator */
+  showConnectionStatus?: boolean;
+  /** Custom error title */
+  errorTitle?: string;
+  /** Custom error message */
+  errorMessage?: string;
+}
+ 
+interface ErrorBoundaryState {
+  hasError: boolean;
+  error: Error | null;
+  errorInfo: ExtendedErrorInfo | null;
+  appError: AppError | null;
+  showDetails: boolean;
+}
+ 
+// === Global Error Types ===
+ 
+type GlobalErrorType = 'unhandled-rejection' | 'error' | 'websocket' | 'network';
+ 
+interface GlobalErrorEvent {
+  type: GlobalErrorType;
+  error: unknown;
+  timestamp: Date;
+}
+ 
+// === Global Error Handler Registry ===
+ 
+const globalErrorListeners = new Set<(event: GlobalErrorEvent) => void>();
+ 
+export function addGlobalErrorListener(listener: (event: GlobalErrorEvent) => void): () => void {
+  globalErrorListeners.add(listener);
+  return () => globalErrorListeners.delete(listener);
+}
+ 
+function notifyGlobalErrorListeners(event: GlobalErrorEvent): void {
+  globalErrorListeners.forEach(listener => {
+    try {
+      listener(event);
+    } catch (e) {
+      console.error('[GlobalErrorHandler] Listener error:', e);
+    }
+  });
+}
+ 
+// === Setup Global Error Handlers ===
+ 
+let globalHandlersSetup = false;
+ 
+export function setupGlobalErrorHandlers(): () => void {
+  if (globalHandlersSetup) {
+    return () => {};
+  }
+  globalHandlersSetup = true;
+ 
+  // Handle unhandled promise rejections
+  const handleRejection = (event: PromiseRejectionEvent) => {
+    console.error('[GlobalErrorHandler] Unhandled rejection:', event.reason);
+    notifyGlobalErrorListeners({
+      type: 'unhandled-rejection',
+      error: event.reason,
+      timestamp: new Date(),
+    });
+    // Prevent default browser error logging (we handle it ourselves)
+    event.preventDefault();
+  };
+ 
+  // Handle uncaught errors
+  const handleError = (event: ErrorEvent) => {
+    console.error('[GlobalErrorHandler] Uncaught error:', event.error);
+    notifyGlobalErrorListeners({
+      type: 'error',
+      error: event.error,
+      timestamp: new Date(),
+    });
+    // Let the error boundary handle it if possible
+  };
+ 
+  // Handle WebSocket errors globally
+  const handleWebSocketError = (event: Event) => {
+    if (event.target instanceof WebSocket) {
+      console.error('[GlobalErrorHandler] WebSocket error:', event);
+      notifyGlobalErrorListeners({
+        type: 'websocket',
+        error: new Error('WebSocket connection error'),
+        timestamp: new Date(),
+      });
+    }
+  };
+ 
+  window.addEventListener('unhandledrejection', handleRejection);
+  window.addEventListener('error', handleError);
+  window.addEventListener('error', handleWebSocketError, true); // Capture phase for WebSocket
+ 
+  return () => {
+    window.removeEventListener('unhandledrejection', handleRejection);
+    window.removeEventListener('error', handleError);
+    window.removeEventListener('error', handleWebSocketError, true);
+    globalHandlersSetup = false;
+  };
+}
+ 
+/**
+ * GlobalErrorBoundary Component
+ *
+ * Root-level error boundary that catches all React errors and global errors.
+ * Displays a user-friendly error screen with recovery options.
+ */
+export class GlobalErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
+  private cleanupGlobalHandlers: (() => void) | null = null;
+ 
+  constructor(props: ErrorBoundaryProps) {
+    super(props);
+    this.state = {
+      hasError: false,
+      error: null,
+      errorInfo: null,
+      appError: null,
+      showDetails: false,
+    };
+  }
+ 
+  static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {
+    const appError = classifyError(error);
+    return {
+      hasError: true,
+      error,
+      appError,
+    };
+  }
+ 
+  componentDidMount() {
+    // Setup global error handlers
+    this.cleanupGlobalHandlers = setupGlobalErrorHandlers();
+ 
+    // Listen for global errors and update state
+    const unsubscribe = addGlobalErrorListener((event) => {
+      if (!this.state.hasError) {
+        const appError = classifyError(event.error);
+        this.setState({
+          hasError: true,
+          error: event.error instanceof Error ? event.error : new Error(String(event.error)),
+          appError,
+          errorInfo: null,
+        });
+      }
+    });
+ 
+    // Store cleanup function
+    this.cleanupGlobalHandlers = () => {
+      unsubscribe();
+    };
+  }
+ 
+  componentWillUnmount() {
+    this.cleanupGlobalHandlers?.();
+  }
+ 
+  componentDidCatch(error: Error, errorInfo: ReactErrorInfo) {
+    const { onError } = this.props;
+ 
+    // Classify the error
+    const appError = classifyError(error);
+ 
+    // Update state with extended error info
+    const extendedErrorInfo: ExtendedErrorInfo = {
+      componentStack: errorInfo.componentStack,
+      errorName: error.name || 'Unknown Error',
+      errorMessage: error.message || 'An unexpected error occurred',
+    };
+ 
+    this.setState({
+      errorInfo: extendedErrorInfo,
+      appError,
+    });
+ 
+    // Call optional error handler
+    if (onError) {
+      onError(error, errorInfo);
+    }
+ 
+    // Report to error tracking
+    reportError(error, {
+      componentStack: errorInfo.componentStack ?? undefined,
+      errorName: error.name,
+      errorMessage: error.message,
+    });
+  }
+ 
+  handleReset = () => {
+    const { onReset } = this.props;
+ 
+    // Reset error state
+    this.setState({
+      hasError: false,
+      error: null,
+      errorInfo: null,
+      appError: null,
+      showDetails: false,
+    });
+ 
+    // Call optional reset handler
+    if (onReset) {
+      onReset();
+    }
+  };
+ 
+  handleReload = () => {
+    window.location.reload();
+  };
+ 
+  handleGoHome = () => {
+    window.location.href = '/';
+  };
+ 
+  handleReport = () => {
+    const { error, errorInfo } = this.state;
+    if (error) {
+      reportError(error, {
+        componentStack: errorInfo?.componentStack ?? undefined,
+        errorName: errorInfo?.errorName || error.name,
+        errorMessage: errorInfo?.errorMessage || error.message,
+      });
+      // Show confirmation
+      alert('Error reported. Thank you for your feedback.');
+    }
+  };
+ 
+  toggleDetails = () => {
+    this.setState(prev => ({ showDetails: !prev.showDetails }));
+  };
+ 
+  render() {
+    const { children, fallback, errorTitle, errorMessage } = this.props;
+    const { hasError, error, errorInfo, appError, showDetails } = this.state;
+ 
+    if (hasError && error) {
+      // Use custom fallback if provided
+      if (fallback) {
+        return fallback;
+      }
+ 
+      // Get error display info
+      const title = errorTitle || appError?.title || 'Something went wrong';
+      const message = errorMessage || appError?.message || error.message || 'An unexpected error occurred';
+      const category = appError?.category || 'system';
+      const isNetworkError = category === 'network';
+ 
+      return (
+        <div className="min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-4">
+          <motion.div
+            initial={{ opacity: 0, scale: 0.95 }}
+            animate={{ opacity: 1, scale: 1 }}
+            transition={{ duration: 0.2 }}
+            className="max-w-lg w-full bg-white dark:bg-gray-800 rounded-xl shadow-lg overflow-hidden"
+          >
+            {/* Error Header */}
+            <div className={`p-6 ${isNetworkError ? 'bg-orange-50 dark:bg-orange-900/20' : 'bg-red-50 dark:bg-red-900/20'}`}>
+              <div className="flex items-center gap-4">
+                <div className={`p-3 rounded-full ${isNetworkError ? 'bg-orange-100 dark:bg-orange-900/40' : 'bg-red-100 dark:bg-red-900/40'}`}>
+                  {isNetworkError ? (
+                    <WifiOff className="w-8 h-8 text-orange-500" />
+                  ) : (
+                    <AlertTriangle className="w-8 h-8 text-red-500" />
+                  )}
+                </div>
+                <div>
+                  <h2 className="text-lg font-semibold text-gray-900 dark:text-white">
+                    {title}
+                  </h2>
+                  <p className="text-sm text-gray-600 dark:text-gray-400 mt-1">
+                    {message}
+                  </p>
+                </div>
+              </div>
+            </div>
+ 
+            {/* Error Details */}
+            <div className="p-6">
+              {/* Category Badge */}
+              {appError && (
+                <div className="flex items-center gap-2 mb-4">
+                  <span className={`px-2 py-1 text-xs font-medium rounded-full ${
+                    category === 'network' ? 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400' :
+                    category === 'auth' ? 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400' :
+                    category === 'server' ? 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400' :
+                    'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-300'
+                  }`}>
+                    {category.charAt(0).toUpperCase() + category.slice(1)} Error
+                  </span>
+                  {appError.recoverable && (
+                    <span className="px-2 py-1 text-xs font-medium rounded-full bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400">
+                      Recoverable
+                    </span>
+                  )}
+                </div>
+              )}
+ 
+              {/* Recovery Steps */}
+              {appError?.recoverySteps && appError.recoverySteps.length > 0 && (
+                <div className="mb-4 p-4 bg-gray-50 dark:bg-gray-700/50 rounded-lg">
+                  <h3 className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
+                    Suggested Actions:
+                  </h3>
+                  <ul className="space-y-2">
+                    {appError.recoverySteps.slice(0, 3).map((step, index) => (
+                      <li key={index} className="text-sm text-gray-600 dark:text-gray-400 flex items-start gap-2">
+                        <span className="text-gray-400 mt-0.5">{index + 1}.</span>
+                        <span>{step.description}</span>
+                      </li>
+                    ))}
+                  </ul>
+                </div>
+              )}
+ 
+              {/* Technical Details Toggle */}
+              <button
+                onClick={this.toggleDetails}
+                className="text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 flex items-center gap-1 mb-4"
+              >
+                <span>{showDetails ? 'Hide' : 'Show'} technical details</span>
+                <motion.span
+                  animate={{ rotate: showDetails ? 180 : 0 }}
+                  transition={{ duration: 0.2 }}
+                >
+                  ▼
+                </motion.span>
+              </button>
+ 
+              {/* Technical Details */}
+              {showDetails && (
+                <motion.div
+                  initial={{ height: 0, opacity: 0 }}
+                  animate={{ height: 'auto', opacity: 1 }}
+                  exit={{ height: 0, opacity: 0 }}
+                  className="overflow-hidden mb-4"
+                >
+                  <pre className="p-3 bg-gray-100 dark:bg-gray-700 rounded-lg text-xs text-gray-600 dark:text-gray-400 overflow-x-auto whitespace-pre-wrap break-words max-h-48">
+                    {errorInfo?.errorName || error.name}: {errorInfo?.errorMessage || error.message}
+                    {errorInfo?.componentStack && `\n\nComponent Stack:${errorInfo.componentStack}`}
+                  </pre>
+                </motion.div>
+              )}
+ 
+              {/* Actions */}
+              <div className="flex flex-col gap-2">
+                <div className="flex gap-2">
+                  <Button
+                    variant="primary"
+                    size="sm"
+                    onClick={this.handleReset}
+                    className="flex-1"
+                  >
+                    <RefreshCcw className="w-4 h-4 mr-2" />
+                    Try Again
+                  </Button>
+                  <Button
+                    variant="secondary"
+                    size="sm"
+                    onClick={this.handleReload}
+                    className="flex-1"
+                  >
+                    Reload Page
+                  </Button>
+                </div>
+                <div className="flex gap-2">
+                  <Button
+                    variant="ghost"
+                    size="sm"
+                    onClick={this.handleReport}
+                    className="flex-1"
+                  >
+                    <Bug className="w-4 h-4 mr-2" />
+                    Report Issue
+                  </Button>
+                  <Button
+                    variant="ghost"
+                    size="sm"
+                    onClick={this.handleGoHome}
+                    className="flex-1"
+                  >
+                    <Home className="w-4 h-4 mr-2" />
+                    Go Home
+                  </Button>
+                </div>
+              </div>
+            </div>
+          </motion.div>
+        </div>
+      );
+    }
+ 
+    return children;
+  }
+}
+ 
+/**
+ * ErrorBoundary Component
+ *
+ * A simpler error boundary for wrapping individual components or sections.
+ * Use GlobalErrorBoundary for the root level.
+ */
+export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
+  constructor(props: ErrorBoundaryProps) {
+    super(props);
+    this.state = {
+      hasError: false,
+      error: null,
+      errorInfo: null,
+      appError: null,
+      showDetails: false,
+    };
+  }
+ 
+  static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {
+    const appError = classifyError(error);
+    return {
+      hasError: true,
+      error,
+      appError,
+    };
+  }
+ 
+  componentDidCatch(error: Error, errorInfo: ReactErrorInfo) {
+    const { onError } = this.props;
+ 
+    // Update state with extended error info
+    const extendedErrorInfo: ExtendedErrorInfo = {
+      componentStack: errorInfo.componentStack,
+      errorName: error.name || 'Unknown Error',
+      errorMessage: error.message || 'An unexpected error occurred',
+    };
+ 
+    this.setState({
+      errorInfo: extendedErrorInfo,
+    });
+ 
+    // Call optional error handler
+    if (onError) {
+      onError(error, errorInfo);
+    }
+ 
+    // Report error
+    reportError(error, {
+      componentStack: errorInfo.componentStack ?? undefined,
+      errorName: error.name,
+      errorMessage: error.message,
+    });
+  }
+ 
+  handleReset = () => {
+    const { onReset } = this.props;
+    this.setState({
+      hasError: false,
+      error: null,
+      errorInfo: null,
+      appError: null,
+      showDetails: false,
+    });
+    if (onReset) {
+      onReset();
+    }
+  };
+ 
+  render() {
+    const { children, fallback } = this.props;
+    const { hasError, error, appError } = this.state;
+ 
+    if (hasError && error) {
+      if (fallback) {
+        return fallback;
+      }
+ 
+      // Compact error UI for nested boundaries
+      return (
+        <div className="p-4 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800">
+          <div className="flex items-start gap-3">
+            <AlertTriangle className="w-5 h-5 text-red-500 flex-shrink-0 mt-0.5" />
+            <div className="flex-1 min-w-0">
+              <h3 className="text-sm font-medium text-red-800 dark:text-red-200">
+                {appError?.title || 'Error'}
+              </h3>
+              <p className="text-sm text-red-600 dark:text-red-400 mt-1">
+                {appError?.message || error.message}
+              </p>
+              <Button
+                variant="ghost"
+                size="sm"
+                onClick={this.handleReset}
+                className="mt-2 text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-200"
+              >
+                <RefreshCcw className="w-3 h-3 mr-1" />
+                Retry
+              </Button>
+            </div>
+          </div>
+        </div>
+      );
+    }
+ 
+    return children;
+  }
+}
+ 
+// === Re-export for convenience ===
+export { GlobalErrorBoundary as RootErrorBoundary };
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/Input.tsx.html b/desktop/coverage/src/components/ui/Input.tsx.html new file mode 100644 index 0000000..e44a70a --- /dev/null +++ b/desktop/coverage/src/components/ui/Input.tsx.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/components/ui/Input.tsx + + + + + + + + + +
+
+

All files / src/components/ui Input.tsx

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { forwardRef, InputHTMLAttributes } from 'react';
+import { cn } from '../../lib/utils';
+ 
+export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
+  label?: string;
+  error?: string;
+}
+ 
+export const Input = forwardRef<HTMLInputElement, InputProps>(
+  ({ className, label, error, id, ...props }, ref) => {
+    const inputId = id || label?.toLowerCase().replace(/\s+/g, '-');
+ 
+    return (
+      <div className="w-full">
+        {label && (
+          <label
+            htmlFor={inputId}
+            className="block text-xs text-gray-500 dark:text-gray-400 mb-1"
+          >
+            {label}
+          </label>
+        )}
+        <input
+          ref={ref}
+          id={inputId}
+          className={cn(
+            'w-full text-sm border border-gray-200 rounded-lg px-3 py-2',
+            'bg-white dark:bg-gray-800 dark:border-gray-700 dark:text-gray-100',
+            'placeholder:text-gray-400 dark:placeholder:text-gray-500',
+            'focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent',
+            'transition-colors duration-fast',
+            error && 'border-red-500 focus:ring-red-500',
+            className
+          )}
+          {...props}
+        />
+        {error && (
+          <p className="mt-1 text-xs text-red-500">{error}</p>
+        )}
+      </div>
+    );
+  }
+);
+ 
+Input.displayName = 'Input';
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/LoadingSpinner.tsx.html b/desktop/coverage/src/components/ui/LoadingSpinner.tsx.html new file mode 100644 index 0000000..c45684d --- /dev/null +++ b/desktop/coverage/src/components/ui/LoadingSpinner.tsx.html @@ -0,0 +1,403 @@ + + + + + + Code coverage report for src/components/ui/LoadingSpinner.tsx + + + + + + + + + +
+
+

All files / src/components/ui LoadingSpinner.tsx

+
+ +
+ 0% + Statements + 0/52 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { cn } from '../../lib/utils';
+import { Loader2 } from 'lucide-react';
+ 
+interface LoadingSpinnerProps {
+  /** Size of the spinner */
+  size?: 'sm' | 'md' | 'lg';
+  /** Optional text to display below the spinner */
+  text?: string;
+  /** Additional class names */
+  className?: string;
+}
+ 
+const sizeClasses = {
+  sm: 'w-4 h-4',
+  md: 'w-6 h-6',
+  lg: 'w-8 h-8',
+};
+ 
+/**
+ * Small inline loading spinner for buttons and inline contexts.
+ */
+export function LoadingSpinner({ size = 'md', text, className }: LoadingSpinnerProps) {
+  return (
+    <div className={cn('flex items-center gap-2', className)}>
+      <Loader2 className={cn('animate-spin text-gray-400 dark:text-gray-500', sizeClasses[size])} />
+      {text && <span className="text-sm text-gray-500 dark:text-gray-400">{text}</span>}
+    </div>
+  );
+}
+ 
+interface LoadingOverlayProps {
+  /** Whether the overlay is visible */
+  visible: boolean;
+  /** Optional text to display */
+  text?: string;
+  /** Additional class names */
+  className?: string;
+}
+ 
+/**
+ * Full-screen loading overlay for blocking interactions during loading.
+ */
+export function LoadingOverlay({ visible, text = 'Loading...', className }: LoadingOverlayProps) {
+  if (!visible) return null;
+ 
+  return (
+    <div
+      className={cn(
+        'absolute inset-0 bg-white/80 dark:bg-gray-900/80 backdrop-blur-sm',
+        'flex items-center justify-center z-50',
+        className
+      )}
+    >
+      <div className="flex flex-col items-center gap-3">
+        <Loader2 className="w-8 h-8 animate-spin text-orange-500" />
+        <span className="text-sm text-gray-600 dark:text-gray-300">{text}</span>
+      </div>
+    </div>
+  );
+}
+ 
+interface LoadingDotsProps {
+  /** Additional class names */
+  className?: string;
+}
+ 
+/**
+ * Animated dots for "thinking" states.
+ */
+export function LoadingDots({ className }: LoadingDotsProps) {
+  return (
+    <div className={cn('flex items-center gap-1', className)}>
+      <span
+        className="w-2 h-2 bg-gray-400 dark:bg-gray-500 rounded-full animate-bounce"
+        style={{ animationDelay: '0ms' }}
+      />
+      <span
+        className="w-2 h-2 bg-gray-400 dark:bg-gray-500 rounded-full animate-bounce"
+        style={{ animationDelay: '150ms' }}
+      />
+      <span
+        className="w-2 h-2 bg-gray-400 dark:bg-gray-500 rounded-full animate-bounce"
+        style={{ animationDelay: '300ms' }}
+      />
+    </div>
+  );
+}
+ 
+interface InlineLoadingProps {
+  /** Loading text */
+  text?: string;
+  /** Additional class names */
+  className?: string;
+}
+ 
+/**
+ * Compact inline loading indicator with text.
+ */
+export function InlineLoading({ text = 'Loading...', className }: InlineLoadingProps) {
+  return (
+    <div className={cn('flex items-center gap-2 px-4 py-3 text-gray-500 dark:text-gray-400', className)}>
+      <LoadingDots />
+      <span className="text-sm">{text}</span>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/Skeleton.tsx.html b/desktop/coverage/src/components/ui/Skeleton.tsx.html new file mode 100644 index 0000000..5224c53 --- /dev/null +++ b/desktop/coverage/src/components/ui/Skeleton.tsx.html @@ -0,0 +1,628 @@ + + + + + + Code coverage report for src/components/ui/Skeleton.tsx + + + + + + + + + +
+
+

All files / src/components/ui Skeleton.tsx

+
+ +
+ 0% + Statements + 0/130 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/130 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { cn } from '../../lib/utils';
+ 
+interface SkeletonProps {
+  className?: string;
+}
+ 
+export function Skeleton({ className }: SkeletonProps) {
+  return (
+    <div
+      className={cn(
+        'animate-pulse bg-gray-200 dark:bg-gray-700 rounded',
+        className
+      )}
+    />
+  );
+}
+ 
+export function CardSkeleton() {
+  return (
+    <div className="rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4">
+      <Skeleton className="h-4 w-24 mb-3" />
+      <Skeleton className="h-3 w-full mb-2" />
+      <Skeleton className="h-3 w-3/4" />
+    </div>
+  );
+}
+ 
+export function ListSkeleton({ count = 3 }: { count?: number }) {
+  return (
+    <div className="space-y-2">
+      {Array.from({ length: count }).map((_, i) => (
+        <div key={i} className="flex items-center gap-3 p-2">
+          <Skeleton className="w-8 h-8 rounded-full" />
+          <div className="flex-1">
+            <Skeleton className="h-3 w-24 mb-1" />
+            <Skeleton className="h-2 w-32" />
+          </div>
+        </div>
+      ))}
+    </div>
+  );
+}
+ 
+/**
+ * Skeleton for a single chat message bubble.
+ * Supports both user and assistant message styles.
+ */
+export function MessageSkeleton({ isUser = false }: { isUser?: boolean }) {
+  return (
+    <div className={cn('flex gap-4', isUser && 'justify-end')}>
+      <div
+        className={cn(
+          'w-8 h-8 rounded-lg flex-shrink-0',
+          isUser ? 'bg-gray-200 dark:bg-gray-600 order-last' : 'bg-gray-300 dark:bg-gray-600'
+        )}
+      >
+        <Skeleton className="w-full h-full rounded-lg" />
+      </div>
+      <div className={cn('flex-1', isUser && 'max-w-2xl')}>
+        <div
+          className={cn(
+            'p-4 rounded-2xl',
+            isUser
+              ? 'bg-orange-100 dark:bg-orange-900/30'
+              : 'bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700'
+          )}
+        >
+          <Skeleton className="h-4 w-full mb-2" />
+          <Skeleton className="h-4 w-3/4 mb-2" />
+          <Skeleton className="h-4 w-1/2" />
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+/**
+ * Skeleton for a list of chat messages.
+ * Alternates between user and assistant skeletons.
+ */
+export function MessageListSkeleton({ count = 4 }: { count?: number }) {
+  return (
+    <div className="space-y-6 p-6">
+      {Array.from({ length: count }).map((_, i) => (
+        <MessageSkeleton key={i} isUser={i % 2 === 0} />
+      ))}
+    </div>
+  );
+}
+ 
+/**
+ * Skeleton for a conversation item in the sidebar.
+ */
+export function ConversationItemSkeleton() {
+  return (
+    <div className="flex items-center gap-3 px-3 py-3 border-b border-gray-50 dark:border-gray-800">
+      <Skeleton className="w-7 h-7 rounded-lg flex-shrink-0" />
+      <div className="flex-1 min-w-0">
+        <Skeleton className="h-3 w-24 mb-1.5" />
+        <Skeleton className="h-2 w-32" />
+      </div>
+    </div>
+  );
+}
+ 
+/**
+ * Skeleton for the conversation list sidebar.
+ */
+export function ConversationListSkeleton({ count = 5 }: { count?: number }) {
+  return (
+    <div className="flex flex-col h-full">
+      {/* Header skeleton */}
+      <div className="flex items-center justify-between px-3 py-2 border-b border-gray-200 dark:border-gray-700">
+        <Skeleton className="h-3 w-16" />
+        <Skeleton className="w-4 h-4 rounded" />
+      </div>
+      {/* List items */}
+      <div className="flex-1 overflow-hidden">
+        {Array.from({ length: count }).map((_, i) => (
+          <ConversationItemSkeleton key={i} />
+        ))}
+      </div>
+    </div>
+  );
+}
+ 
+/**
+ * Skeleton for the chat header.
+ */
+export function ChatHeaderSkeleton() {
+  return (
+    <div className="h-14 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between px-6 bg-white dark:bg-gray-900">
+      <div className="flex items-center gap-2">
+        <Skeleton className="h-5 w-24" />
+        <Skeleton className="h-3 w-20" />
+      </div>
+      <div className="flex items-center gap-2">
+        <Skeleton className="h-8 w-8 rounded-full" />
+        <Skeleton className="h-8 w-8 rounded-full" />
+      </div>
+    </div>
+  );
+}
+ 
+/**
+ * Skeleton for the chat input area.
+ */
+export function ChatInputSkeleton() {
+  return (
+    <div className="border-t border-gray-100 dark:border-gray-800 p-4 bg-white dark:bg-gray-900">
+      <div className="max-w-4xl mx-auto">
+        <div className="flex items-end gap-2 bg-gray-50 dark:bg-gray-800 rounded-2xl border border-gray-200 dark:border-gray-700 p-2">
+          <Skeleton className="w-5 h-5 rounded" />
+          <div className="flex-1 py-1">
+            <Skeleton className="h-5 w-full" />
+          </div>
+          <Skeleton className="w-16 h-6 rounded" />
+          <Skeleton className="w-8 h-8 rounded-full" />
+        </div>
+        <div className="text-center mt-2">
+          <Skeleton className="h-3 w-40 mx-auto" />
+        </div>
+      </div>
+    </div>
+  );
+}
+ 
+/**
+ * Full chat area skeleton including header, messages, and input.
+ */
+export function ChatAreaSkeleton({ messageCount = 4 }: { messageCount?: number }) {
+  return (
+    <div className="flex flex-col h-full">
+      <ChatHeaderSkeleton />
+      <div className="flex-1 overflow-hidden">
+        <MessageListSkeleton count={messageCount} />
+      </div>
+      <ChatInputSkeleton />
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/Toast.tsx.html b/desktop/coverage/src/components/ui/Toast.tsx.html new file mode 100644 index 0000000..aacb57b --- /dev/null +++ b/desktop/coverage/src/components/ui/Toast.tsx.html @@ -0,0 +1,352 @@ + + + + + + Code coverage report for src/components/ui/Toast.tsx + + + + + + + + + +
+
+

All files / src/components/ui Toast.tsx

+
+ +
+ 0% + Statements + 0/63 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useCallback, createContext, useContext } from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import { X, CheckCircle, AlertCircle, Info, AlertTriangle } from 'lucide-react';
+import { cn } from '../../lib/utils';
+ 
+type ToastType = 'success' | 'error' | 'info' | 'warning';
+ 
+interface Toast {
+  id: string;
+  message: string;
+  type: ToastType;
+}
+ 
+interface ToastContextType {
+  toast: (message: string, type?: ToastType) => void;
+}
+ 
+const ToastContext = createContext<ToastContextType | null>(null);
+ 
+export function useToast() {
+  const context = useContext(ToastContext);
+  if (!context) {
+    throw new Error('useToast must be used within a ToastProvider');
+  }
+  return context;
+}
+ 
+const iconMap: Record<ToastType, React.ReactNode> = {
+  success: <CheckCircle className="w-5 h-5 text-green-500" />,
+  error: <AlertCircle className="w-5 h-5 text-red-500" />,
+  info: <Info className="w-5 h-5 text-blue-500" />,
+  warning: <AlertTriangle className="w-5 h-5 text-yellow-500" />,
+};
+ 
+const styleMap: Record<ToastType, string> = {
+  success: 'bg-green-50 border-green-200 dark:bg-green-900/20 dark:border-green-800',
+  error: 'bg-red-50 border-red-200 dark:bg-red-900/20 dark:border-red-800',
+  info: 'bg-blue-50 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800',
+  warning: 'bg-yellow-50 border-yellow-200 dark:bg-yellow-900/20 dark:border-yellow-800',
+};
+ 
+export function ToastProvider({ children }: { children: React.ReactNode }) {
+  const [toasts, setToasts] = useState<Toast[]>([]);
+ 
+  const toast = useCallback((message: string, type: ToastType = 'info') => {
+    const id = Date.now().toString();
+    setToasts((prev) => [...prev, { id, message, type }]);
+    setTimeout(() => {
+      setToasts((prev) => prev.filter((t) => t.id !== id));
+    }, 3000);
+  }, []);
+ 
+  const removeToast = useCallback((id: string) => {
+    setToasts((prev) => prev.filter((t) => t.id !== id));
+  }, []);
+ 
+  return (
+    <ToastContext.Provider value={{ toast }}>
+      {children}
+      <div className="fixed bottom-4 right-4 z-50 space-y-2">
+        <AnimatePresence>
+          {toasts.map((t) => (
+            <motion.div
+              key={t.id}
+              initial={{ opacity: 0, y: 20 }}
+              animate={{ opacity: 1, y: 0 }}
+              exit={{ opacity: 0, y: -20 }}
+              className={cn(
+                'flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg',
+                'bg-white dark:bg-gray-800',
+                styleMap[t.type]
+              )}
+            >
+              {iconMap[t.type]}
+              <span className="text-sm text-gray-700 dark:text-gray-200">{t.message}</span>
+              <button
+                onClick={() => removeToast(t.id)}
+                className="ml-2 text-gray-400 hover:text-gray-600"
+                aria-label="Close"
+              >
+                <X className="w-4 h-4" />
+              </button>
+            </motion.div>
+          ))}
+        </AnimatePresence>
+      </div>
+    </ToastContext.Provider>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/index.html b/desktop/coverage/src/components/ui/index.html new file mode 100644 index 0000000..51ed7c1 --- /dev/null +++ b/desktop/coverage/src/components/ui/index.html @@ -0,0 +1,281 @@ + + + + + + Code coverage report for src/components/ui + + + + + + + + + +
+
+

All files src/components/ui

+
+ +
+ 0% + Statements + 0/1175 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 0% + Lines + 0/1175 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Badge.tsx +
+
0%0/200%0/10%0/10%0/20
Button.tsx +
+
0%0/350%0/10%0/10%0/35
Card.tsx +
+
0%0/330%0/10%0/10%0/33
EmojiPicker.tsx +
+
0%0/700%0/10%0/10%0/70
EmptyState.tsx +
+
0%0/1390%0/10%0/10%0/139
ErrorAlert.tsx +
+
0%0/2400%0/10%0/10%0/240
ErrorBoundary.tsx +
+
0%0/3600%0/10%0/10%0/360
Input.tsx +
+
0%0/320%0/10%0/10%0/32
LoadingSpinner.tsx +
+
0%0/520%0/10%0/10%0/52
Skeleton.tsx +
+
0%0/1300%0/10%0/10%0/130
Toast.tsx +
+
0%0/630%0/10%0/10%0/63
index.ts +
+
0%0/10%0/10%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/components/ui/index.ts.html b/desktop/coverage/src/components/ui/index.ts.html new file mode 100644 index 0000000..8a2066f --- /dev/null +++ b/desktop/coverage/src/components/ui/index.ts.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/components/ui/index.ts + + + + + + + + + +
+
+

All files / src/components/ui index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export { Button } from './Button';
+export type { ButtonProps } from './Button';
+ 
+export { Card, CardHeader, CardTitle, CardContent } from './Card';
+ 
+export { Input } from './Input';
+export type { InputProps } from './Input';
+ 
+export { Badge } from './Badge';
+ 
+// Skeleton components
+export {
+  Skeleton,
+  CardSkeleton,
+  ListSkeleton,
+  MessageSkeleton,
+  MessageListSkeleton,
+  ConversationItemSkeleton,
+  ConversationListSkeleton,
+  ChatHeaderSkeleton,
+  ChatInputSkeleton,
+  ChatAreaSkeleton,
+} from './Skeleton';
+ 
+// Empty state components
+export {
+  EmptyState,
+  EmptyMessages,
+  EmptyConversations,
+  EmptySearchResults,
+  EmptyFiles,
+  EmptyOffline,
+  EmptyAgents,
+  WelcomeEmptyState,
+} from './EmptyState';
+ 
+// Loading components
+export {
+  LoadingSpinner,
+  LoadingOverlay,
+  LoadingDots,
+  InlineLoading,
+} from './LoadingSpinner';
+ 
+export { ToastProvider, useToast } from './Toast';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/constants/api-urls.ts.html b/desktop/coverage/src/constants/api-urls.ts.html new file mode 100644 index 0000000..b4f0fc8 --- /dev/null +++ b/desktop/coverage/src/constants/api-urls.ts.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/constants/api-urls.ts + + + + + + + + + +
+
+

All files / src/constants api-urls.ts

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * API URL Constants - Single Source of Truth
+ *
+ * All API URLs should reference this file.
+ * Backend (Rust) should use the same values in config.rs
+ */
+ 
+// === LLM Provider URLs ===
+ 
+/**
+ * LLM Provider API URLs
+ */
+export const LLM_PROVIDER_URLS = {
+  // OpenAI
+  OPENAI: 'https://api.openai.com/v1',
+ 
+  // Anthropic
+  ANTHROPIC: 'https://api.anthropic.com',
+ 
+  // Gemini
+  GEMINI: 'https://generativelanguage.googleapis.com/v1beta',
+ 
+  // DeepSeek
+  DEEPSEEK: 'https://api.deepseek.com/v1',
+ 
+  // 智谱 (Zhipu)
+  ZHIPU: 'https://open.bigmodel.cn/api/paas/v4',
+  ZHIPU_CODING: 'https://open.bigmodel.cn/api/coding/paas/v4',
+ 
+  // Kimi (Moonshot)
+  KIMI: 'https://api.moonshot.cn/v1',
+  KIMI_CODING: 'https://api.kimi.com/coding/v1',
+ 
+  // 百炼 (Qwen/Bailian)
+  QWEN: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
+  QWEN_CODING: 'https://coding.dashscope.aliyuncs.com/v1',
+ 
+  // 火山引擎 (Volcengine/Doubao)
+  VOLCENGINE: 'https://ark.cn-beijing.volces.com/api/v3',
+ 
+  // Local/OLLama
+  OLLAMA: 'http://localhost:11434/v1',
+  LM_STUDIO: 'http://localhost:1234/v1',
+  VLLM: 'http://localhost:8000/v1',
+} as const;
+ 
+// === ZCLAW Gateway URLs ===
+ 
+/**
+ * ZCLAW Gateway default URLs
+ */
+export const GATEWAY_URLS = {
+  DEFAULT_HTTP: 'http://127.0.0.1:50051',
+  DEFAULT_WS: 'ws://127.0.0.1:50051/ws',
+  FALLBACK_HTTP: 'http://127.0.0.1:4200',
+  FALLBACK_WS: 'ws://127.0.0.1:4200/ws',
+} as const;
+ 
+// === Helper Functions ===
+ 
+/**
+ * Get provider URL by name
+ */
+export function getProviderUrl(provider: string): string {
+  const key = provider.toUpperCase().replace(/-/g, '_') as keyof typeof LLM_PROVIDER_URLS;
+  return LLM_PROVIDER_URLS[key] || LLM_PROVIDER_URLS.OPENAI;
+}
+ 
+/**
+ * Check if URL is a coding plan endpoint
+ */
+export function isCodingUrl(url: string): boolean {
+  return url.includes('/coding/') || url.includes('-coding');
+}
+ 
+/**
+ * Check if URL is a local endpoint
+ */
+export function isLocalUrl(url: string): boolean {
+  return url.includes('localhost') || url.includes('127.0.0.1') || url.includes('[::1]');
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/constants/hands.ts.html b/desktop/coverage/src/constants/hands.ts.html new file mode 100644 index 0000000..7f8b456 --- /dev/null +++ b/desktop/coverage/src/constants/hands.ts.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/constants/hands.ts + + + + + + + + + +
+
+

All files / src/constants hands.ts

+
+ +
+ 0% + Statements + 0/45 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hand ID Constants - Single Source of Truth
+ *
+ * All Hand-related constants should reference this file.
+ * Do NOT hardcode Hand IDs elsewhere.
+ */
+ 
+// === Hand IDs (must match backend zclaw-hands) ===
+ 
+export const HAND_IDS = {
+  BROWSER: 'browser',
+  RESEARCHER: 'researcher',
+  COLLECTOR: 'collector',
+  PREDICTOR: 'predictor',
+  LEAD: 'lead',
+  TRADER: 'trader',
+  CLIP: 'clip',
+  TWITTER: 'twitter',
+  // Additional hands from backend
+  SLIDESHOW: 'slideshow',
+  SPEECH: 'speech',
+  QUIZ: 'quiz',
+  WHITEBOARD: 'whiteboard',
+} as const;
+ 
+export type HandIdType = typeof HAND_IDS[keyof typeof HAND_IDS];
+ 
+// === Hand Categories ===
+ 
+export const HAND_CATEGORIES = {
+  RESEARCH: 'research',
+  DATA: 'data',
+  AUTOMATION: 'automation',
+  COMMUNICATION: 'communication',
+  CONTENT: 'content',
+  PRODUCTIVITY: 'productivity',
+} as const;
+ 
+export type HandCategoryType = typeof HAND_CATEGORIES[keyof typeof HAND_CATEGORIES];
+ 
+// === Hand ID to Category Mapping ===
+ 
+export const HAND_CATEGORY_MAP: Record<string, HandCategoryType> = {
+  [HAND_IDS.BROWSER]: HAND_CATEGORIES.RESEARCH,
+  [HAND_IDS.RESEARCHER]: HAND_CATEGORIES.RESEARCH,
+  [HAND_IDS.COLLECTOR]: HAND_CATEGORIES.DATA,
+  [HAND_IDS.PREDICTOR]: HAND_CATEGORIES.DATA,
+  [HAND_IDS.TRADER]: HAND_CATEGORIES.DATA,
+  [HAND_IDS.LEAD]: HAND_CATEGORIES.COMMUNICATION,
+  [HAND_IDS.TWITTER]: HAND_CATEGORIES.COMMUNICATION,
+  [HAND_IDS.CLIP]: HAND_CATEGORIES.CONTENT,
+  [HAND_IDS.SLIDESHOW]: HAND_CATEGORIES.CONTENT,
+  [HAND_IDS.SPEECH]: HAND_CATEGORIES.CONTENT,
+  [HAND_IDS.QUIZ]: HAND_CATEGORIES.PRODUCTIVITY,
+  [HAND_IDS.WHITEBOARD]: HAND_CATEGORIES.PRODUCTIVITY,
+};
+ 
+// === Helper Functions ===
+ 
+/**
+ * Get the category for a Hand ID
+ */
+export function getHandCategory(handId: string): HandCategoryType {
+  return HAND_CATEGORY_MAP[handId] || HAND_CATEGORIES.PRODUCTIVITY;
+}
+ 
+/**
+ * Check if a Hand ID is valid
+ */
+export function isValidHandId(id: string): id is HandIdType {
+  return Object.values(HAND_IDS).includes(id as HandIdType);
+}
+ 
+/**
+ * Get all Hand IDs as an array
+ */
+export function getAllHandIds(): string[] {
+  return Object.values(HAND_IDS);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/constants/index.html b/desktop/coverage/src/constants/index.html new file mode 100644 index 0000000..298aabf --- /dev/null +++ b/desktop/coverage/src/constants/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/constants + + + + + + + + + +
+
+

All files src/constants

+
+ +
+ 37.76% + Statements + 54/143 +
+ + +
+ 66.66% + Branches + 2/3 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 37.76% + Lines + 54/143 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
api-urls.ts +
+
0%0/32100%1/1100%1/10%0/32
hands.ts +
+
0%0/45100%1/1100%1/10%0/45
index.ts +
+
0%0/40%0/10%0/10%0/4
models.ts +
+
87.09%54/62100%0/00%0/287.09%54/62
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/constants/index.ts.html b/desktop/coverage/src/constants/index.ts.html new file mode 100644 index 0000000..4afef43 --- /dev/null +++ b/desktop/coverage/src/constants/index.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/constants/index.ts + + + + + + + + + +
+
+

All files / src/constants index.ts

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +  +  +  +  +  +  +  +  + 
/**
+ * Constants Index - Single Source of Truth
+ *
+ * Re-export all constants from a single entry point.
+ */
+ 
+export * from './hands';
+export * from './models';
+export * from './api-urls';
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/constants/models.ts.html b/desktop/coverage/src/constants/models.ts.html new file mode 100644 index 0000000..3670ab8 --- /dev/null +++ b/desktop/coverage/src/constants/models.ts.html @@ -0,0 +1,421 @@ + + + + + + Code coverage report for src/constants/models.ts + + + + + + + + + +
+
+

All files / src/constants models.ts

+
+ +
+ 87.09% + Statements + 54/62 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 87.09% + Lines + 54/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  + 
/**
+ * Model Default Constants - Single Source of Truth
+ *
+ * All model-related defaults should reference this file.
+ * Backend (Rust) should use the same values in kernel_commands.rs
+ */
+ 
+// === Default Model Configuration ===
+ 
+/**
+ * Default model ID when user hasn't configured one
+ * Using gpt-4o-mini as it's cost-effective and capable
+ */
+export const DEFAULT_MODEL_ID = 'gpt-4o-mini' as const;
+ 
+/**
+ * Default provider when user hasn't configured one
+ */
+export const DEFAULT_PROVIDER = 'openai' as const;
+ 
+/**
+ * Default max tokens for responses
+ */
+export const DEFAULT_MAX_TOKENS = 4096 as const;
+ 
+/**
+ * Default temperature for responses
+ */
+export const DEFAULT_TEMPERATURE = 0.7 as const;
+ 
+/**
+ * Default base URL for OpenAI API
+ */
+export const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1' as const;
+ 
+/**
+ * Default base URL for Anthropic API
+ */
+export const DEFAULT_ANTHROPIC_BASE_URL = 'https://api.anthropic.com' as const;
+ 
+// === Provider-Specific Defaults ===
+ 
+export const PROVIDER_DEFAULTS = {
+  openai: {
+    baseUrl: 'https://api.openai.com/v1',
+    defaultModel: 'gpt-4o-mini',
+  },
+  anthropic: {
+    baseUrl: 'https://api.anthropic.com',
+    defaultModel: 'claude-sonnet-4-20250514',
+  },
+  zhipu: {
+    baseUrl: 'https://open.bigmodel.cn/api/paas/v4',
+    defaultModel: 'glm-4-flash',
+  },
+  zhipu_coding: {
+    baseUrl: 'https://open.bigmodel.cn/api/coding/paas/v4',
+    defaultModel: 'glm-4-flash',
+  },
+  kimi: {
+    baseUrl: 'https://api.moonshot.cn/v1',
+    defaultModel: 'moonshot-v1-8k',
+  },
+  kimi_coding: {
+    baseUrl: 'https://api.kimi.com/coding/v1',
+    defaultModel: 'kimi-for-coding',
+  },
+  qwen: {
+    baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
+    defaultModel: 'qwen-turbo',
+  },
+  qwen_coding: {
+    baseUrl: 'https://coding.dashscope.aliyuncs.com/v1',
+    defaultModel: 'qwen3-coder-next',
+  },
+  deepseek: {
+    baseUrl: 'https://api.deepseek.com/v1',
+    defaultModel: 'deepseek-chat',
+  },
+  gemini: {
+    baseUrl: 'https://generativelanguage.googleapis.com/v1beta',
+    defaultModel: 'gemini-2.0-flash',
+  },
+  local: {
+    baseUrl: 'http://localhost:11434/v1',
+    defaultModel: 'llama3',
+  },
+} as const;
+ 
+export type ProviderType = keyof typeof PROVIDER_DEFAULTS;
+ 
+// === Helper Functions ===
+ 
+/**
+ * Get provider default configuration
+ */
+export function getProviderDefaults(provider: string): {
+  baseUrl: string;
+  defaultModel: string;
+} {
+  return PROVIDER_DEFAULTS[provider as ProviderType] || {
+    baseUrl: DEFAULT_OPENAI_BASE_URL,
+    defaultModel: DEFAULT_MODEL_ID,
+  };
+}
+ 
+/**
+ * Check if a provider is a coding plan provider
+ */
+export function isCodingProvider(provider: string): boolean {
+  return provider.endsWith('-coding') || provider === 'zhipu-coding';
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/chat/hooks.ts.html b/desktop/coverage/src/domains/chat/hooks.ts.html new file mode 100644 index 0000000..be4eea8 --- /dev/null +++ b/desktop/coverage/src/domains/chat/hooks.ts.html @@ -0,0 +1,313 @@ + + + + + + Code coverage report for src/domains/chat/hooks.ts + + + + + + + + + +
+
+

All files / src/domains/chat hooks.ts

+
+ +
+ 0% + Statements + 0/31 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Chat Domain Hooks
+ *
+ * React hooks for accessing chat state with Valtio.
+ * Only re-renders when accessed properties change.
+ */
+import { useSnapshot } from 'valtio';
+import { chatStore } from './store';
+import type { Message, Agent, Conversation } from './types';
+ 
+/**
+ * Hook to access the full chat state snapshot.
+ * Only re-renders when accessed properties change.
+ */
+export function useChatState() {
+  return useSnapshot(chatStore);
+}
+ 
+/**
+ * Hook to access messages only.
+ * Only re-renders when messages change.
+ */
+export function useMessages() {
+  const { messages } = useSnapshot(chatStore);
+  return messages as readonly Message[];
+}
+ 
+/**
+ * Hook to access streaming state.
+ * Only re-renders when isStreaming changes.
+ */
+export function useIsStreaming(): boolean {
+  const { isStreaming } = useSnapshot(chatStore);
+  return isStreaming;
+}
+ 
+/**
+ * Hook to access current agent.
+ */
+export function useCurrentAgent(): Agent | null {
+  const { currentAgent } = useSnapshot(chatStore);
+  return currentAgent;
+}
+ 
+/**
+ * Hook to access all agents.
+ */
+export function useAgents() {
+  const { agents } = useSnapshot(chatStore);
+  return agents as readonly Agent[];
+}
+ 
+/**
+ * Hook to access conversations.
+ */
+export function useConversations() {
+  const { conversations } = useSnapshot(chatStore);
+  return conversations as readonly Conversation[];
+}
+ 
+/**
+ * Hook to access current model.
+ */
+export function useCurrentModel(): string {
+  const { currentModel } = useSnapshot(chatStore);
+  return currentModel;
+}
+ 
+/**
+ * Hook to access chat actions.
+ * Returns the store directly for calling actions.
+ * Does not cause re-renders.
+ */
+export function useChatActions() {
+  return chatStore;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/chat/index.html b/desktop/coverage/src/domains/chat/index.html new file mode 100644 index 0000000..dd993c6 --- /dev/null +++ b/desktop/coverage/src/domains/chat/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/domains/chat + + + + + + + + + +
+
+

All files src/domains/chat

+
+ +
+ 0% + Statements + 0/177 +
+ + +
+ 25% + Branches + 1/4 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 0% + Lines + 0/177 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
hooks.ts +
+
0%0/310%0/10%0/10%0/31
index.ts +
+
0%0/10%0/10%0/10%0/1
store.ts +
+
0%0/1450%0/10%0/10%0/145
types.ts +
+
0%0/00%1/10%1/10%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/chat/index.ts.html b/desktop/coverage/src/domains/chat/index.ts.html new file mode 100644 index 0000000..bb463ec --- /dev/null +++ b/desktop/coverage/src/domains/chat/index.ts.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/domains/chat/index.ts + + + + + + + + + +
+
+

All files / src/domains/chat index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Chat Domain
+ *
+ * Core chat functionality including messaging, conversations, and agents.
+ *
+ * @example
+ * // Using hooks (recommended)
+ * import { useMessages, useChatActions } from '@/domains/chat';
+ *
+ * function ChatComponent() {
+ *   const messages = useMessages();
+ *   const { addMessage } = useChatActions();
+ *   // ...
+ * }
+ *
+ * @example
+ * // Using store directly (for actions)
+ * import { chatStore } from '@/domains/chat';
+ *
+ * chatStore.addMessage({ id: '1', role: 'user', content: 'Hello', timestamp: new Date() });
+ */
+ 
+// Types
+export type {
+  Message,
+  MessageFile,
+  CodeBlock,
+  Conversation,
+  Agent,
+  AgentProfileLike,
+  ChatState,
+} from './types';
+ 
+// Store
+export { chatStore, toChatAgent } from './store';
+export type { ChatStore } from './store';
+ 
+// Hooks
+export {
+  useChatState,
+  useMessages,
+  useIsStreaming,
+  useCurrentAgent,
+  useAgents,
+  useConversations,
+  useCurrentModel,
+  useChatActions,
+} from './hooks';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/chat/store.ts.html b/desktop/coverage/src/domains/chat/store.ts.html new file mode 100644 index 0000000..a637b86 --- /dev/null +++ b/desktop/coverage/src/domains/chat/store.ts.html @@ -0,0 +1,751 @@ + + + + + + Code coverage report for src/domains/chat/store.ts + + + + + + + + + +
+
+

All files / src/domains/chat store.ts

+
+ +
+ 0% + Statements + 0/145 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/145 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Chat Domain Store
+ *
+ * Valtio-based state management for chat.
+ * Replaces Zustand for better performance with fine-grained reactivity.
+ */
+import { proxy, subscribe } from 'valtio';
+import type { Message, Conversation, Agent, AgentProfileLike } from './types';
+ 
+// === Constants ===
+ 
+const DEFAULT_AGENT: Agent = {
+  id: '1',
+  name: 'ZCLAW',
+  icon: '🦞',
+  color: 'bg-gradient-to-br from-orange-500 to-red-500',
+  lastMessage: '发送消息开始对话',
+  time: '',
+};
+ 
+// === Helper Functions ===
+ 
+function generateConvId(): string {
+  return `conv_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
+}
+ 
+function deriveTitle(messages: Message[]): string {
+  const firstUser = messages.find(m => m.role === 'user');
+  if (firstUser) {
+    const text = firstUser.content.trim();
+    return text.length > 30 ? text.slice(0, 30) + '...' : text;
+  }
+  return '新对话';
+}
+ 
+export function toChatAgent(profile: AgentProfileLike): Agent {
+  return {
+    id: profile.id,
+    name: profile.name,
+    icon: profile.nickname?.slice(0, 1) || profile.name.slice(0, 1) || '🦞',
+    color: 'bg-gradient-to-br from-orange-500 to-red-500',
+    lastMessage: profile.role || '新分身',
+    time: '',
+  };
+}
+ 
+// === Store Interface ===
+ 
+export interface ChatStore {
+  // State
+  messages: Message[];
+  conversations: Conversation[];
+  currentConversationId: string | null;
+  agents: Agent[];
+  currentAgent: Agent | null;
+  isStreaming: boolean;
+  currentModel: string;
+  sessionKey: string | null;
+ 
+  // Actions
+  addMessage: (message: Message) => void;
+  updateMessage: (id: string, updates: Partial<Message>) => void;
+  deleteMessage: (id: string) => void;
+  setCurrentAgent: (agent: Agent) => void;
+  syncAgents: (profiles: AgentProfileLike[]) => void;
+  setCurrentModel: (model: string) => void;
+  setStreaming: (streaming: boolean) => void;
+  setSessionKey: (key: string | null) => void;
+  newConversation: () => void;
+  switchConversation: (id: string) => void;
+  deleteConversation: (id: string) => void;
+  clearMessages: () => void;
+}
+ 
+// === Create Proxy State ===
+ 
+export const chatStore = proxy<ChatStore>({
+  // Initial state
+  messages: [],
+  conversations: [],
+  currentConversationId: null,
+  agents: [DEFAULT_AGENT],
+  currentAgent: DEFAULT_AGENT,
+  isStreaming: false,
+  currentModel: 'glm-4-flash',
+  sessionKey: null,
+ 
+  // === Actions ===
+ 
+  addMessage: (message: Message) => {
+    chatStore.messages.push(message);
+  },
+ 
+  updateMessage: (id: string, updates: Partial<Message>) => {
+    const msg = chatStore.messages.find(m => m.id === id);
+    if (msg) {
+      Object.assign(msg, updates);
+    }
+  },
+ 
+  deleteMessage: (id: string) => {
+    const index = chatStore.messages.findIndex(m => m.id === id);
+    if (index >= 0) {
+      chatStore.messages.splice(index, 1);
+    }
+  },
+ 
+  setCurrentAgent: (agent: Agent) => {
+    chatStore.currentAgent = agent;
+  },
+ 
+  syncAgents: (profiles: AgentProfileLike[]) => {
+    if (profiles.length === 0) {
+      chatStore.agents = [DEFAULT_AGENT];
+    } else {
+      chatStore.agents = profiles.map(toChatAgent);
+    }
+  },
+ 
+  setCurrentModel: (model: string) => {
+    chatStore.currentModel = model;
+  },
+ 
+  setStreaming: (streaming: boolean) => {
+    chatStore.isStreaming = streaming;
+  },
+ 
+  setSessionKey: (key: string | null) => {
+    chatStore.sessionKey = key;
+  },
+ 
+  newConversation: () => {
+    // Save current conversation if has messages
+    if (chatStore.messages.length > 0) {
+      const conversation: Conversation = {
+        id: chatStore.currentConversationId || generateConvId(),
+        title: deriveTitle(chatStore.messages),
+        messages: [...chatStore.messages],
+        sessionKey: chatStore.sessionKey,
+        agentId: chatStore.currentAgent?.id || null,
+        createdAt: new Date(),
+        updatedAt: new Date(),
+      };
+ 
+      // Check if conversation already exists
+      const existingIndex = chatStore.conversations.findIndex(
+        c => c.id === chatStore.currentConversationId
+      );
+ 
+      if (existingIndex >= 0) {
+        chatStore.conversations[existingIndex] = conversation;
+      } else {
+        chatStore.conversations.unshift(conversation);
+      }
+    }
+ 
+    // Reset for new conversation
+    chatStore.messages = [];
+    chatStore.sessionKey = null;
+    chatStore.isStreaming = false;
+    chatStore.currentConversationId = null;
+  },
+ 
+  switchConversation: (id: string) => {
+    const conv = chatStore.conversations.find(c => c.id === id);
+    if (conv) {
+      // Save current first
+      if (chatStore.messages.length > 0) {
+        const currentConv: Conversation = {
+          id: chatStore.currentConversationId || generateConvId(),
+          title: deriveTitle(chatStore.messages),
+          messages: [...chatStore.messages],
+          sessionKey: chatStore.sessionKey,
+          agentId: chatStore.currentAgent?.id || null,
+          createdAt: new Date(),
+          updatedAt: new Date(),
+        };
+ 
+        const existingIndex = chatStore.conversations.findIndex(
+          c => c.id === chatStore.currentConversationId
+        );
+ 
+        if (existingIndex >= 0) {
+          chatStore.conversations[existingIndex] = currentConv;
+        } else {
+          chatStore.conversations.unshift(currentConv);
+        }
+      }
+ 
+      // Switch to new
+      chatStore.messages = [...conv.messages];
+      chatStore.sessionKey = conv.sessionKey;
+      chatStore.currentConversationId = conv.id;
+    }
+  },
+ 
+  deleteConversation: (id: string) => {
+    const index = chatStore.conversations.findIndex(c => c.id === id);
+    if (index >= 0) {
+      chatStore.conversations.splice(index, 1);
+ 
+      // If deleting current, clear messages
+      if (chatStore.currentConversationId === id) {
+        chatStore.messages = [];
+        chatStore.sessionKey = null;
+        chatStore.currentConversationId = null;
+      }
+    }
+  },
+ 
+  clearMessages: () => {
+    chatStore.messages = [];
+  },
+});
+ 
+// === Dev Mode Logging ===
+ 
+if (import.meta.env.DEV) {
+  subscribe(chatStore, (ops) => {
+    console.log('[ChatStore] Changes:', ops);
+  });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/chat/types.ts.html b/desktop/coverage/src/domains/chat/types.ts.html new file mode 100644 index 0000000..2f00a13 --- /dev/null +++ b/desktop/coverage/src/domains/chat/types.ts.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for src/domains/chat/types.ts + + + + + + + + + +
+
+

All files / src/domains/chat types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Chat Domain Types
+ *
+ * Core types for the chat system.
+ * Extracted from chatStore.ts for domain-driven organization.
+ */
+ 
+export interface MessageFile {
+  name: string;
+  path?: string;
+  size?: number;
+  type?: string;
+}
+ 
+export interface CodeBlock {
+  language?: string;
+  filename?: string;
+  content?: string;
+}
+ 
+export interface Message {
+  id: string;
+  role: 'user' | 'assistant' | 'tool' | 'hand' | 'workflow';
+  content: string;
+  timestamp: Date;
+  runId?: string;
+  streaming?: boolean;
+  toolName?: string;
+  toolInput?: string;
+  toolOutput?: string;
+  error?: string;
+  // Hand event fields
+  handName?: string;
+  handStatus?: string;
+  handResult?: unknown;
+  // Workflow event fields
+  workflowId?: string;
+  workflowStep?: string;
+  workflowStatus?: string;
+  workflowResult?: unknown;
+  // Output files and code blocks
+  files?: MessageFile[];
+  codeBlocks?: CodeBlock[];
+}
+ 
+export interface Conversation {
+  id: string;
+  title: string;
+  messages: Message[];
+  sessionKey: string | null;
+  agentId: string | null;
+  createdAt: Date;
+  updatedAt: Date;
+}
+ 
+export interface Agent {
+  id: string;
+  name: string;
+  icon: string;
+  color: string;
+  lastMessage: string;
+  time: string;
+}
+ 
+export interface AgentProfileLike {
+  id: string;
+  name: string;
+  nickname?: string;
+  role?: string;
+}
+ 
+export interface ChatState {
+  messages: Message[];
+  conversations: Conversation[];
+  currentConversationId: string | null;
+  agents: Agent[];
+  currentAgent: Agent | null;
+  isStreaming: boolean;
+  currentModel: string;
+  sessionKey: string | null;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/hands/hooks.ts.html b/desktop/coverage/src/domains/hands/hooks.ts.html new file mode 100644 index 0000000..b0ca039 --- /dev/null +++ b/desktop/coverage/src/domains/hands/hooks.ts.html @@ -0,0 +1,322 @@ + + + + + + Code coverage report for src/domains/hands/hooks.ts + + + + + + + + + +
+
+

All files / src/domains/hands hooks.ts

+
+ +
+ 0% + Statements + 0/35 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hands Domain Hooks
+ *
+ * React hooks for accessing hands state with Valtio.
+ */
+import { useSnapshot } from 'valtio';
+import { handsStore } from './store';
+import type { Hand, ApprovalRequest, Trigger, HandRun } from './types';
+ 
+/**
+ * Hook to access the full hands state snapshot.
+ */
+export function useHandsState() {
+  return useSnapshot(handsStore);
+}
+ 
+/**
+ * Hook to access hands list.
+ */
+export function useHands() {
+  const { hands } = useSnapshot(handsStore);
+  return hands as readonly Hand[];
+}
+ 
+/**
+ * Hook to access a specific hand by ID.
+ */
+export function useHand(id: string) {
+  const { hands } = useSnapshot(handsStore);
+  return hands.find(h => h.id === id) as Hand | undefined;
+}
+ 
+/**
+ * Hook to access approval queue.
+ */
+export function useApprovalQueue() {
+  const { approvalQueue } = useSnapshot(handsStore);
+  return approvalQueue as readonly ApprovalRequest[];
+}
+ 
+/**
+ * Hook to access triggers.
+ */
+export function useTriggers() {
+  const { triggers } = useSnapshot(handsStore);
+  return triggers as readonly Trigger[];
+}
+ 
+/**
+ * Hook to access a specific run.
+ */
+export function useRun(runId: string) {
+  const { runs } = useSnapshot(handsStore);
+  return runs[runId] as HandRun | undefined;
+}
+ 
+/**
+ * Hook to check if any hand is loading.
+ */
+export function useHandsLoading(): boolean {
+  const { isLoading } = useSnapshot(handsStore);
+  return isLoading;
+}
+ 
+/**
+ * Hook to access hands error.
+ */
+export function useHandsError(): string | null {
+  const { error } = useSnapshot(handsStore);
+  return error;
+}
+ 
+/**
+ * Hook to access hands actions.
+ * Returns the store directly for calling actions.
+ */
+export function useHandsActions() {
+  return handsStore;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/hands/index.html b/desktop/coverage/src/domains/hands/index.html new file mode 100644 index 0000000..b168f9f --- /dev/null +++ b/desktop/coverage/src/domains/hands/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/domains/hands + + + + + + + + + +
+
+

All files src/domains/hands

+
+ +
+ 0% + Statements + 0/250 +
+ + +
+ 20% + Branches + 1/5 +
+ + +
+ 20% + Functions + 1/5 +
+ + +
+ 0% + Lines + 0/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
hooks.ts +
+
0%0/350%0/10%0/10%0/35
index.ts +
+
0%0/10%0/10%0/10%0/1
machine.ts +
+
0%0/1530%0/10%0/10%0/153
store.ts +
+
0%0/610%0/10%0/10%0/61
types.ts +
+
0%0/00%1/10%1/10%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/hands/index.ts.html b/desktop/coverage/src/domains/hands/index.ts.html new file mode 100644 index 0000000..d12ce14 --- /dev/null +++ b/desktop/coverage/src/domains/hands/index.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/domains/hands/index.ts + + + + + + + + + +
+
+

All files / src/domains/hands index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hands Domain
+ *
+ * Automation and hands management functionality.
+ *
+ * @example
+ * // Using hooks
+ * import { useHands, useHandsActions } from '@/domains/hands';
+ *
+ * function HandsComponent() {
+ *   const hands = useHands();
+ *   const { setHands, updateHand } = useHandsActions();
+ *   // ...
+ * }
+ */
+ 
+// Types
+export type {
+  Hand,
+  HandStatus,
+  HandRequirement,
+  HandRun,
+  HandLog,
+  Trigger,
+  TriggerType,
+  TriggerConfig,
+  ApprovalRequest,
+  HandsState,
+  HandsEvent,
+  HandContext,
+} from './types';
+ 
+// Machine
+export { handMachine, getHandStatusFromState } from './machine';
+ 
+// Store
+export { handsStore } from './store';
+export type { HandsStore } from './store';
+ 
+// Hooks
+export {
+  useHandsState,
+  useHands,
+  useHand,
+  useApprovalQueue,
+  useTriggers,
+  useRun,
+  useHandsLoading,
+  useHandsError,
+  useHandsActions,
+} from './hooks';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/hands/machine.ts.html b/desktop/coverage/src/domains/hands/machine.ts.html new file mode 100644 index 0000000..2e74d92 --- /dev/null +++ b/desktop/coverage/src/domains/hands/machine.ts.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/domains/hands/machine.ts + + + + + + + + + +
+
+

All files / src/domains/hands machine.ts

+
+ +
+ 0% + Statements + 0/153 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/153 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hands State Machine
+ *
+ * XState machine for managing hand execution lifecycle.
+ * Provides predictable state transitions for automation tasks.
+ */
+import { setup, assign } from 'xstate';
+import type { HandContext, HandsEvent } from './types';
+ 
+// === Machine Setup ===
+ 
+export const handMachine = setup({
+  types: {
+    context: {} as HandContext,
+    events: {} as HandsEvent,
+  },
+  actions: {
+    setRunId: assign({
+      runId: (_, params: { runId: string }) => params.runId,
+    }),
+    setError: assign({
+      error: (_, params: { error: string }) => params.error,
+    }),
+    setResult: assign({
+      result: (_, params: { result: unknown }) => params.result,
+    }),
+    setProgress: assign({
+      progress: (_, params: { progress: number }) => params.progress,
+    }),
+    clearError: assign({
+      error: null,
+    }),
+    resetContext: assign({
+      runId: null,
+      error: null,
+      result: null,
+      progress: 0,
+    }),
+  },
+  guards: {
+    hasError: ({ context }) => context.error !== null,
+    isApproved: ({ event }) => event.type === 'APPROVE',
+  },
+}).createMachine({
+  id: 'hand',
+  initial: 'idle',
+  context: {
+    handId: '',
+    handName: '',
+    runId: null,
+    error: null,
+    result: null,
+    progress: 0,
+  },
+  states: {
+    idle: {
+      on: {
+        START: {
+          target: 'running',
+          actions: {
+            type: 'setRunId',
+            params: () => ({ runId: `run_${Date.now()}` }),
+          },
+        },
+      },
+    },
+    running: {
+      entry: assign({ progress: 0 }),
+      on: {
+        APPROVE: {
+          target: 'needs_approval',
+        },
+        COMPLETE: {
+          target: 'success',
+          actions: {
+            type: 'setResult',
+            params: ({ event }) => ({ result: (event as { result: unknown }).result }),
+          },
+        },
+        ERROR: {
+          target: 'error',
+          actions: {
+            type: 'setError',
+            params: ({ event }) => ({ error: (event as { error: string }).error }),
+          },
+        },
+        CANCEL: {
+          target: 'cancelled',
+        },
+      },
+    },
+    needs_approval: {
+      on: {
+        APPROVE: 'running',
+        REJECT: 'idle',
+        CANCEL: 'idle',
+      },
+    },
+    success: {
+      on: {
+        RESET: {
+          target: 'idle',
+          actions: 'resetContext',
+        },
+        START: {
+          target: 'running',
+          actions: {
+            type: 'setRunId',
+            params: () => ({ runId: `run_${Date.now()}` }),
+          },
+        },
+      },
+    },
+    error: {
+      on: {
+        RESET: {
+          target: 'idle',
+          actions: 'resetContext',
+        },
+        START: {
+          target: 'running',
+          actions: {
+            type: 'setRunId',
+            params: () => ({ runId: `run_${Date.now()}` }),
+          },
+        },
+      },
+    },
+    cancelled: {
+      on: {
+        RESET: {
+          target: 'idle',
+          actions: 'resetContext',
+        },
+        START: {
+          target: 'running',
+          actions: {
+            type: 'setRunId',
+            params: () => ({ runId: `run_${Date.now()}` }),
+          },
+        },
+      },
+    },
+  },
+});
+ 
+// === Helper to get status from machine state ===
+ 
+export function getHandStatusFromState(stateValue: string): import('./types').HandStatus {
+  switch (stateValue) {
+    case 'idle':
+      return 'idle';
+    case 'running':
+      return 'running';
+    case 'needs_approval':
+      return 'needs_approval';
+    case 'success':
+      return 'idle'; // Success maps back to idle
+    case 'error':
+      return 'error';
+    case 'cancelled':
+      return 'idle';
+    default:
+      return 'idle';
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/hands/store.ts.html b/desktop/coverage/src/domains/hands/store.ts.html new file mode 100644 index 0000000..d173226 --- /dev/null +++ b/desktop/coverage/src/domains/hands/store.ts.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for src/domains/hands/store.ts + + + + + + + + + +
+
+

All files / src/domains/hands store.ts

+
+ +
+ 0% + Statements + 0/61 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hands Domain Store
+ *
+ * Valtio-based state management for hands/automation.
+ */
+import { proxy, subscribe } from 'valtio';
+import type { Hand, HandRun, Trigger, ApprovalRequest, HandsState } from './types';
+ 
+// === Store Interface ===
+ 
+export interface HandsStore extends HandsState {
+  // Actions
+  setHands: (hands: Hand[]) => void;
+  updateHand: (id: string, updates: Partial<Hand>) => void;
+  addRun: (run: HandRun) => void;
+  updateRun: (runId: string, updates: Partial<HandRun>) => void;
+  setTriggers: (triggers: Trigger[]) => void;
+  updateTrigger: (id: string, updates: Partial<Trigger>) => void;
+  addApproval: (request: ApprovalRequest) => void;
+  removeApproval: (id: string) => void;
+  clearApprovals: () => void;
+  setLoading: (loading: boolean) => void;
+  setError: (error: string | null) => void;
+}
+ 
+// === Create Proxy State ===
+ 
+export const handsStore = proxy<HandsStore>({
+  // Initial state
+  hands: [],
+  runs: {},
+  triggers: [],
+  approvalQueue: [],
+  isLoading: false,
+  error: null,
+ 
+  // === Actions ===
+ 
+  setHands: (hands: Hand[]) => {
+    handsStore.hands = hands;
+  },
+ 
+  updateHand: (id: string, updates: Partial<Hand>) => {
+    const hand = handsStore.hands.find(h => h.id === id);
+    if (hand) {
+      Object.assign(hand, updates);
+    }
+  },
+ 
+  addRun: (run: HandRun) => {
+    handsStore.runs[run.runId] = run;
+  },
+ 
+  updateRun: (runId: string, updates: Partial<HandRun>) => {
+    if (handsStore.runs[runId]) {
+      Object.assign(handsStore.runs[runId], updates);
+    }
+  },
+ 
+  setTriggers: (triggers: Trigger[]) => {
+    handsStore.triggers = triggers;
+  },
+ 
+  updateTrigger: (id: string, updates: Partial<Trigger>) => {
+    const trigger = handsStore.triggers.find(t => t.id === id);
+    if (trigger) {
+      Object.assign(trigger, updates);
+    }
+  },
+ 
+  addApproval: (request: ApprovalRequest) => {
+    // Check if already exists
+    const exists = handsStore.approvalQueue.some(a => a.id === request.id);
+    if (!exists) {
+      handsStore.approvalQueue.push(request);
+    }
+  },
+ 
+  removeApproval: (id: string) => {
+    const index = handsStore.approvalQueue.findIndex(a => a.id === id);
+    if (index >= 0) {
+      handsStore.approvalQueue.splice(index, 1);
+    }
+  },
+ 
+  clearApprovals: () => {
+    handsStore.approvalQueue = [];
+  },
+ 
+  setLoading: (loading: boolean) => {
+    handsStore.isLoading = loading;
+  },
+ 
+  setError: (error: string | null) => {
+    handsStore.error = error;
+  },
+});
+ 
+// === Dev Mode Logging ===
+ 
+if (import.meta.env.DEV) {
+  subscribe(handsStore, (ops) => {
+    console.log('[HandsStore] Changes:', ops);
+  });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/hands/types.ts.html b/desktop/coverage/src/domains/hands/types.ts.html new file mode 100644 index 0000000..b7417eb --- /dev/null +++ b/desktop/coverage/src/domains/hands/types.ts.html @@ -0,0 +1,454 @@ + + + + + + Code coverage report for src/domains/hands/types.ts + + + + + + + + + +
+
+

All files / src/domains/hands types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hands Domain Types
+ *
+ * Core types for the automation/hands system.
+ */
+ 
+export interface HandRequirement {
+  description: string;
+  met: boolean;
+  details?: string;
+}
+ 
+export interface Hand {
+  id: string;
+  name: string;
+  description: string;
+  status: HandStatus;
+  currentRunId?: string;
+  requirements_met?: boolean;
+  category?: string;
+  icon?: string;
+  provider?: string;
+  model?: string;
+  requirements?: HandRequirement[];
+  tools?: string[];
+  metrics?: string[];
+  toolCount?: number;
+  metricCount?: number;
+}
+ 
+export type HandStatus =
+  | 'idle'
+  | 'running'
+  | 'needs_approval'
+  | 'error'
+  | 'unavailable'
+  | 'setup_needed';
+ 
+export interface HandRun {
+  runId: string;
+  handId: string;
+  handName: string;
+  status: 'running' | 'completed' | 'error' | 'cancelled';
+  startedAt: Date;
+  completedAt?: Date;
+  result?: unknown;
+  error?: string;
+  progress?: number;
+  logs?: HandLog[];
+}
+ 
+export interface HandLog {
+  timestamp: Date;
+  level: 'info' | 'warn' | 'error' | 'debug';
+  message: string;
+}
+ 
+export interface Trigger {
+  id: string;
+  handId: string;
+  type: TriggerType;
+  enabled: boolean;
+  config: TriggerConfig;
+}
+ 
+export type TriggerType = 'manual' | 'schedule' | 'event' | 'webhook';
+ 
+export interface TriggerConfig {
+  schedule?: string; // Cron expression
+  event?: string; // Event name
+  webhook?: {
+    path: string;
+    method: 'GET' | 'POST';
+  };
+}
+ 
+export interface ApprovalRequest {
+  id: string;
+  handName: string;
+  runId: string;
+  action: string;
+  params: Record<string, unknown>;
+  createdAt: Date;
+  timeout?: number;
+}
+ 
+export interface HandsState {
+  hands: Hand[];
+  runs: Record<string, HandRun>;
+  triggers: Trigger[];
+  approvalQueue: ApprovalRequest[];
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+// === XState Types ===
+ 
+export type HandsEventType =
+  | 'START'
+  | 'APPROVE'
+  | 'REJECT'
+  | 'COMPLETE'
+  | 'ERROR'
+  | 'RESET'
+  | 'CANCEL';
+ 
+export interface HandsEvent {
+  type: HandsEventType;
+  handId?: string;
+  runId?: string;
+  requestId?: string;
+  result?: unknown;
+  error?: string;
+}
+ 
+export interface HandContext {
+  handId: string;
+  handName: string;
+  runId: string | null;
+  error: string | null;
+  result: unknown;
+  progress: number;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/intelligence/cache.ts.html b/desktop/coverage/src/domains/intelligence/cache.ts.html new file mode 100644 index 0000000..8db8ee9 --- /dev/null +++ b/desktop/coverage/src/domains/intelligence/cache.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for src/domains/intelligence/cache.ts + + + + + + + + + +
+
+

All files / src/domains/intelligence cache.ts

+
+ +
+ 0% + Statements + 0/119 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Domain Cache
+ *
+ * LRU cache with TTL support for intelligence operations.
+ * Reduces redundant API calls and improves responsiveness.
+ */
+ 
+import type { CacheEntry, CacheStats } from './types';
+ 
+/**
+ * Simple LRU cache with TTL support
+ */
+export class IntelligenceCache {
+  private cache = new Map<string, CacheEntry<unknown>>();
+  private accessOrder: string[] = [];
+  private maxSize: number;
+  private defaultTTL: number;
+ 
+  // Stats tracking
+  private hits = 0;
+  private misses = 0;
+ 
+  constructor(options?: { maxSize?: number; defaultTTL?: number }) {
+    this.maxSize = options?.maxSize ?? 100;
+    this.defaultTTL = options?.defaultTTL ?? 5 * 60 * 1000; // 5 minutes default
+  }
+ 
+  /**
+   * Get a value from cache
+   */
+  get<T>(key: string): T | null {
+    const entry = this.cache.get(key) as CacheEntry<T> | undefined;
+ 
+    if (!entry) {
+      this.misses++;
+      return null;
+    }
+ 
+    // Check TTL
+    if (Date.now() > entry.timestamp + entry.ttl) {
+      this.cache.delete(key);
+      this.accessOrder = this.accessOrder.filter(k => k !== key);
+      this.misses++;
+      return null;
+    }
+ 
+    // Update access order (move to end = most recently used)
+    this.accessOrder = this.accessOrder.filter(k => k !== key);
+    this.accessOrder.push(key);
+ 
+    this.hits++;
+    return entry.data;
+  }
+ 
+  /**
+   * Set a value in cache
+   */
+  set<T>(key: string, data: T, ttl?: number): void {
+    // Remove if exists (to update access order)
+    if (this.cache.has(key)) {
+      this.accessOrder = this.accessOrder.filter(k => k !== key);
+    }
+ 
+    // Evict oldest if at capacity
+    while (this.cache.size >= this.maxSize && this.accessOrder.length > 0) {
+      const oldestKey = this.accessOrder.shift();
+      if (oldestKey) {
+        this.cache.delete(oldestKey);
+      }
+    }
+ 
+    this.cache.set(key, {
+      data,
+      timestamp: Date.now(),
+      ttl: ttl ?? this.defaultTTL,
+    });
+    this.accessOrder.push(key);
+  }
+ 
+  /**
+   * Check if key exists and is not expired
+   */
+  has(key: string): boolean {
+    const entry = this.cache.get(key);
+    if (!entry) return false;
+ 
+    if (Date.now() > entry.timestamp + entry.ttl) {
+      this.cache.delete(key);
+      this.accessOrder = this.accessOrder.filter(k => k !== key);
+      return false;
+    }
+ 
+    return true;
+  }
+ 
+  /**
+   * Delete a specific key
+   */
+  delete(key: string): boolean {
+    if (this.cache.has(key)) {
+      this.cache.delete(key);
+      this.accessOrder = this.accessOrder.filter(k => k !== key);
+      return true;
+    }
+    return false;
+  }
+ 
+  /**
+   * Clear all cache entries
+   */
+  clear(): void {
+    this.cache.clear();
+    this.accessOrder = [];
+    // Don't reset hits/misses to maintain historical stats
+  }
+ 
+  /**
+   * Get cache statistics
+   */
+  getStats(): CacheStats {
+    const total = this.hits + this.misses;
+    return {
+      entries: this.cache.size,
+      hits: this.hits,
+      misses: this.misses,
+      hitRate: total > 0 ? this.hits / total : 0,
+    };
+  }
+ 
+  /**
+   * Reset statistics
+   */
+  resetStats(): void {
+    this.hits = 0;
+    this.misses = 0;
+  }
+ 
+  /**
+   * Get all keys (for debugging)
+   */
+  keys(): string[] {
+    return Array.from(this.cache.keys());
+  }
+ 
+  /**
+   * Get cache size
+   */
+  get size(): number {
+    return this.cache.size;
+  }
+}
+ 
+// === Cache Key Generators ===
+ 
+/**
+ * Generate cache key for memory search
+ */
+export function memorySearchKey(options: Record<string, unknown>): string {
+  const sorted = Object.entries(options)
+    .filter(([, v]) => v !== undefined)
+    .sort(([a], [b]) => a.localeCompare(b))
+    .map(([k, v]) => `${k}=${JSON.stringify(v)}`)
+    .join('&');
+  return `memory:search:${sorted}`;
+}
+ 
+/**
+ * Generate cache key for identity
+ */
+export function identityKey(agentId: string): string {
+  return `identity:${agentId}`;
+}
+ 
+/**
+ * Generate cache key for heartbeat config
+ */
+export function heartbeatConfigKey(agentId: string): string {
+  return `heartbeat:config:${agentId}`;
+}
+ 
+/**
+ * Generate cache key for reflection state
+ */
+export function reflectionStateKey(): string {
+  return 'reflection:state';
+}
+ 
+// === Singleton Instance ===
+ 
+let cacheInstance: IntelligenceCache | null = null;
+ 
+/**
+ * Get the global cache instance
+ */
+export function getIntelligenceCache(): IntelligenceCache {
+  if (!cacheInstance) {
+    cacheInstance = new IntelligenceCache({
+      maxSize: 200,
+      defaultTTL: 5 * 60 * 1000, // 5 minutes
+    });
+  }
+  return cacheInstance;
+}
+ 
+/**
+ * Clear the global cache instance
+ */
+export function clearIntelligenceCache(): void {
+  if (cacheInstance) {
+    cacheInstance.clear();
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/intelligence/hooks.ts.html b/desktop/coverage/src/domains/intelligence/hooks.ts.html new file mode 100644 index 0000000..b496304 --- /dev/null +++ b/desktop/coverage/src/domains/intelligence/hooks.ts.html @@ -0,0 +1,844 @@ + + + + + + Code coverage report for src/domains/intelligence/hooks.ts + + + + + + + + + +
+
+

All files / src/domains/intelligence hooks.ts

+
+ +
+ 0% + Statements + 0/134 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/134 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Domain Hooks
+ *
+ * React hooks for accessing intelligence state with Valtio.
+ * Provides reactive access to memory, heartbeat, reflection, and identity.
+ */
+import { useSnapshot } from 'valtio';
+import { intelligenceStore } from './store';
+import type { MemoryEntry, CacheStats } from './types';
+ 
+// === Memory Hooks ===
+ 
+/**
+ * Hook to access memories list
+ */
+export function useMemories() {
+  const { memories } = useSnapshot(intelligenceStore);
+  return memories as readonly MemoryEntry[];
+}
+ 
+/**
+ * Hook to access memory stats
+ */
+export function useMemoryStats() {
+  const { memoryStats } = useSnapshot(intelligenceStore);
+  return memoryStats;
+}
+ 
+/**
+ * Hook to check if memories are loading
+ */
+export function useMemoryLoading(): boolean {
+  const { isMemoryLoading } = useSnapshot(intelligenceStore);
+  return isMemoryLoading;
+}
+ 
+// === Heartbeat Hooks ===
+ 
+/**
+ * Hook to access heartbeat config
+ */
+export function useHeartbeatConfig() {
+  const { heartbeatConfig } = useSnapshot(intelligenceStore);
+  return heartbeatConfig;
+}
+ 
+/**
+ * Hook to access heartbeat history
+ */
+export function useHeartbeatHistory() {
+  const { heartbeatHistory } = useSnapshot(intelligenceStore);
+  return heartbeatHistory;
+}
+ 
+/**
+ * Hook to check if heartbeat is running
+ */
+export function useHeartbeatRunning(): boolean {
+  const { isHeartbeatRunning } = useSnapshot(intelligenceStore);
+  return isHeartbeatRunning;
+}
+ 
+// === Compaction Hooks ===
+ 
+/**
+ * Hook to access last compaction result
+ */
+export function useLastCompaction() {
+  const { lastCompaction } = useSnapshot(intelligenceStore);
+  return lastCompaction;
+}
+ 
+/**
+ * Hook to access compaction check
+ */
+export function useCompactionCheck() {
+  const { compactionCheck } = useSnapshot(intelligenceStore);
+  return compactionCheck;
+}
+ 
+// === Reflection Hooks ===
+ 
+/**
+ * Hook to access reflection state
+ */
+export function useReflectionState() {
+  const { reflectionState } = useSnapshot(intelligenceStore);
+  return reflectionState;
+}
+ 
+/**
+ * Hook to access last reflection result
+ */
+export function useLastReflection() {
+  const { lastReflection } = useSnapshot(intelligenceStore);
+  return lastReflection;
+}
+ 
+// === Identity Hooks ===
+ 
+/**
+ * Hook to access current identity
+ */
+export function useIdentity() {
+  const { currentIdentity } = useSnapshot(intelligenceStore);
+  return currentIdentity;
+}
+ 
+/**
+ * Hook to access pending identity proposals
+ */
+export function usePendingProposals() {
+  const { pendingProposals } = useSnapshot(intelligenceStore);
+  return pendingProposals;
+}
+ 
+// === Cache Hooks ===
+ 
+/**
+ * Hook to access cache stats
+ */
+export function useCacheStats(): CacheStats {
+  const { cacheStats } = useSnapshot(intelligenceStore);
+  return cacheStats;
+}
+ 
+// === General Hooks ===
+ 
+/**
+ * Hook to check if any intelligence operation is loading
+ */
+export function useIntelligenceLoading(): boolean {
+  const { isLoading, isMemoryLoading } = useSnapshot(intelligenceStore);
+  return isLoading || isMemoryLoading;
+}
+ 
+/**
+ * Hook to access intelligence error
+ */
+export function useIntelligenceError(): string | null {
+  const { error } = useSnapshot(intelligenceStore);
+  return error;
+}
+ 
+/**
+ * Hook to access the full intelligence state snapshot
+ */
+export function useIntelligenceState() {
+  return useSnapshot(intelligenceStore);
+}
+ 
+/**
+ * Hook to access intelligence actions
+ * Returns the store directly for calling actions.
+ * Does not cause re-renders.
+ */
+export function useIntelligenceActions() {
+  return intelligenceStore;
+}
+ 
+// === Convenience Hooks ===
+ 
+/**
+ * Hook for memory operations with loading state
+ */
+export function useMemoryOperations() {
+  const memories = useMemories();
+  const isLoading = useMemoryLoading();
+  const stats = useMemoryStats();
+  const actions = useIntelligenceActions();
+ 
+  return {
+    memories,
+    isLoading,
+    stats,
+    loadMemories: actions.loadMemories,
+    storeMemory: actions.storeMemory,
+    deleteMemory: actions.deleteMemory,
+    loadStats: actions.loadMemoryStats,
+  };
+}
+ 
+/**
+ * Hook for heartbeat operations
+ */
+export function useHeartbeatOperations() {
+  const config = useHeartbeatConfig();
+  const isRunning = useHeartbeatRunning();
+  const history = useHeartbeatHistory();
+  const actions = useIntelligenceActions();
+ 
+  return {
+    config,
+    isRunning,
+    history,
+    init: actions.initHeartbeat,
+    start: actions.startHeartbeat,
+    stop: actions.stopHeartbeat,
+    tick: actions.tickHeartbeat,
+  };
+}
+ 
+/**
+ * Hook for compaction operations
+ */
+export function useCompactionOperations() {
+  const lastCompaction = useLastCompaction();
+  const check = useCompactionCheck();
+  const actions = useIntelligenceActions();
+ 
+  return {
+    lastCompaction,
+    check,
+    checkThreshold: actions.checkCompaction,
+    compact: actions.compact,
+  };
+}
+ 
+/**
+ * Hook for reflection operations
+ */
+export function useReflectionOperations() {
+  const state = useReflectionState();
+  const lastReflection = useLastReflection();
+  const actions = useIntelligenceActions();
+ 
+  return {
+    state,
+    lastReflection,
+    recordConversation: actions.recordConversation,
+    shouldReflect: actions.shouldReflect,
+    reflect: actions.reflect,
+  };
+}
+ 
+/**
+ * Hook for identity operations
+ */
+export function useIdentityOperations() {
+  const identity = useIdentity();
+  const pendingProposals = usePendingProposals();
+  const actions = useIntelligenceActions();
+ 
+  return {
+    identity,
+    pendingProposals,
+    loadIdentity: actions.loadIdentity,
+    buildPrompt: actions.buildPrompt,
+    proposeChange: actions.proposeIdentityChange,
+    approveProposal: actions.approveProposal,
+    rejectProposal: actions.rejectProposal,
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/intelligence/index.html b/desktop/coverage/src/domains/intelligence/index.html new file mode 100644 index 0000000..d8f91f0 --- /dev/null +++ b/desktop/coverage/src/domains/intelligence/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/domains/intelligence + + + + + + + + + +
+
+

All files src/domains/intelligence

+
+ +
+ 0% + Statements + 0/569 +
+ + +
+ 40% + Branches + 2/5 +
+ + +
+ 40% + Functions + 2/5 +
+ + +
+ 0% + Lines + 0/569 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cache.ts +
+
0%0/119100%1/1100%1/10%0/119
hooks.ts +
+
0%0/1340%0/10%0/10%0/134
index.ts +
+
0%0/10%0/10%0/10%0/1
store.ts +
+
0%0/3150%0/10%0/10%0/315
types.ts +
+
0%0/00%1/10%1/10%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/intelligence/index.ts.html b/desktop/coverage/src/domains/intelligence/index.ts.html new file mode 100644 index 0000000..a080329 --- /dev/null +++ b/desktop/coverage/src/domains/intelligence/index.ts.html @@ -0,0 +1,439 @@ + + + + + + Code coverage report for src/domains/intelligence/index.ts + + + + + + + + + +
+
+

All files / src/domains/intelligence index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Domain
+ *
+ * Unified intelligence layer for memory, heartbeat, compaction,
+ * reflection, and identity management.
+ *
+ * @example
+ * // Using hooks
+ * import { useMemoryOperations, useIdentityOperations } from '@/domains/intelligence';
+ *
+ * function IntelligenceComponent() {
+ *   const { memories, loadMemories, storeMemory } = useMemoryOperations();
+ *   const { identity, loadIdentity } = useIdentityOperations();
+ *
+ *   useEffect(() => {
+ *     loadMemories({ agentId: 'agent-1', limit: 10 });
+ *     loadIdentity('agent-1');
+ *   }, []);
+ *
+ *   // ...
+ * }
+ *
+ * @example
+ * // Using store directly (outside React)
+ * import { intelligenceStore } from '@/domains/intelligence';
+ *
+ * async function storeMemory(content: string) {
+ *   await intelligenceStore.storeMemory({
+ *     agentId: 'agent-1',
+ *     type: 'fact',
+ *     content,
+ *     importance: 5,
+ *     source: 'user',
+ *     tags: [],
+ *   });
+ * }
+ */
+ 
+// Types - Domain-specific
+export type {
+  MemoryEntry,
+  MemoryType,
+  MemorySource,
+  MemorySearchOptions,
+  MemoryStats,
+ 
+  // Cache
+  CacheEntry,
+  CacheStats,
+ 
+  // Store
+  IntelligenceState,
+  IntelligenceStore,
+} from './types';
+ 
+// Types - Re-exported from backend
+export type {
+  HeartbeatConfig,
+  HeartbeatAlert,
+  HeartbeatResult,
+  CompactableMessage,
+  CompactionConfig,
+  CompactionCheck,
+  CompactionResult,
+  PatternObservation,
+  ImprovementSuggestion,
+  ReflectionResult,
+  ReflectionState,
+  ReflectionConfig,
+  MemoryEntryForAnalysis,
+  IdentityFiles,
+  IdentityChangeProposal,
+  IdentitySnapshot,
+} from '../../lib/intelligence-backend';
+ 
+// Store
+export { intelligenceStore } from './store';
+ 
+// Cache utilities
+export {
+  IntelligenceCache,
+  getIntelligenceCache,
+  clearIntelligenceCache,
+  memorySearchKey,
+  identityKey,
+  heartbeatConfigKey,
+  reflectionStateKey,
+} from './cache';
+ 
+// Hooks - State accessors
+export {
+  useMemories,
+  useMemoryStats,
+  useMemoryLoading,
+  useHeartbeatConfig,
+  useHeartbeatHistory,
+  useHeartbeatRunning,
+  useLastCompaction,
+  useCompactionCheck,
+  useReflectionState,
+  useLastReflection,
+  useIdentity,
+  usePendingProposals,
+  useCacheStats,
+  useIntelligenceLoading,
+  useIntelligenceError,
+  useIntelligenceState,
+  useIntelligenceActions,
+} from './hooks';
+ 
+// Hooks - Operation bundles
+export {
+  useMemoryOperations,
+  useHeartbeatOperations,
+  useCompactionOperations,
+  useReflectionOperations,
+  useIdentityOperations,
+} from './hooks';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/intelligence/store.ts.html b/desktop/coverage/src/domains/intelligence/store.ts.html new file mode 100644 index 0000000..34d131d --- /dev/null +++ b/desktop/coverage/src/domains/intelligence/store.ts.html @@ -0,0 +1,1333 @@ + + + + + + Code coverage report for src/domains/intelligence/store.ts + + + + + + + + + +
+
+

All files / src/domains/intelligence store.ts

+
+ +
+ 0% + Statements + 0/315 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/315 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Domain Store
+ *
+ * Valtio-based state management for intelligence operations.
+ * Wraps intelligence-client with caching and reactive state.
+ */
+import { proxy } from 'valtio';
+import { intelligenceClient } from '../../lib/intelligence-client';
+import {
+  getIntelligenceCache,
+  memorySearchKey,
+  identityKey,
+} from './cache';
+import type {
+  IntelligenceStore,
+  IntelligenceState,
+  MemoryEntry,
+  MemoryType,
+  MemorySource,
+  MemorySearchOptions,
+  MemoryStats,
+  CacheStats,
+} from './types';
+ 
+// === Initial State ===
+ 
+const initialState: IntelligenceState = {
+  // Memory
+  memories: [],
+  memoryStats: null,
+  isMemoryLoading: false,
+ 
+  // Heartbeat
+  heartbeatConfig: null,
+  heartbeatHistory: [],
+  isHeartbeatRunning: false,
+ 
+  // Compaction
+  lastCompaction: null,
+  compactionCheck: null,
+ 
+  // Reflection
+  reflectionState: null,
+  lastReflection: null,
+ 
+  // Identity
+  currentIdentity: null,
+  pendingProposals: [],
+ 
+  // Cache
+  cacheStats: {
+    entries: 0,
+    hits: 0,
+    misses: 0,
+    hitRate: 0,
+  },
+ 
+  // General
+  isLoading: false,
+  error: null,
+};
+ 
+// === Store Implementation ===
+ 
+export const intelligenceStore = proxy<IntelligenceStore>({
+  ...initialState,
+ 
+  // === Memory Actions ===
+ 
+  loadMemories: async (options: MemorySearchOptions): Promise<void> => {
+    const cache = getIntelligenceCache();
+    const key = memorySearchKey(options as Record<string, unknown>);
+ 
+    // Check cache first
+    const cached = cache.get<MemoryEntry[]>(key);
+    if (cached) {
+      intelligenceStore.memories = cached;
+      intelligenceStore.cacheStats = cache.getStats();
+      return;
+    }
+ 
+    intelligenceStore.isMemoryLoading = true;
+    intelligenceStore.error = null;
+ 
+    try {
+      const rawMemories = await intelligenceClient.memory.search({
+        agentId: options.agentId,
+        type: options.type,
+        tags: options.tags,
+        query: options.query,
+        limit: options.limit,
+        minImportance: options.minImportance,
+      });
+ 
+      // Convert to frontend format
+      const memories: MemoryEntry[] = rawMemories.map(m => ({
+        id: m.id,
+        agentId: m.agentId,
+        content: m.content,
+        type: m.type as MemoryType,
+        importance: m.importance,
+        source: m.source as MemorySource,
+        tags: m.tags,
+        createdAt: m.createdAt,
+        lastAccessedAt: m.lastAccessedAt,
+        accessCount: m.accessCount,
+        conversationId: m.conversationId,
+      }));
+ 
+      cache.set(key, memories);
+      intelligenceStore.memories = memories;
+      intelligenceStore.cacheStats = cache.getStats();
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to load memories';
+    } finally {
+      intelligenceStore.isMemoryLoading = false;
+    }
+  },
+ 
+  storeMemory: async (entry): Promise<string> => {
+    const cache = getIntelligenceCache();
+ 
+    try {
+      const id = await intelligenceClient.memory.store({
+        agent_id: entry.agentId,
+        memory_type: entry.type,
+        content: entry.content,
+        importance: entry.importance,
+        source: entry.source,
+        tags: entry.tags,
+        conversation_id: entry.conversationId,
+      });
+ 
+      // Invalidate relevant cache entries
+      cache.delete(memorySearchKey({ agentId: entry.agentId }));
+ 
+      return id;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to store memory';
+      throw err;
+    }
+  },
+ 
+  deleteMemory: async (id: string): Promise<void> => {
+    const cache = getIntelligenceCache();
+ 
+    try {
+      await intelligenceClient.memory.delete(id);
+      // Clear all memory search caches
+      cache.clear();
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to delete memory';
+      throw err;
+    }
+  },
+ 
+  loadMemoryStats: async (): Promise<void> => {
+    try {
+      const rawStats = await intelligenceClient.memory.stats();
+      const stats: MemoryStats = {
+        totalEntries: rawStats.totalEntries,
+        byType: rawStats.byType,
+        byAgent: rawStats.byAgent,
+        oldestEntry: rawStats.oldestEntry,
+        newestEntry: rawStats.newestEntry,
+        storageSizeBytes: rawStats.storageSizeBytes ?? 0,
+      };
+      intelligenceStore.memoryStats = stats;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to load memory stats';
+    }
+  },
+ 
+  // === Heartbeat Actions ===
+ 
+  initHeartbeat: async (agentId: string, config?: import('../../lib/intelligence-backend').HeartbeatConfig): Promise<void> => {
+    try {
+      await intelligenceClient.heartbeat.init(agentId, config);
+      if (config) {
+        intelligenceStore.heartbeatConfig = config;
+      }
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to init heartbeat';
+    }
+  },
+ 
+  startHeartbeat: async (agentId: string): Promise<void> => {
+    try {
+      await intelligenceClient.heartbeat.start(agentId);
+      intelligenceStore.isHeartbeatRunning = true;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to start heartbeat';
+    }
+  },
+ 
+  stopHeartbeat: async (agentId: string): Promise<void> => {
+    try {
+      await intelligenceClient.heartbeat.stop(agentId);
+      intelligenceStore.isHeartbeatRunning = false;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to stop heartbeat';
+    }
+  },
+ 
+  tickHeartbeat: async (agentId: string): Promise<import('../../lib/intelligence-backend').HeartbeatResult> => {
+    try {
+      const result = await intelligenceClient.heartbeat.tick(agentId);
+      intelligenceStore.heartbeatHistory = [
+        result,
+        ...intelligenceStore.heartbeatHistory.slice(0, 99),
+      ];
+      return result;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Heartbeat tick failed';
+      throw err;
+    }
+  },
+ 
+  // === Compaction Actions ===
+ 
+  checkCompaction: async (messages: Array<{ id?: string; role: string; content: string; timestamp?: string }>): Promise<import('../../lib/intelligence-backend').CompactionCheck> => {
+    try {
+      const compactableMessages = messages.map(m => ({
+        id: m.id || `msg_${Date.now()}`,
+        role: m.role,
+        content: m.content,
+        timestamp: m.timestamp,
+      }));
+      const check = await intelligenceClient.compactor.checkThreshold(compactableMessages);
+      intelligenceStore.compactionCheck = check;
+      return check;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Compaction check failed';
+      throw err;
+    }
+  },
+ 
+  compact: async (
+    messages: Array<{ id?: string; role: string; content: string; timestamp?: string }>,
+    agentId: string,
+    conversationId?: string
+  ): Promise<import('../../lib/intelligence-backend').CompactionResult> => {
+    try {
+      const compactableMessages = messages.map(m => ({
+        id: m.id || `msg_${Date.now()}`,
+        role: m.role,
+        content: m.content,
+        timestamp: m.timestamp,
+      }));
+      const result = await intelligenceClient.compactor.compact(
+        compactableMessages,
+        agentId,
+        conversationId
+      );
+      intelligenceStore.lastCompaction = result;
+      return result;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Compaction failed';
+      throw err;
+    }
+  },
+ 
+  // === Reflection Actions ===
+ 
+  recordConversation: async (): Promise<void> => {
+    try {
+      await intelligenceClient.reflection.recordConversation();
+    } catch (err) {
+      console.warn('[IntelligenceStore] Failed to record conversation:', err);
+    }
+  },
+ 
+  shouldReflect: async (): Promise<boolean> => {
+    try {
+      return intelligenceClient.reflection.shouldReflect();
+    } catch {
+      return false;
+    }
+  },
+ 
+  reflect: async (agentId: string): Promise<import('../../lib/intelligence-backend').ReflectionResult> => {
+    try {
+      // Get memories for reflection
+      const memories = await intelligenceClient.memory.search({
+        agentId,
+        limit: 50,
+        minImportance: 3,
+      });
+ 
+      const analysisMemories = memories.map(m => ({
+        id: m.id,
+        memory_type: m.type,
+        content: m.content,
+        importance: m.importance,
+        created_at: m.createdAt,
+        access_count: m.accessCount,
+        tags: m.tags,
+      }));
+ 
+      const result = await intelligenceClient.reflection.reflect(agentId, analysisMemories);
+      intelligenceStore.lastReflection = result;
+ 
+      // Invalidate caches
+      getIntelligenceCache().clear();
+ 
+      return result;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Reflection failed';
+      throw err;
+    }
+  },
+ 
+  // === Identity Actions ===
+ 
+  loadIdentity: async (agentId: string): Promise<void> => {
+    const cache = getIntelligenceCache();
+    const key = identityKey(agentId);
+ 
+    // Check cache
+    const cached = cache.get<import('../../lib/intelligence-backend').IdentityFiles>(key);
+    if (cached) {
+      intelligenceStore.currentIdentity = cached;
+      intelligenceStore.cacheStats = cache.getStats();
+      return;
+    }
+ 
+    try {
+      const identity = await intelligenceClient.identity.get(agentId);
+      cache.set(key, identity, 10 * 60 * 1000); // 10 minute TTL
+      intelligenceStore.currentIdentity = identity;
+      intelligenceStore.cacheStats = cache.getStats();
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to load identity';
+    }
+  },
+ 
+  buildPrompt: async (agentId: string, memoryContext?: string): Promise<string> => {
+    try {
+      return intelligenceClient.identity.buildPrompt(agentId, memoryContext);
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to build prompt';
+      throw err;
+    }
+  },
+ 
+  proposeIdentityChange: async (
+    agentId: string,
+    file: 'soul' | 'instructions',
+    content: string,
+    reason: string
+  ): Promise<import('../../lib/intelligence-backend').IdentityChangeProposal> => {
+    try {
+      const proposal = await intelligenceClient.identity.proposeChange(
+        agentId,
+        file,
+        content,
+        reason
+      );
+      intelligenceStore.pendingProposals.push(proposal);
+      return proposal;
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to propose change';
+      throw err;
+    }
+  },
+ 
+  approveProposal: async (proposalId: string): Promise<void> => {
+    try {
+      const identity = await intelligenceClient.identity.approveProposal(proposalId);
+      intelligenceStore.pendingProposals = intelligenceStore.pendingProposals.filter(
+        p => p.id !== proposalId
+      );
+      intelligenceStore.currentIdentity = identity;
+      getIntelligenceCache().clear();
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to approve proposal';
+      throw err;
+    }
+  },
+ 
+  rejectProposal: async (proposalId: string): Promise<void> => {
+    try {
+      await intelligenceClient.identity.rejectProposal(proposalId);
+      intelligenceStore.pendingProposals = intelligenceStore.pendingProposals.filter(
+        p => p.id !== proposalId
+      );
+    } catch (err) {
+      intelligenceStore.error = err instanceof Error ? err.message : 'Failed to reject proposal';
+      throw err;
+    }
+  },
+ 
+  // === Cache Actions ===
+ 
+  clearCache: (): void => {
+    getIntelligenceCache().clear();
+    intelligenceStore.cacheStats = getIntelligenceCache().getStats();
+  },
+ 
+  getCacheStats: (): CacheStats => {
+    return getIntelligenceCache().getStats();
+  },
+ 
+  // === General Actions ===
+ 
+  clearError: (): void => {
+    intelligenceStore.error = null;
+  },
+ 
+  reset: (): void => {
+    Object.assign(intelligenceStore, initialState);
+    getIntelligenceCache().clear();
+  },
+});
+ 
+export type { IntelligenceStore };
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/domains/intelligence/types.ts.html b/desktop/coverage/src/domains/intelligence/types.ts.html new file mode 100644 index 0000000..19cc6de --- /dev/null +++ b/desktop/coverage/src/domains/intelligence/types.ts.html @@ -0,0 +1,637 @@ + + + + + + Code coverage report for src/domains/intelligence/types.ts + + + + + + + + + +
+
+

All files / src/domains/intelligence types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Domain Types
+ *
+ * Re-exports types from intelligence-backend for consistency.
+ * Domain-specific extensions are added here.
+ */
+ 
+// === Re-export Backend Types ===
+ 
+export type {
+  MemoryEntryInput,
+  PersistentMemory,
+  MemorySearchOptions as BackendMemorySearchOptions,
+  MemoryStats as BackendMemoryStats,
+  HeartbeatConfig,
+  HeartbeatAlert,
+  HeartbeatResult,
+  CompactableMessage,
+  CompactionResult,
+  CompactionCheck,
+  CompactionConfig,
+  PatternObservation,
+  ImprovementSuggestion,
+  ReflectionResult,
+  ReflectionState,
+  ReflectionConfig,
+  MemoryEntryForAnalysis,
+  IdentityFiles,
+  IdentityChangeProposal,
+  IdentitySnapshot,
+} from '../../lib/intelligence-backend';
+ 
+// === Frontend-Specific Types ===
+ 
+export type MemoryType = 'fact' | 'preference' | 'lesson' | 'context' | 'task';
+export type MemorySource = 'auto' | 'user' | 'reflection' | 'llm-reflection';
+ 
+/**
+ * Frontend-friendly memory entry
+ */
+export interface MemoryEntry {
+  id: string;
+  agentId: string;
+  content: string;
+  type: MemoryType;
+  importance: number;
+  source: MemorySource;
+  tags: string[];
+  createdAt: string;
+  lastAccessedAt: string;
+  accessCount: number;
+  conversationId?: string;
+}
+ 
+/**
+ * Frontend memory search options
+ */
+export interface MemorySearchOptions {
+  agentId?: string;
+  type?: MemoryType;
+  types?: MemoryType[];
+  tags?: string[];
+  query?: string;
+  limit?: number;
+  minImportance?: number;
+}
+ 
+/**
+ * Frontend memory stats
+ */
+export interface MemoryStats {
+  totalEntries: number;
+  byType: Record<string, number>;
+  byAgent: Record<string, number>;
+  oldestEntry: string | null;
+  newestEntry: string | null;
+  storageSizeBytes: number;
+}
+ 
+// === Cache Types ===
+ 
+export interface CacheEntry<T> {
+  data: T;
+  timestamp: number;
+  ttl: number;
+}
+ 
+export interface CacheStats {
+  entries: number;
+  hits: number;
+  misses: number;
+  hitRate: number;
+}
+ 
+// === Store Types ===
+ 
+export interface IntelligenceState {
+  // Memory
+  memories: MemoryEntry[];
+  memoryStats: MemoryStats | null;
+  isMemoryLoading: boolean;
+ 
+  // Heartbeat
+  heartbeatConfig: HeartbeatConfig | null;
+  heartbeatHistory: HeartbeatResult[];
+  isHeartbeatRunning: boolean;
+ 
+  // Compaction
+  lastCompaction: CompactionResult | null;
+  compactionCheck: CompactionCheck | null;
+ 
+  // Reflection
+  reflectionState: ReflectionState | null;
+  lastReflection: ReflectionResult | null;
+ 
+  // Identity
+  currentIdentity: IdentityFiles | null;
+  pendingProposals: IdentityChangeProposal[];
+ 
+  // Cache
+  cacheStats: CacheStats;
+ 
+  // General
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+// Import types that need to be used in store interface
+import type {
+  HeartbeatConfig,
+  HeartbeatResult,
+  CompactionResult,
+  CompactionCheck,
+  ReflectionState,
+  ReflectionResult,
+  IdentityFiles,
+  IdentityChangeProposal,
+} from '../../lib/intelligence-backend';
+ 
+export interface IntelligenceStore extends IntelligenceState {
+  // Memory Actions
+  loadMemories: (options: MemorySearchOptions) => Promise<void>;
+  storeMemory: (entry: {
+    agentId: string;
+    type: MemoryType;
+    content: string;
+    importance: number;
+    source: MemorySource;
+    tags: string[];
+    conversationId?: string;
+  }) => Promise<string>;
+  deleteMemory: (id: string) => Promise<void>;
+  loadMemoryStats: () => Promise<void>;
+ 
+  // Heartbeat Actions
+  initHeartbeat: (agentId: string, config?: HeartbeatConfig) => Promise<void>;
+  startHeartbeat: (agentId: string) => Promise<void>;
+  stopHeartbeat: (agentId: string) => Promise<void>;
+  tickHeartbeat: (agentId: string) => Promise<HeartbeatResult>;
+ 
+  // Compaction Actions
+  checkCompaction: (messages: Array<{ id?: string; role: string; content: string; timestamp?: string }>) => Promise<CompactionCheck>;
+  compact: (messages: Array<{ id?: string; role: string; content: string; timestamp?: string }>, agentId: string, conversationId?: string) => Promise<CompactionResult>;
+ 
+  // Reflection Actions
+  recordConversation: () => Promise<void>;
+  shouldReflect: () => Promise<boolean>;
+  reflect: (agentId: string) => Promise<ReflectionResult>;
+ 
+  // Identity Actions
+  loadIdentity: (agentId: string) => Promise<void>;
+  buildPrompt: (agentId: string, memoryContext?: string) => Promise<string>;
+  proposeIdentityChange: (agentId: string, file: 'soul' | 'instructions', content: string, reason: string) => Promise<IdentityChangeProposal>;
+  approveProposal: (proposalId: string) => Promise<void>;
+  rejectProposal: (proposalId: string) => Promise<void>;
+ 
+  // Cache Actions
+  clearCache: () => void;
+  getCacheStats: () => CacheStats;
+ 
+  // General
+  clearError: () => void;
+  reset: () => void;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/hooks/index.html b/desktop/coverage/src/hooks/index.html new file mode 100644 index 0000000..932aecc --- /dev/null +++ b/desktop/coverage/src/hooks/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/hooks + + + + + + + + + +
+
+

All files src/hooks

+
+ +
+ 0% + Statements + 0/171 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/171 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
0%0/10%0/10%0/10%0/1
useAutomationEvents.ts +
+
0%0/1700%0/10%0/10%0/170
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/hooks/index.ts.html b/desktop/coverage/src/hooks/index.ts.html new file mode 100644 index 0000000..5d0fe04 --- /dev/null +++ b/desktop/coverage/src/hooks/index.ts.html @@ -0,0 +1,136 @@ + + + + + + Code coverage report for src/hooks/index.ts + + + + + + + + + +
+
+

All files / src/hooks index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Custom React Hooks for ZCLAW Desktop
+ *
+ * @module hooks
+ */
+ 
+export {
+  useAutomationEvents,
+  useHandEvents,
+  useWorkflowEvents,
+} from './useAutomationEvents';
+ 
+// Re-export types from useAutomationEvents
+export type {
+  UseAutomationEventsOptions,
+} from './useAutomationEvents';
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/hooks/useAutomationEvents.ts.html b/desktop/coverage/src/hooks/useAutomationEvents.ts.html new file mode 100644 index 0000000..1ed5f4c --- /dev/null +++ b/desktop/coverage/src/hooks/useAutomationEvents.ts.html @@ -0,0 +1,1039 @@ + + + + + + Code coverage report for src/hooks/useAutomationEvents.ts + + + + + + + + + +
+
+

All files / src/hooks useAutomationEvents.ts

+
+ +
+ 0% + Statements + 0/170 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/170 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * useAutomationEvents - WebSocket Event Hook for Automation System
+ *
+ * Subscribes to hand and workflow events from OpenFang WebSocket
+ * and updates the corresponding stores.
+ *
+ * @module hooks/useAutomationEvents
+ */
+ 
+import { useEffect, useRef } from 'react';
+import { useHandStore } from '../store/handStore';
+import { useWorkflowStore } from '../store/workflowStore';
+import { useChatStore } from '../store/chatStore';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Event Types ===
+ 
+interface HandEventData {
+  hand_name: string;
+  hand_status: 'triggered' | 'running' | 'completed' | 'failed' | 'needs_approval';
+  hand_result?: unknown;
+  hand_error?: string;
+  run_id?: string;
+  timestamp?: number;
+}
+ 
+interface WorkflowEventData {
+  workflow_id: string;
+  workflow_status: 'started' | 'step_completed' | 'completed' | 'failed' | 'paused';
+  current_step?: number;
+  total_steps?: number;
+  step_name?: string;
+  result?: unknown;
+  error?: string;
+  run_id?: string;
+  timestamp?: number;
+}
+ 
+interface ApprovalEventData {
+  approval_id: string;
+  hand_name?: string;
+  workflow_id?: string;
+  run_id?: string;
+  status: 'requested' | 'approved' | 'rejected' | 'expired';
+  reason?: string;
+  requested_by?: string;
+  timestamp?: number;
+}
+ 
+// === Hook Options ===
+ 
+export interface UseAutomationEventsOptions {
+  /** Whether to inject hand results into chat as messages */
+  injectResultsToChat?: boolean;
+  /** Whether to auto-refresh hands on status change */
+  refreshOnStatusChange?: boolean;
+  /** Custom event handlers */
+  onHandEvent?: (data: HandEventData) => void;
+  onWorkflowEvent?: (data: WorkflowEventData) => void;
+  onApprovalEvent?: (data: ApprovalEventData) => void;
+}
+ 
+// === Helper Functions ===
+ 
+function isHandEvent(data: unknown): data is HandEventData {
+  return typeof data === 'object' && data !== null && 'hand_name' in data && 'hand_status' in data;
+}
+ 
+function isWorkflowEvent(data: unknown): data is WorkflowEventData {
+  return typeof data === 'object' && data !== null && 'workflow_id' in data && 'workflow_status' in data;
+}
+ 
+function isApprovalEvent(data: unknown): data is ApprovalEventData {
+  return typeof data === 'object' && data !== null && 'approval_id' in data && 'status' in data;
+}
+ 
+// === Main Hook ===
+ 
+/**
+ * Hook for subscribing to automation-related WebSocket events.
+ *
+ * @param client - The GatewayClient instance (optional, will try to get from store if not provided)
+ * @param options - Configuration options
+ *
+ * @example
+ * ```tsx
+ * function AutomationPanel() {
+ *   const client = useConnectionStore(s => s.client);
+ *   useAutomationEvents(client, {
+ *     injectResultsToChat: true,
+ *     refreshOnStatusChange: true,
+ *   });
+ *   // ...
+ * }
+ * ```
+ */
+export function useAutomationEvents(
+  client: GatewayClient | null,
+  options: UseAutomationEventsOptions = {}
+): void {
+  const {
+    injectResultsToChat = true,
+    refreshOnStatusChange = true,
+    onHandEvent,
+    onWorkflowEvent,
+    onApprovalEvent,
+  } = options;
+ 
+  // Store references
+  const loadHands = useHandStore(s => s.loadHands);
+  const loadHandRuns = useHandStore(s => s.loadHandRuns);
+  const loadApprovals = useHandStore(s => s.loadApprovals);
+  const loadWorkflows = useWorkflowStore(s => s.loadWorkflows);
+  const loadWorkflowRuns = useWorkflowStore(s => s.loadWorkflowRuns);
+  const addMessage = useChatStore(s => s.addMessage);
+ 
+  // Track subscriptions for cleanup
+  const unsubscribersRef = useRef<Array<() => void>>([]);
+ 
+  useEffect(() => {
+    if (!client) {
+      return;
+    }
+ 
+    // Clean up any existing subscriptions
+    unsubscribersRef.current.forEach(unsub => unsub());
+    unsubscribersRef.current = [];
+ 
+    // === Hand Event Handler ===
+    const handleHandEvent = (data: unknown) => {
+      if (!isHandEvent(data)) return;
+ 
+      const eventData = data as HandEventData;
+      console.log('[useAutomationEvents] Hand event:', eventData);
+ 
+      // Refresh hands if status changed
+      if (refreshOnStatusChange) {
+        loadHands();
+      }
+ 
+      // Load updated runs for this hand
+      if (eventData.run_id) {
+        loadHandRuns(eventData.hand_name);
+      }
+ 
+      // Inject result into chat
+      if (injectResultsToChat && eventData.hand_status === 'completed') {
+        const resultContent = eventData.hand_result
+          ? typeof eventData.hand_result === 'string'
+            ? eventData.hand_result
+            : JSON.stringify(eventData.hand_result, null, 2)
+          : 'Hand completed successfully';
+ 
+        addMessage({
+          id: `hand-${eventData.run_id || Date.now()}`,
+          role: 'hand',
+          content: `**${eventData.hand_name}** 执行完成\n\n${resultContent}`,
+          timestamp: new Date(),
+          handName: eventData.hand_name,
+          handStatus: eventData.hand_status,
+          handResult: eventData.hand_result,
+          runId: eventData.run_id,
+        });
+      }
+ 
+      // Handle error status
+      if (eventData.hand_status === 'failed' && eventData.hand_error) {
+        addMessage({
+          id: `hand-error-${eventData.run_id || Date.now()}`,
+          role: 'hand',
+          content: `**${eventData.hand_name}** 执行失败\n\n错误: ${eventData.hand_error}`,
+          timestamp: new Date(),
+          handName: eventData.hand_name,
+          handStatus: eventData.hand_status,
+          error: eventData.hand_error,
+          runId: eventData.run_id,
+        });
+      }
+ 
+      // Handle approval needed
+      if (eventData.hand_status === 'needs_approval') {
+        loadApprovals('pending');
+      }
+ 
+      // Call custom handler
+      onHandEvent?.(eventData);
+    };
+ 
+    // === Workflow Event Handler ===
+    const handleWorkflowEvent = (data: unknown) => {
+      if (!isWorkflowEvent(data)) return;
+ 
+      const eventData = data as WorkflowEventData;
+      console.log('[useAutomationEvents] Workflow event:', eventData);
+ 
+      // Refresh workflows if status changed
+      if (refreshOnStatusChange) {
+        loadWorkflows();
+      }
+ 
+      // Load updated runs for this workflow
+      if (eventData.run_id) {
+        loadWorkflowRuns(eventData.workflow_id);
+      }
+ 
+      // Inject result into chat
+      if (injectResultsToChat && eventData.workflow_status === 'completed') {
+        const resultContent = eventData.result
+          ? typeof eventData.result === 'string'
+            ? eventData.result
+            : JSON.stringify(eventData.result, null, 2)
+          : 'Workflow completed successfully';
+ 
+        addMessage({
+          id: `workflow-${eventData.run_id || Date.now()}`,
+          role: 'workflow',
+          content: `**工作流: ${eventData.workflow_id}** 执行完成\n\n${resultContent}`,
+          timestamp: new Date(),
+          workflowId: eventData.workflow_id,
+          workflowStatus: eventData.workflow_status,
+          workflowResult: eventData.result,
+          runId: eventData.run_id,
+        });
+      }
+ 
+      // Call custom handler
+      onWorkflowEvent?.(eventData);
+    };
+ 
+    // === Approval Event Handler ===
+    const handleApprovalEvent = (data: unknown) => {
+      if (!isApprovalEvent(data)) return;
+ 
+      const eventData = data as ApprovalEventData;
+      console.log('[useAutomationEvents] Approval event:', eventData);
+ 
+      // Refresh approvals list
+      loadApprovals();
+ 
+      // Call custom handler
+      onApprovalEvent?.(eventData);
+    };
+ 
+    // Subscribe to events
+    const unsubHand = client.on('hand', handleHandEvent);
+    const unsubWorkflow = client.on('workflow', handleWorkflowEvent);
+    const unsubApproval = client.on('approval', handleApprovalEvent);
+ 
+    unsubscribersRef.current = [unsubHand, unsubWorkflow, unsubApproval];
+ 
+    // Cleanup on unmount or client change
+    return () => {
+      unsubscribersRef.current.forEach(unsub => unsub());
+      unsubscribersRef.current = [];
+    };
+  }, [
+    client,
+    injectResultsToChat,
+    refreshOnStatusChange,
+    loadHands,
+    loadHandRuns,
+    loadApprovals,
+    loadWorkflows,
+    loadWorkflowRuns,
+    addMessage,
+    onHandEvent,
+    onWorkflowEvent,
+    onApprovalEvent,
+  ]);
+}
+ 
+// === Utility Hooks ===
+ 
+/**
+ * Hook for subscribing to a specific hand's events only
+ */
+export function useHandEvents(
+  client: GatewayClient | null,
+  handName: string,
+  onEvent?: (data: HandEventData) => void
+): void {
+  useEffect(() => {
+    if (!client || !handName) return;
+ 
+    const handler = (data: unknown) => {
+      if (isHandEvent(data) && (data as HandEventData).hand_name === handName) {
+        onEvent?.(data as HandEventData);
+      }
+    };
+ 
+    const unsub = client.on('hand', handler);
+    return unsub;
+  }, [client, handName, onEvent]);
+}
+ 
+/**
+ * Hook for subscribing to a specific workflow's events only
+ */
+export function useWorkflowEvents(
+  client: GatewayClient | null,
+  workflowId: string,
+  onEvent?: (data: WorkflowEventData) => void
+): void {
+  useEffect(() => {
+    if (!client || !workflowId) return;
+ 
+    const handler = (data: unknown) => {
+      if (isWorkflowEvent(data) && (data as WorkflowEventData).workflow_id === workflowId) {
+        onEvent?.(data as WorkflowEventData);
+      }
+    };
+ 
+    const unsub = client.on('workflow', handler);
+    return unsub;
+  }, [client, workflowId, onEvent]);
+}
+ 
+export default useAutomationEvents;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/index.html b/desktop/coverage/src/index.html new file mode 100644 index 0000000..f59aab8 --- /dev/null +++ b/desktop/coverage/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 0% + Statements + 0/377 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/377 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
App.tsx +
+
0%0/3770%0/10%0/10%0/377
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/__tests__/autonomy-manager.test.ts.html b/desktop/coverage/src/lib/__tests__/autonomy-manager.test.ts.html new file mode 100644 index 0000000..9e5708a --- /dev/null +++ b/desktop/coverage/src/lib/__tests__/autonomy-manager.test.ts.html @@ -0,0 +1,1174 @@ + + + + + + Code coverage report for src/lib/__tests__/autonomy-manager.test.ts + + + + + + + + + +
+
+

All files / src/lib/__tests__ autonomy-manager.test.ts

+
+ +
+ 0% + Statements + 0/256 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/256 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * AutonomyManager Tests - L4 Self-Evolution Authorization
+ *
+ * Tests for the tiered authorization system:
+ * - Level-based permissions (supervised/assisted/autonomous)
+ * - Risk assessment for actions
+ * - Approval workflow
+ * - Audit logging
+ * - Rollback functionality
+ */
+ 
+import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
+import {
+  AutonomyManager,
+  getAutonomyManager,
+  resetAutonomyManager,
+  canAutoExecute,
+  executeWithAutonomy,
+  DEFAULT_AUTONOMY_CONFIGS,
+  type AutonomyLevel,
+} from '../autonomy-manager';
+ 
+// === Helper to create fresh manager ===
+ 
+function createManager(level: AutonomyLevel = 'assisted'): AutonomyManager {
+  resetAutonomyManager();
+  return getAutonomyManager({ ...DEFAULT_AUTONOMY_CONFIGS[level] });
+}
+ 
+// === Risk Assessment Tests ===
+ 
+describe('AutonomyManager Risk Assessment', () => {
+  let manager: AutonomyManager;
+ 
+  beforeEach(() => {
+    manager = createManager('assisted');
+  });
+ 
+  afterEach(() => {
+    resetAutonomyManager();
+  });
+ 
+  it('should classify memory_save as low risk', () => {
+    const decision = manager.evaluate('memory_save', { importance: 3 });
+    expect(decision.riskLevel).toBe('low');
+  });
+ 
+  it('should classify memory_delete as high risk', () => {
+    const decision = manager.evaluate('memory_delete');
+    expect(decision.riskLevel).toBe('high');
+  });
+ 
+  it('should classify identity_update as high risk', () => {
+    const decision = manager.evaluate('identity_update');
+    expect(decision.riskLevel).toBe('high');
+  });
+ 
+  it('should allow risk override', () => {
+    const decision = manager.evaluate('memory_save', { riskOverride: 'high' });
+    expect(decision.riskLevel).toBe('high');
+  });
+});
+ 
+// === Level-Based Permission Tests ===
+ 
+describe('AutonomyManager Level Permissions', () => {
+  afterEach(() => {
+    resetAutonomyManager();
+  });
+ 
+  describe('Supervised Mode', () => {
+    let manager: AutonomyManager;
+ 
+    beforeEach(() => {
+      manager = createManager('supervised');
+    });
+ 
+    it('should require approval for all actions', () => {
+      const decision = manager.evaluate('memory_save', { importance: 1 });
+      expect(decision.requiresApproval).toBe(true);
+      expect(decision.allowed).toBe(false);
+    });
+ 
+    it('should not auto-execute even low-risk actions', () => {
+      const decision = manager.evaluate('reflection_run', { importance: 1 });
+      expect(decision.allowed).toBe(false);
+    });
+  });
+ 
+  describe('Assisted Mode', () => {
+    let manager: AutonomyManager;
+ 
+    beforeEach(() => {
+      manager = createManager('assisted');
+    });
+ 
+    it('should auto-approve low importance, low risk actions', () => {
+      const decision = manager.evaluate('memory_save', { importance: 3 });
+      expect(decision.allowed).toBe(true);
+      expect(decision.requiresApproval).toBe(false);
+    });
+ 
+    it('should require approval for high importance actions', () => {
+      const decision = manager.evaluate('memory_save', { importance: 8 });
+      expect(decision.requiresApproval).toBe(true);
+    });
+ 
+    it('should always require approval for high risk actions', () => {
+      const decision = manager.evaluate('memory_delete', { importance: 1 });
+      expect(decision.requiresApproval).toBe(true);
+      expect(decision.allowed).toBe(false);
+    });
+ 
+    it('should not auto-approve identity updates', () => {
+      const decision = manager.evaluate('identity_update', { importance: 3 });
+      expect(decision.allowed).toBe(false);
+      expect(decision.requiresApproval).toBe(true);
+    });
+  });
+ 
+  describe('Autonomous Mode', () => {
+    let manager: AutonomyManager;
+ 
+    beforeEach(() => {
+      manager = createManager('autonomous');
+    });
+ 
+    it('should auto-approve medium risk, medium importance actions', () => {
+      const decision = manager.evaluate('skill_install', { importance: 5 });
+      expect(decision.allowed).toBe(true);
+      expect(decision.requiresApproval).toBe(false);
+    });
+ 
+    it('should still require approval for high risk actions', () => {
+      const decision = manager.evaluate('memory_delete', { importance: 1 });
+      expect(decision.allowed).toBe(false);
+      expect(decision.requiresApproval).toBe(true);
+    });
+ 
+    it('should not auto-approve self-modification', () => {
+      // Even in autonomous mode, self-modification requires approval
+      manager.updateConfig({
+        allowedActions: {
+          ...manager.getConfig().allowedActions,
+          selfModification: false,
+        },
+      });
+ 
+      const decision = manager.evaluate('identity_update', { importance: 3 });
+      expect(decision.allowed).toBe(false);
+    });
+  });
+});
+ 
+// === Approval Workflow Tests ===
+ 
+describe('AutonomyManager Approval Workflow', () => {
+  let manager: AutonomyManager;
+ 
+  beforeEach(() => {
+    manager = createManager('supervised');
+  });
+ 
+  afterEach(() => {
+    resetAutonomyManager();
+  });
+ 
+  it('should request approval and return approval ID', () => {
+    const decision = manager.evaluate('memory_save');
+    const approvalId = manager.requestApproval(decision);
+ 
+    expect(approvalId).toMatch(/^approval_/);
+    expect(manager.getPendingApprovals().length).toBe(1);
+  });
+ 
+  it('should approve pending action', () => {
+    const decision = manager.evaluate('memory_save');
+    const approvalId = manager.requestApproval(decision);
+ 
+    const result = manager.approve(approvalId);
+    expect(result).toBe(true);
+    expect(manager.getPendingApprovals().length).toBe(0);
+  });
+ 
+  it('should reject pending action', () => {
+    const decision = manager.evaluate('memory_save');
+    const approvalId = manager.requestApproval(decision);
+ 
+    const result = manager.reject(approvalId);
+    expect(result).toBe(true);
+    expect(manager.getPendingApprovals().length).toBe(0);
+  });
+ 
+  it('should return false for non-existent approval', () => {
+    expect(manager.approve('non_existent')).toBe(false);
+    expect(manager.reject('non_existent')).toBe(false);
+  });
+});
+ 
+// === Audit Log Tests ===
+ 
+describe('AutonomyManager Audit Log', () => {
+  let manager: AutonomyManager;
+ 
+  beforeEach(() => {
+    manager = createManager('assisted');
+    manager.clearAuditLog();
+  });
+ 
+  afterEach(() => {
+    resetAutonomyManager();
+  });
+ 
+  it('should log decisions', () => {
+    manager.evaluate('memory_save', { importance: 3 });
+ 
+    const log = manager.getAuditLog();
+    expect(log.length).toBe(1);
+    expect(log[0].action).toBe('memory_save');
+  });
+ 
+  it('should limit log to 100 entries', () => {
+    for (let i = 0; i < 150; i++) {
+      manager.evaluate('memory_save', { importance: i % 10 });
+    }
+ 
+    const log = manager.getAuditLog(200);
+    expect(log.length).toBe(100);
+  });
+ 
+  it('should clear audit log', () => {
+    manager.evaluate('memory_save');
+    manager.evaluate('reflection_run');
+ 
+    expect(manager.getAuditLog().length).toBe(2);
+ 
+    manager.clearAuditLog();
+ 
+    expect(manager.getAuditLog().length).toBe(0);
+  });
+ 
+  it('should support rollback', () => {
+    manager.evaluate('memory_save');
+    const log = manager.getAuditLog();
+    const entryId = log[0].id;
+ 
+    const result = manager.rollback(entryId);
+ 
+    expect(result).toBe(true);
+ 
+    const updatedLog = manager.getAuditLog();
+    expect(updatedLog[0].outcome).toBe('rolled_back');
+    expect(updatedLog[0].rolledBackAt).toBeDefined();
+  });
+ 
+  it('should not allow double rollback', () => {
+    manager.evaluate('memory_save');
+    const log = manager.getAuditLog();
+    const entryId = log[0].id;
+ 
+    manager.rollback(entryId);
+    const result = manager.rollback(entryId);
+ 
+    expect(result).toBe(false);
+  });
+});
+ 
+// === Config Management Tests ===
+ 
+describe('AutonomyManager Config Management', () => {
+  let manager: AutonomyManager;
+ 
+  beforeEach(() => {
+    manager = createManager('assisted');
+  });
+ 
+  afterEach(() => {
+    resetAutonomyManager();
+  });
+ 
+  it('should get current config', () => {
+    const config = manager.getConfig();
+    expect(config.level).toBe('assisted');
+    expect(config.allowedActions.memoryAutoSave).toBe(true);
+  });
+ 
+  it('should update config', () => {
+    manager.updateConfig({
+      approvalThreshold: {
+        importanceMax: 8,
+        riskMax: 'medium',
+      },
+    });
+ 
+    const config = manager.getConfig();
+    expect(config.approvalThreshold.importanceMax).toBe(8);
+  });
+ 
+  it('should change level', () => {
+    manager.setLevel('autonomous');
+ 
+    const config = manager.getConfig();
+    expect(config.level).toBe('autonomous');
+    expect(config.allowedActions.memoryAutoSave).toBe(true);
+    expect(config.allowedActions.identityAutoUpdate).toBe(true);
+  });
+});
+ 
+// === Helper Function Tests ===
+ 
+describe('Helper Functions', () => {
+  beforeEach(() => {
+    resetAutonomyManager();
+    getAutonomyManager({ ...DEFAULT_AUTONOMY_CONFIGS.assisted });
+  });
+ 
+  afterEach(() => {
+    resetAutonomyManager();
+  });
+ 
+  describe('canAutoExecute', () => {
+    it('should return true for auto-approvable actions', () => {
+      const result = canAutoExecute('memory_save', 3);
+      expect(result.canProceed).toBe(true);
+    });
+ 
+    it('should return false for actions needing approval', () => {
+      const result = canAutoExecute('memory_delete', 1);
+      expect(result.canProceed).toBe(false);
+    });
+  });
+ 
+  describe('executeWithAutonomy', () => {
+    it('should execute auto-approved actions immediately', async () => {
+      const executor = vi.fn().mockResolvedValue('success');
+ 
+      const result = await executeWithAutonomy('memory_save', 3, executor);
+ 
+      expect(result.executed).toBe(true);
+      expect(result.result).toBe('success');
+      expect(executor).toHaveBeenCalled();
+    });
+ 
+    it('should not execute actions needing approval', async () => {
+      const executor = vi.fn().mockResolvedValue('success');
+ 
+      const result = await executeWithAutonomy('memory_delete', 1, executor);
+ 
+      expect(result.executed).toBe(false);
+      expect(executor).not.toHaveBeenCalled();
+      expect(result.approvalId).toBeDefined();
+    });
+ 
+    it('should call onApprovalNeeded callback', async () => {
+      const executor = vi.fn().mockResolvedValue('success');
+      const onApprovalNeeded = vi.fn();
+ 
+      await executeWithAutonomy('memory_delete', 1, executor, onApprovalNeeded);
+ 
+      expect(onApprovalNeeded).toHaveBeenCalled();
+    });
+  });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/__tests__/index.html b/desktop/coverage/src/lib/__tests__/index.html new file mode 100644 index 0000000..9d13560 --- /dev/null +++ b/desktop/coverage/src/lib/__tests__/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/lib/__tests__ + + + + + + + + + +
+
+

All files src/lib/__tests__

+
+ +
+ 0% + Statements + 0/256 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/256 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
autonomy-manager.test.ts +
+
0%0/2560%0/10%0/10%0/256
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/active-learning.ts.html b/desktop/coverage/src/lib/active-learning.ts.html new file mode 100644 index 0000000..a8c6ac0 --- /dev/null +++ b/desktop/coverage/src/lib/active-learning.ts.html @@ -0,0 +1,1180 @@ + + + + + + Code coverage report for src/lib/active-learning.ts + + + + + + + + + +
+
+

All files / src/lib active-learning.ts

+
+ +
+ 0% + Statements + 0/244 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/244 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * 主动学习引擎 - 从用户交互中学习并改进 Agent 行为
+ *
+ * 提供学习事件记录、模式提取和建议生成功能。
+ * Phase 1: 内存存储,Zustand 持久化
+ * Phase 2: SQLite + 向量化存储
+ */
+ 
+import {
+  type LearningEvent,
+  type LearningPattern,
+  type LearningSuggestion,
+  type LearningEventType,
+  type FeedbackSentiment,
+} from '../types/active-learning';
+ 
+// === 常量 ===
+ 
+const MAX_EVENTS = 1000;
+const PATTERN_CONFIDENCE_THRESHOLD = 0.7;
+const SUGGESTION_COOLDOWN_HOURS = 2;
+ 
+// === 生成 ID ===
+ 
+function generateEventId(): string {
+  return `le-${Date.now()}-${Math.random().toString(36).slice(2)}`;
+}
+ 
+// === 分析反馈情感 ===
+ 
+export function analyzeSentiment(text: string): FeedbackSentiment {
+  const positive = ['好的', '很棒', '谢谢', '完美', 'excellent', '喜欢', '爱了', 'good', 'great', 'nice', '满意'];
+  const negative = ['不好', '差', '糟糕', '错误', 'wrong', 'bad', '不喜欢', '讨厌', '问题', '失败', 'fail', 'error'];
+ 
+  const lowerText = text.toLowerCase();
+ 
+  if (positive.some(w => lowerText.includes(w.toLowerCase()))) return 'positive';
+  if (negative.some(w => lowerText.includes(w.toLowerCase()))) return 'negative';
+  return 'neutral';
+}
+ 
+// === 分析学习类型 ===
+ 
+export function analyzeEventType(text: string): LearningEventType {
+  const lowerText = text.toLowerCase();
+ 
+  if (lowerText.includes('纠正') || lowerText.includes('不对') || lowerText.includes('修改')) {
+    return 'correction';
+  }
+  if (lowerText.includes('喜欢') || lowerText.includes('偏好') || lowerText.includes('风格')) {
+    return 'preference';
+  }
+  if (lowerText.includes('场景') || lowerText.includes('上下文') || lowerText.includes('情况')) {
+    return 'context';
+  }
+  if (lowerText.includes('总是') || lowerText.includes('经常') || lowerText.includes('习惯')) {
+    return 'behavior';
+  }
+  return 'implicit';
+}
+ 
+// === 推断偏好 ===
+ 
+export function inferPreference(feedback: string, sentiment: FeedbackSentiment): string {
+  if (sentiment === 'positive') {
+    if (feedback.includes('简洁')) return '用户偏好简洁的回复';
+    if (feedback.includes('详细')) return '用户偏好详细的回复';
+    if (feedback.includes('快速')) return '用户偏好快速响应';
+    return '用户对当前回复风格满意';
+  }
+  if (sentiment === 'negative') {
+    if (feedback.includes('太长')) return '用户偏好更短的回复';
+    if (feedback.includes('太短')) return '用户偏好更详细的回复';
+    if (feedback.includes('不准确')) return '用户偏好更准确的信息';
+    return '用户对当前回复风格不满意';
+  }
+  return '用户反馈中性';
+}
+ 
+// === 学习引擎类 ===
+ 
+export class ActiveLearningEngine {
+  private events: LearningEvent[] = [];
+  private patterns: LearningPattern[] = [];
+  // Reserved for future learning suggestions feature
+  private suggestions: LearningSuggestion[] = [];
+  private initialized: boolean = false;
+ 
+  constructor() {
+    this.initialized = true;
+  }
+ 
+  /** Get current suggestions (reserved for future use) */
+  getSuggestions(): LearningSuggestion[] {
+    return this.suggestions;
+  }
+ 
+  /** Check if engine is initialized */
+  isInitialized(): boolean {
+    return this.initialized;
+  }
+ 
+  /**
+   * 记录学习事件
+   */
+  recordEvent(
+    event: Omit<LearningEvent, 'id' | 'timestamp' | 'acknowledged' | 'appliedCount'>
+  ): LearningEvent {
+    // 检查重复事件
+    const existing = this.events.find(e =>
+      e.agentId === event.agentId &&
+      e.messageId === event.messageId &&
+      e.type === event.type
+    );
+ 
+    if (existing) {
+      // 更新现有事件
+      existing.observation += ' | ' + event.observation;
+      existing.confidence = (existing.confidence + event.confidence) / 2;
+      existing.appliedCount++;
+      return existing;
+    }
+ 
+    // 创建新事件
+    const newEvent: LearningEvent = {
+      ...event,
+      id: generateEventId(),
+      timestamp: Date.now(),
+      acknowledged: false,
+      appliedCount: 0,
+    };
+ 
+    this.events.push(newEvent);
+    this.extractPatterns(newEvent);
+ 
+    // 保持事件数量限制
+    if (this.events.length > MAX_EVENTS) {
+      this.events = this.events.slice(-MAX_EVENTS);
+    }
+ 
+    return newEvent;
+  }
+ 
+  /**
+   * 从反馈中学习
+   */
+  learnFromFeedback(
+    agentId: string,
+    messageId: string,
+    feedback: string,
+    context?: string
+  ): LearningEvent {
+    const sentiment = analyzeSentiment(feedback);
+    const type = analyzeEventType(feedback);
+ 
+    return this.recordEvent({
+      type,
+      agentId,
+      messageId,
+      trigger: context || 'User feedback',
+      observation: feedback,
+      context,
+      inferredPreference: inferPreference(feedback, sentiment),
+      confidence: sentiment === 'positive' ? 0.8 : sentiment === 'negative' ? 0.5 : 0.3,
+    });
+  }
+ 
+  /**
+   * 提取学习模式
+   */
+  private extractPatterns(event: LearningEvent): void {
+    // 1. 正面反馈 -> 偏好正面回复
+    if (event.observation.includes('谢谢') || event.observation.includes('好的')) {
+      this.addPattern({
+        type: 'preference',
+        pattern: 'positive_response_preference',
+        description: '用户偏好正面回复风格',
+        examples: [event.observation],
+        confidence: 0.8,
+        agentId: event.agentId,
+      });
+    }
+ 
+    // 2. 纠正 -> 需要更精确
+    if (event.type === 'correction') {
+      this.addPattern({
+        type: 'rule',
+        pattern: 'precision_preference',
+        description: '用户对精确性有更高要求',
+        examples: [event.observation],
+        confidence: 0.9,
+        agentId: event.agentId,
+      });
+    }
+ 
+    // 3. 上下文相关 -> 场景偏好
+    if (event.context) {
+      this.addPattern({
+        type: 'context',
+        pattern: 'context_aware',
+        description: 'Agent 需要关注上下文',
+        examples: [event.context],
+        confidence: 0.6,
+        agentId: event.agentId,
+      });
+    }
+  }
+ 
+  /**
+   * 添加学习模式
+   */
+  private addPattern(pattern: Omit<LearningPattern, 'updatedAt'>): void {
+    const existing = this.patterns.find(p =>
+      p.type === pattern.type &&
+      p.pattern === pattern.pattern &&
+      p.agentId === pattern.agentId
+    );
+ 
+    if (existing) {
+      // 增强置信度
+      existing.confidence = Math.min(1, existing.confidence + pattern.confidence * 0.1);
+      existing.examples.push(pattern.examples[0]);
+      existing.updatedAt = Date.now();
+    } else {
+      this.patterns.push({
+        ...pattern,
+        updatedAt: Date.now(),
+      });
+    }
+  }
+ 
+  /**
+   * 生成学习建议
+   */
+  generateSuggestions(agentId: string): LearningSuggestion[] {
+    const suggestions: LearningSuggestion[] = [];
+    const now = Date.now();
+ 
+    // 获取该 Agent 的模式
+    const agentPatterns = this.patterns.filter(p => p.agentId === agentId);
+ 
+    for (const pattern of agentPatterns) {
+      // 检查冷却时间
+      const hoursSinceUpdate = (now - (pattern.updatedAt || now)) / (1000 * 60 * 60);
+      if (hoursSinceUpdate < SUGGESTION_COOLDOWN_HOURS) continue;
+ 
+      // 检查置信度阈值
+      if (pattern.confidence < PATTERN_CONFIDENCE_THRESHOLD) continue;
+ 
+      // 生成建议
+      suggestions.push({
+        id: `sug-${Date.now()}-${Math.random().toString(36).slice(2)}`,
+        agentId,
+        type: pattern.type,
+        pattern: pattern.pattern,
+        suggestion: this.generateSuggestionContent(pattern),
+        confidence: pattern.confidence,
+        createdAt: now,
+        expiresAt: new Date(now + 7 * 24 * 60 * 60 * 1000),
+        dismissed: false,
+      });
+    }
+ 
+    return suggestions;
+  }
+ 
+  /**
+   * 生成建议内容
+   */
+  private generateSuggestionContent(pattern: LearningPattern): string {
+    const templates: Record<string, string> = {
+      positive_response_preference:
+        '用户似乎偏好正面回复。建议在回复时保持积极和确认的语气。',
+      precision_preference:
+        '用户对精确性有更高要求。建议在提供信息时更加详细和准确。',
+      context_aware:
+        'Agent 需要关注上下文。建议在回复时考虑对话的背景和历史。',
+    };
+ 
+    return templates[pattern.pattern] || `观察到模式: ${pattern.pattern}`;
+  }
+ 
+  /**
+   * 获取统计信息
+   */
+  getStats(agentId: string) {
+    const agentEvents = this.events.filter(e => e.agentId === agentId);
+    const agentPatterns = this.patterns.filter(p => p.agentId === agentId);
+ 
+    const eventsByType: Record<LearningEventType, number> = {
+      preference: 0,
+      correction: 0,
+      context: 0,
+      feedback: 0,
+      behavior: 0,
+      implicit: 0,
+    };
+ 
+    for (const event of agentEvents) {
+      eventsByType[event.type]++;
+    }
+ 
+    return {
+      totalEvents: agentEvents.length,
+      eventsByType,
+      totalPatterns: agentPatterns.length,
+      avgConfidence: agentPatterns.length > 0
+        ? agentPatterns.reduce((sum, p) => sum + p.confidence, 0) / agentPatterns.length
+        : 0,
+    };
+  }
+ 
+  /**
+   * 获取所有事件
+   */
+  getEvents(agentId?: string): LearningEvent[] {
+    if (agentId) {
+      return this.events.filter(e => e.agentId === agentId);
+    }
+    return [...this.events];
+  }
+ 
+  /**
+   * 获取所有模式
+   */
+  getPatterns(agentId?: string): LearningPattern[] {
+    if (agentId) {
+      return this.patterns.filter(p => p.agentId === agentId);
+    }
+    return [...this.patterns];
+  }
+ 
+  /**
+   * 确认事件
+   */
+  acknowledgeEvent(eventId: string): void {
+    const event = this.events.find(e => e.id === eventId);
+    if (event) {
+      event.acknowledged = true;
+    }
+  }
+ 
+  /**
+   * 清除事件
+   */
+  clearEvents(agentId: string): void {
+    this.events = this.events.filter(e => e.agentId !== agentId);
+    this.patterns = this.patterns.filter(p => p.agentId !== agentId);
+  }
+}
+ 
+// === 单例实例 ===
+ 
+let engineInstance: ActiveLearningEngine | null = null;
+ 
+export function getActiveLearningEngine(): ActiveLearningEngine {
+  if (!engineInstance) {
+    engineInstance = new ActiveLearningEngine();
+  }
+  return engineInstance;
+}
+ 
+export function resetActiveLearningEngine(): void {
+  engineInstance = null;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/agent-swarm.ts.html b/desktop/coverage/src/lib/agent-swarm.ts.html new file mode 100644 index 0000000..d49c9cf --- /dev/null +++ b/desktop/coverage/src/lib/agent-swarm.ts.html @@ -0,0 +1,1732 @@ + + + + + + Code coverage report for src/lib/agent-swarm.ts + + + + + + + + + +
+
+

All files / src/lib agent-swarm.ts

+
+ +
+ 0% + Statements + 0/341 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/341 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Agent Swarm - Multi-Agent collaboration framework for ZCLAW
+ *
+ * Enables multiple agents (clones) to collaborate on complex tasks through:
+ * - Sequential: Agents process in chain, each building on the previous
+ * - Parallel: Agents work simultaneously on different subtasks
+ * - Debate: Agents provide competing perspectives, coordinator synthesizes
+ *
+ * Integrates with existing Clone/Agent infrastructure via agentStore/gatewayStore.
+ *
+ * Reference: ZCLAW_AGENT_INTELLIGENCE_EVOLUTION.md §6.5.1
+ */
+ 
+import { intelligenceClient } from './intelligence-client';
+ 
+// === Types ===
+ 
+export type CommunicationStyle = 'sequential' | 'parallel' | 'debate';
+export type TaskDecomposition = 'auto' | 'manual';
+export type SubtaskStatus = 'pending' | 'running' | 'done' | 'failed';
+export type SwarmTaskStatus = 'planning' | 'executing' | 'aggregating' | 'done' | 'failed';
+ 
+export interface SwarmSpecialist {
+  agentId: string;
+  role: string;
+  capabilities: string[];
+  model?: string;
+}
+ 
+export interface SwarmConfig {
+  coordinator: string;
+  specialists: SwarmSpecialist[];
+  taskDecomposition: TaskDecomposition;
+  communicationStyle: CommunicationStyle;
+  maxRoundsDebate: number;
+  timeoutPerSubtaskMs: number;
+}
+ 
+export interface Subtask {
+  id: string;
+  assignedTo: string;
+  description: string;
+  status: SubtaskStatus;
+  result?: string;
+  error?: string;
+  startedAt?: string;
+  completedAt?: string;
+  round?: number;
+}
+ 
+export interface SwarmTask {
+  id: string;
+  description: string;
+  subtasks: Subtask[];
+  status: SwarmTaskStatus;
+  communicationStyle: CommunicationStyle;
+  finalResult?: string;
+  createdAt: string;
+  completedAt?: string;
+  metadata?: Record<string, unknown>;
+}
+ 
+export interface SwarmExecutionResult {
+  task: SwarmTask;
+  summary: string;
+  participantCount: number;
+  totalDurationMs: number;
+}
+ 
+export type AgentExecutor = (
+  agentId: string,
+  prompt: string,
+  context?: string
+) => Promise<string>;
+ 
+// === Default Config ===
+ 
+export const DEFAULT_SWARM_CONFIG: SwarmConfig = {
+  coordinator: 'zclaw-main',
+  specialists: [],
+  taskDecomposition: 'auto',
+  communicationStyle: 'sequential',
+  maxRoundsDebate: 3,
+  timeoutPerSubtaskMs: 60_000,
+};
+ 
+// === Storage ===
+ 
+const SWARM_HISTORY_KEY = 'zclaw-swarm-history';
+ 
+// === Swarm Engine ===
+ 
+export class AgentSwarm {
+  private config: SwarmConfig;
+  private history: SwarmTask[] = [];
+  private executor: AgentExecutor | null = null;
+ 
+  constructor(config?: Partial<SwarmConfig>) {
+    this.config = { ...DEFAULT_SWARM_CONFIG, ...config };
+    this.loadHistory();
+  }
+ 
+  /**
+   * Set the executor function used to dispatch prompts to individual agents.
+   * This decouples the swarm from the gateway transport layer.
+   */
+  setExecutor(executor: AgentExecutor): void {
+    this.executor = executor;
+  }
+ 
+  // === Task Creation ===
+ 
+  /**
+   * Create a new swarm task. If taskDecomposition is 'auto', subtasks are
+   * generated based on specialist capabilities and the task description.
+   */
+  createTask(
+    description: string,
+    options?: {
+      subtasks?: Array<{ assignedTo: string; description: string }>;
+      communicationStyle?: CommunicationStyle;
+      metadata?: Record<string, unknown>;
+    }
+  ): SwarmTask {
+    const style = options?.communicationStyle || this.config.communicationStyle;
+    const taskId = `swarm_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
+ 
+    let subtasks: Subtask[];
+ 
+    if (options?.subtasks && options.subtasks.length > 0) {
+      // Manual decomposition
+      subtasks = options.subtasks.map((st, i) => ({
+        id: `${taskId}_sub_${i}`,
+        assignedTo: st.assignedTo,
+        description: st.description,
+        status: 'pending' as SubtaskStatus,
+      }));
+    } else {
+      // Auto decomposition based on specialists
+      subtasks = this.autoDecompose(taskId, description, style);
+    }
+ 
+    const task: SwarmTask = {
+      id: taskId,
+      description,
+      subtasks,
+      status: 'planning',
+      communicationStyle: style,
+      createdAt: new Date().toISOString(),
+      metadata: options?.metadata,
+    };
+ 
+    return task;
+  }
+ 
+  /**
+   * Execute a swarm task using the configured communication style.
+   */
+  async execute(task: SwarmTask): Promise<SwarmExecutionResult> {
+    if (!this.executor) {
+      throw new Error('[AgentSwarm] No executor set. Call setExecutor() first.');
+    }
+ 
+    const startTime = Date.now();
+    task.status = 'executing';
+ 
+    try {
+      switch (task.communicationStyle) {
+        case 'sequential':
+          await this.executeSequential(task);
+          break;
+        case 'parallel':
+          await this.executeParallel(task);
+          break;
+        case 'debate':
+          await this.executeDebate(task);
+          break;
+      }
+ 
+      // Aggregation phase
+      task.status = 'aggregating';
+      task.finalResult = await this.aggregate(task);
+      task.status = 'done';
+      task.completedAt = new Date().toISOString();
+    } catch (err) {
+      task.status = 'failed';
+      task.finalResult = `执行失败: ${err instanceof Error ? err.message : String(err)}`;
+      task.completedAt = new Date().toISOString();
+    }
+ 
+    const totalDurationMs = Date.now() - startTime;
+ 
+    // Store in history
+    this.history.push(task);
+    if (this.history.length > 50) {
+      this.history = this.history.slice(-25);
+    }
+    this.saveHistory();
+ 
+    // Save task result as memory
+    try {
+      await intelligenceClient.memory.store({
+        agent_id: this.config.coordinator,
+        memory_type: 'lesson',
+        content: `协作任务完成: "${task.description}" — ${task.subtasks.length}个子任务, 模式: ${task.communicationStyle}, 结果: ${(task.finalResult || '').slice(0, 200)}`,
+        importance: 6,
+        source: 'auto',
+        tags: ['swarm', task.communicationStyle],
+      });
+    } catch { /* non-critical */ }
+ 
+    const result: SwarmExecutionResult = {
+      task,
+      summary: task.finalResult || '',
+      participantCount: new Set(task.subtasks.map(s => s.assignedTo)).size,
+      totalDurationMs,
+    };
+ 
+    console.log(
+      `[AgentSwarm] Task "${task.description}" completed in ${totalDurationMs}ms, ` +
+      `${result.participantCount} participants, ${task.subtasks.length} subtasks`
+    );
+ 
+    return result;
+  }
+ 
+  // === Execution Strategies ===
+ 
+  /**
+   * Sequential: Each agent runs in order, receiving the previous agent's output as context.
+   */
+  private async executeSequential(task: SwarmTask): Promise<void> {
+    let previousResult = '';
+ 
+    for (const subtask of task.subtasks) {
+      subtask.status = 'running';
+      subtask.startedAt = new Date().toISOString();
+ 
+      try {
+        const context = previousResult
+          ? `前一个Agent的输出:\n${previousResult}\n\n请基于以上内容继续完成你的部分。`
+          : '';
+ 
+        const result = await this.executeSubtask(subtask, context);
+        subtask.result = result;
+        subtask.status = 'done';
+        previousResult = result;
+      } catch (err) {
+        subtask.status = 'failed';
+        subtask.error = err instanceof Error ? err.message : String(err);
+      }
+ 
+      subtask.completedAt = new Date().toISOString();
+    }
+  }
+ 
+  /**
+   * Parallel: All agents run simultaneously, results collected independently.
+   */
+  private async executeParallel(task: SwarmTask): Promise<void> {
+    const promises = task.subtasks.map(async (subtask) => {
+      subtask.status = 'running';
+      subtask.startedAt = new Date().toISOString();
+ 
+      try {
+        const result = await this.executeSubtask(subtask);
+        subtask.result = result;
+        subtask.status = 'done';
+      } catch (err) {
+        subtask.status = 'failed';
+        subtask.error = err instanceof Error ? err.message : String(err);
+      }
+ 
+      subtask.completedAt = new Date().toISOString();
+    });
+ 
+    await Promise.allSettled(promises);
+  }
+ 
+  /**
+   * Debate: All agents respond to the same prompt in multiple rounds.
+   * Each round, agents can see previous round results.
+   */
+  private async executeDebate(task: SwarmTask): Promise<void> {
+    const maxRounds = this.config.maxRoundsDebate;
+    const agents = [...new Set(task.subtasks.map(s => s.assignedTo))];
+ 
+    for (let round = 1; round <= maxRounds; round++) {
+      const roundContext = round > 1
+        ? this.buildDebateContext(task, round - 1)
+        : '';
+ 
+      const roundPromises = agents.map(async (agentId) => {
+        const subtaskId = `${task.id}_debate_r${round}_${agentId}`;
+        const subtask: Subtask = {
+          id: subtaskId,
+          assignedTo: agentId,
+          description: task.description,
+          status: 'running',
+          startedAt: new Date().toISOString(),
+          round,
+        };
+ 
+        try {
+          const prompt = round === 1
+            ? task.description
+            : `这是第${round}轮讨论。请参考其他Agent的观点,给出你的更新后的分析。\n\n${roundContext}`;
+ 
+          const result = await this.executeSubtask(subtask, '', prompt);
+          subtask.result = result;
+          subtask.status = 'done';
+        } catch (err) {
+          subtask.status = 'failed';
+          subtask.error = err instanceof Error ? err.message : String(err);
+        }
+ 
+        subtask.completedAt = new Date().toISOString();
+        task.subtasks.push(subtask);
+      });
+ 
+      await Promise.allSettled(roundPromises);
+ 
+      // Check if consensus reached (all agents give similar answers)
+      if (round < maxRounds && this.checkConsensus(task, round)) {
+        console.log(`[AgentSwarm] Debate consensus reached at round ${round}`);
+        break;
+      }
+    }
+  }
+ 
+  // === Helpers ===
+ 
+  private async executeSubtask(
+    subtask: Subtask,
+    context?: string,
+    promptOverride?: string
+  ): Promise<string> {
+    if (!this.executor) throw new Error('No executor');
+ 
+    const prompt = promptOverride || subtask.description;
+    return this.executor(subtask.assignedTo, prompt, context);
+  }
+ 
+  /**
+   * Auto-decompose a task into subtasks based on specialist roles.
+   */
+  private autoDecompose(
+    taskId: string,
+    description: string,
+    style: CommunicationStyle
+  ): Subtask[] {
+    const specialists = this.config.specialists;
+ 
+    if (specialists.length === 0) {
+      // Single agent fallback
+      return [{
+        id: `${taskId}_sub_0`,
+        assignedTo: this.config.coordinator,
+        description,
+        status: 'pending',
+      }];
+    }
+ 
+    if (style === 'debate') {
+      // In debate mode, all specialists get the same task
+      return specialists.map((spec, i) => ({
+        id: `${taskId}_sub_${i}`,
+        assignedTo: spec.agentId,
+        description: `作为${spec.role},请分析以下问题: ${description}`,
+        status: 'pending' as SubtaskStatus,
+        round: 1,
+      }));
+    }
+ 
+    if (style === 'parallel') {
+      // In parallel, assign based on capabilities
+      return specialists.map((spec, i) => ({
+        id: `${taskId}_sub_${i}`,
+        assignedTo: spec.agentId,
+        description: `从${spec.role}的角度完成: ${description}`,
+        status: 'pending' as SubtaskStatus,
+      }));
+    }
+ 
+    // Sequential: chain through specialists
+    return specialists.map((spec, i) => ({
+      id: `${taskId}_sub_${i}`,
+      assignedTo: spec.agentId,
+      description: i === 0
+        ? `作为${spec.role},请首先分析: ${description}`
+        : `作为${spec.role},请基于前一位同事的分析继续深化: ${description}`,
+      status: 'pending' as SubtaskStatus,
+    }));
+  }
+ 
+  private buildDebateContext(task: SwarmTask, upToRound: number): string {
+    const roundSubtasks = task.subtasks.filter(
+      s => s.round && s.round <= upToRound && s.status === 'done'
+    );
+ 
+    if (roundSubtasks.length === 0) return '';
+ 
+    const lines = roundSubtasks.map(s => {
+      const specialist = this.config.specialists.find(sp => sp.agentId === s.assignedTo);
+      const role = specialist?.role || s.assignedTo;
+      return `**${role}** (第${s.round}轮):\n${s.result || '(无输出)'}`;
+    });
+ 
+    return `其他Agent的观点:\n\n${lines.join('\n\n---\n\n')}`;
+  }
+ 
+  private checkConsensus(task: SwarmTask, round: number): boolean {
+    const roundResults = task.subtasks
+      .filter(s => s.round === round && s.status === 'done' && s.result)
+      .map(s => s.result!);
+ 
+    if (roundResults.length < 2) return false;
+ 
+    // Simple heuristic: if all results share > 60% keywords, consider consensus
+    const tokenSets = roundResults.map(r =>
+      new Set(r.toLowerCase().split(/[\s,;.!?。,;!?]+/).filter(t => t.length > 1))
+    );
+ 
+    for (let i = 1; i < tokenSets.length; i++) {
+      const common = [...tokenSets[0]].filter(t => tokenSets[i].has(t));
+      const similarity = (2 * common.length) / (tokenSets[0].size + tokenSets[i].size);
+      if (similarity < 0.6) return false;
+    }
+ 
+    return true;
+  }
+ 
+  /**
+   * Aggregate subtask results into a final summary.
+   * Phase 4: rule-based. Future: LLM-powered synthesis.
+   */
+  private async aggregate(task: SwarmTask): Promise<string> {
+    const completedSubtasks = task.subtasks.filter(s => s.status === 'done' && s.result);
+    const failedSubtasks = task.subtasks.filter(s => s.status === 'failed');
+ 
+    if (completedSubtasks.length === 0) {
+      return failedSubtasks.length > 0
+        ? `所有子任务失败: ${failedSubtasks.map(s => s.error).join('; ')}`
+        : '无结果';
+    }
+ 
+    const sections: string[] = [];
+    sections.push(`## 协作任务: ${task.description}`);
+    sections.push(`**模式**: ${task.communicationStyle} | **参与者**: ${new Set(completedSubtasks.map(s => s.assignedTo)).size}`);
+ 
+    if (task.communicationStyle === 'debate') {
+      // Group by round
+      const maxRound = Math.max(...completedSubtasks.map(s => s.round || 1));
+      for (let r = 1; r <= maxRound; r++) {
+        const roundResults = completedSubtasks.filter(s => s.round === r);
+        if (roundResults.length > 0) {
+          sections.push(`\n### 第${r}轮讨论`);
+          for (const s of roundResults) {
+            const spec = this.config.specialists.find(sp => sp.agentId === s.assignedTo);
+            sections.push(`**${spec?.role || s.assignedTo}**:\n${s.result}`);
+          }
+        }
+      }
+    } else {
+      for (const s of completedSubtasks) {
+        const spec = this.config.specialists.find(sp => sp.agentId === s.assignedTo);
+        sections.push(`\n### ${spec?.role || s.assignedTo}\n${s.result}`);
+      }
+    }
+ 
+    if (failedSubtasks.length > 0) {
+      sections.push(`\n### 失败的子任务 (${failedSubtasks.length})`);
+      for (const s of failedSubtasks) {
+        sections.push(`- ${s.assignedTo}: ${s.error}`);
+      }
+    }
+ 
+    return sections.join('\n');
+  }
+ 
+  // === Query ===
+ 
+  getHistory(limit: number = 20): SwarmTask[] {
+    return this.history.slice(-limit);
+  }
+ 
+  getTask(taskId: string): SwarmTask | undefined {
+    return this.history.find(t => t.id === taskId);
+  }
+ 
+  getSpecialists(): SwarmSpecialist[] {
+    return [...this.config.specialists];
+  }
+ 
+  addSpecialist(specialist: SwarmSpecialist): void {
+    const existing = this.config.specialists.findIndex(s => s.agentId === specialist.agentId);
+    if (existing >= 0) {
+      this.config.specialists[existing] = specialist;
+    } else {
+      this.config.specialists.push(specialist);
+    }
+  }
+ 
+  removeSpecialist(agentId: string): void {
+    this.config.specialists = this.config.specialists.filter(s => s.agentId !== agentId);
+  }
+ 
+  // === Config ===
+ 
+  getConfig(): SwarmConfig {
+    return { ...this.config, specialists: [...this.config.specialists] };
+  }
+ 
+  updateConfig(updates: Partial<SwarmConfig>): void {
+    this.config = { ...this.config, ...updates };
+  }
+ 
+  // === Persistence ===
+ 
+  private loadHistory(): void {
+    try {
+      const raw = localStorage.getItem(SWARM_HISTORY_KEY);
+      if (raw) this.history = JSON.parse(raw);
+    } catch {
+      this.history = [];
+    }
+  }
+ 
+  private saveHistory(): void {
+    try {
+      localStorage.setItem(SWARM_HISTORY_KEY, JSON.stringify(this.history.slice(-25)));
+    } catch { /* silent */ }
+  }
+}
+ 
+// === Singleton ===
+ 
+let _instance: AgentSwarm | null = null;
+ 
+export function getAgentSwarm(config?: Partial<SwarmConfig>): AgentSwarm {
+  if (!_instance) {
+    _instance = new AgentSwarm(config);
+  }
+  return _instance;
+}
+ 
+export function resetAgentSwarm(): void {
+  _instance = null;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/animations.ts.html b/desktop/coverage/src/lib/animations.ts.html new file mode 100644 index 0000000..d549eca --- /dev/null +++ b/desktop/coverage/src/lib/animations.ts.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/lib/animations.ts + + + + + + + + + +
+
+

All files / src/lib animations.ts

+
+ +
+ 0% + Statements + 0/43 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Variants, Transition } from 'framer-motion';
+ 
+// Page transition animations
+export const pageVariants: Variants = {
+  initial: { opacity: 0, y: 10 },
+  animate: { opacity: 1, y: 0 },
+  exit: { opacity: 0, y: -10 },
+};
+ 
+// List item stagger animations
+export const listItemVariants: Variants = {
+  hidden: { opacity: 0, x: -10 },
+  visible: { opacity: 1, x: 0 },
+};
+ 
+// Container stagger animations
+export const containerVariants: Variants = {
+  hidden: { opacity: 0 },
+  visible: {
+    opacity: 1,
+    transition: {
+      staggerChildren: 0.05,
+    },
+  },
+  exit: {
+    opacity: 0,
+    transition: {
+      duration: 0.1,
+    },
+  },
+};
+ 
+// Fade in animations
+export const fadeInVariants: Variants = {
+  initial: { opacity: 0 },
+  animate: { opacity: 1 },
+  exit: { opacity: 0 },
+};
+ 
+// Button tap animation
+export const buttonTap = { scale: 0.98 };
+ 
+// Card hover animation
+export const cardHover = { y: -2, boxShadow: '0 10px 25px -5px rgb(0 0 0 / 0.1)' };
+ 
+// Default transition config
+export const defaultTransition: Transition = {
+  duration: 0.2,
+  ease: [0.4, 0, 0.2, 1],
+};
+ 
+// Fast transition
+export const fastTransition: Transition = {
+  duration: 0.15,
+  ease: [0.4, 0, 0.2, 1],
+};
+ 
+// Slow transition
+export const slowTransition: Transition = {
+  duration: 0.3,
+  ease: [0.4, 0, 0.2, 1],
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/api-fallbacks.ts.html b/desktop/coverage/src/lib/api-fallbacks.ts.html new file mode 100644 index 0000000..8c21198 --- /dev/null +++ b/desktop/coverage/src/lib/api-fallbacks.ts.html @@ -0,0 +1,967 @@ + + + + + + Code coverage report for src/lib/api-fallbacks.ts + + + + + + + + + +
+
+

All files / src/lib api-fallbacks.ts

+
+ +
+ 5.83% + Statements + 8/137 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 5.83% + Lines + 8/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * API Fallbacks for ZCLAW Gateway
+ *
+ * Provides sensible default data when OpenFang API endpoints return 404.
+ * This allows the UI to function gracefully even when backend features
+ * are not yet implemented.
+ */
+ 
+// === Types ===
+ 
+export interface QuickConfigFallback {
+  agentName: string;
+  agentRole: string;
+  userName: string;
+  userRole: string;
+  agentNickname?: string;
+  scenarios?: string[];
+  workspaceDir?: string;
+  gatewayUrl?: string;
+  gatewayToken?: string;
+  skillsExtraDirs?: string[];
+  mcpServices?: Array<{ id: string; name: string; enabled: boolean }>;
+  theme: 'light' | 'dark';
+  autoStart?: boolean;
+  showToolCalls: boolean;
+  restrictFiles?: boolean;
+  autoSaveContext?: boolean;
+  fileWatching?: boolean;
+  privacyOptIn?: boolean;
+}
+ 
+export interface WorkspaceInfoFallback {
+  path: string;
+  resolvedPath: string;
+  exists: boolean;
+  fileCount: number;
+  totalSize: number;
+}
+ 
+export interface UsageStatsFallback {
+  totalSessions: number;
+  totalMessages: number;
+  totalTokens: number;
+  byModel: Record<string, { messages: number; inputTokens: number; outputTokens: number }>;
+}
+ 
+export interface PluginStatusFallback {
+  id: string;
+  name?: string;
+  status: 'active' | 'inactive' | 'error' | 'loading';
+  version?: string;
+  description?: string;
+}
+ 
+export interface ScheduledTaskFallback {
+  id: string;
+  name: string;
+  schedule: string;
+  status: 'active' | 'paused' | 'completed' | 'error';
+  lastRun?: string;
+  nextRun?: string;
+  description?: string;
+}
+ 
+export interface SecurityLayerFallback {
+  name: string;
+  enabled: boolean;
+  description?: string;
+}
+ 
+export interface SecurityStatusFallback {
+  layers: SecurityLayerFallback[];
+  enabledCount: number;
+  totalCount: number;
+  securityLevel: 'critical' | 'high' | 'medium' | 'low';
+}
+ 
+// Session type for usage calculation
+interface SessionForStats {
+  id: string;
+  messageCount?: number;
+  metadata?: {
+    tokens?: { input?: number; output?: number };
+    model?: string;
+  };
+}
+ 
+// Skill type for plugin fallback
+interface SkillForPlugins {
+  id: string;
+  name: string;
+  source: 'builtin' | 'extra';
+  enabled?: boolean;
+  description?: string;
+}
+ 
+// Trigger type for scheduled tasks
+interface TriggerForTasks {
+  id: string;
+  type: string;
+  enabled: boolean;
+}
+ 
+// === Fallback Implementations ===
+ 
+/**
+ * Default quick config when /api/config/quick returns 404.
+ * Uses sensible defaults for a new user experience.
+ */
+export function getQuickConfigFallback(): QuickConfigFallback {
+  return {
+    agentName: '默认助手',
+    agentRole: 'AI 助手',
+    userName: '用户',
+    userRole: '用户',
+    agentNickname: 'ZCLAW',
+    scenarios: ['通用对话', '代码助手', '文档编写'],
+    theme: 'dark',
+    showToolCalls: true,
+    autoSaveContext: true,
+    fileWatching: true,
+    privacyOptIn: false,
+  };
+}
+ 
+/**
+ * Default workspace info when /api/workspace returns 404.
+ * Returns a placeholder indicating workspace is not configured.
+ */
+export function getWorkspaceInfoFallback(): WorkspaceInfoFallback {
+  // Try to get a reasonable default path
+  const defaultPath = typeof window !== 'undefined'
+    ? `${navigator.userAgent.includes('Windows') ? 'C:\\Users' : '/home'}/workspace`
+    : '/workspace';
+ 
+  return {
+    path: defaultPath,
+    resolvedPath: defaultPath,
+    exists: false,
+    fileCount: 0,
+    totalSize: 0,
+  };
+}
+ 
+/**
+ * Calculate usage stats from session data when /api/stats/usage returns 404.
+ */
+export function getUsageStatsFallback(sessions: SessionForStats[] = []): UsageStatsFallback {
+  const stats: UsageStatsFallback = {
+    totalSessions: sessions.length,
+    totalMessages: 0,
+    totalTokens: 0,
+    byModel: {},
+  };
+ 
+  for (const session of sessions) {
+    stats.totalMessages += session.messageCount || 0;
+ 
+    if (session.metadata?.tokens) {
+      const input = session.metadata.tokens.input || 0;
+      const output = session.metadata.tokens.output || 0;
+      stats.totalTokens += input + output;
+ 
+      if (session.metadata.model) {
+        const model = session.metadata.model;
+        if (!stats.byModel[model]) {
+          stats.byModel[model] = { messages: 0, inputTokens: 0, outputTokens: 0 };
+        }
+        stats.byModel[model].messages += session.messageCount || 0;
+        stats.byModel[model].inputTokens += input;
+        stats.byModel[model].outputTokens += output;
+      }
+    }
+  }
+ 
+  return stats;
+}
+ 
+/**
+ * Convert skills to plugin status when /api/plugins/status returns 404.
+ * OpenFang uses Skills instead of traditional plugins.
+ */
+export function getPluginStatusFallback(skills: SkillForPlugins[] = []): PluginStatusFallback[] {
+  if (skills.length === 0) {
+    // Return default built-in skills if none provided
+    return [
+      { id: 'builtin-chat', name: 'Chat', status: 'active', description: '基础对话能力' },
+      { id: 'builtin-code', name: 'Code', status: 'active', description: '代码生成与分析' },
+      { id: 'builtin-file', name: 'File', status: 'active', description: '文件操作能力' },
+    ];
+  }
+ 
+  return skills.map((skill) => ({
+    id: skill.id,
+    name: skill.name,
+    status: skill.enabled !== false ? 'active' : 'inactive',
+    description: skill.description,
+  }));
+}
+ 
+/**
+ * Convert triggers to scheduled tasks when /api/scheduler/tasks returns 404.
+ */
+export function getScheduledTasksFallback(triggers: TriggerForTasks[] = []): ScheduledTaskFallback[] {
+  return triggers
+    .filter((t) => t.enabled)
+    .map((trigger) => ({
+      id: trigger.id,
+      name: `Trigger: ${trigger.type}`,
+      schedule: 'event-based',
+      status: 'active' as const,
+      description: `Event trigger of type: ${trigger.type}`,
+    }));
+}
+ 
+/**
+ * Default security status when /api/security/status returns 404.
+ * OpenFang has 16 security layers - show them with conservative defaults.
+ */
+export function getSecurityStatusFallback(): SecurityStatusFallback {
+  const layers: SecurityLayerFallback[] = [
+    { name: 'Input Validation', enabled: true, description: '输入验证' },
+    { name: 'Output Sanitization', enabled: true, description: '输出净化' },
+    { name: 'Rate Limiting', enabled: true, description: '速率限制' },
+    { name: 'Authentication', enabled: true, description: '身份认证' },
+    { name: 'Authorization', enabled: true, description: '权限控制' },
+    { name: 'Encryption', enabled: true, description: '数据加密' },
+    { name: 'Audit Logging', enabled: true, description: '审计日志' },
+    { name: 'Sandboxing', enabled: false, description: '沙箱隔离' },
+    { name: 'Network Isolation', enabled: false, description: '网络隔离' },
+    { name: 'Resource Limits', enabled: true, description: '资源限制' },
+    { name: 'Secret Management', enabled: true, description: '密钥管理' },
+    { name: 'Certificate Pinning', enabled: false, description: '证书固定' },
+    { name: 'Code Signing', enabled: false, description: '代码签名' },
+    { name: 'Secure Boot', enabled: false, description: '安全启动' },
+    { name: 'TPM Integration', enabled: false, description: 'TPM 集成' },
+    { name: 'Zero Trust', enabled: false, description: '零信任' },
+  ];
+ 
+  const enabledCount = layers.filter((l) => l.enabled).length;
+  const securityLevel = calculateSecurityLevel(enabledCount, layers.length);
+ 
+  return {
+    layers,
+    enabledCount,
+    totalCount: layers.length,
+    securityLevel,
+  };
+}
+ 
+/**
+ * Calculate security level based on enabled layers ratio.
+ */
+function calculateSecurityLevel(enabledCount: number, totalCount: number): 'critical' | 'high' | 'medium' | 'low' {
+  if (totalCount === 0) return 'low';
+  const ratio = enabledCount / totalCount;
+  if (ratio >= 0.875) return 'critical'; // 14-16 layers
+  if (ratio >= 0.625) return 'high';     // 10-13 layers
+  if (ratio >= 0.375) return 'medium';   // 6-9 layers
+  return 'low';                          // 0-5 layers
+}
+ 
+// === Error Detection Helpers ===
+ 
+/**
+ * Check if an error is a 404 Not Found response.
+ */
+export function isNotFoundError(error: unknown): boolean {
+  if (error instanceof Error) {
+    const message = error.message.toLowerCase();
+    return message.includes('404') || message.includes('not found');
+  }
+  if (typeof error === 'object' && error !== null) {
+    const status = (error as { status?: number }).status;
+    return status === 404;
+  }
+  return false;
+}
+ 
+/**
+ * Check if an error is a network/connection error.
+ */
+export function isNetworkError(error: unknown): boolean {
+  if (error instanceof Error) {
+    const message = error.message.toLowerCase();
+    return (
+      message.includes('network') ||
+      message.includes('connection') ||
+      message.includes('timeout') ||
+      message.includes('abort')
+    );
+  }
+  return false;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/api-key-storage.ts.html b/desktop/coverage/src/lib/api-key-storage.ts.html new file mode 100644 index 0000000..f4ac2f6 --- /dev/null +++ b/desktop/coverage/src/lib/api-key-storage.ts.html @@ -0,0 +1,1513 @@ + + + + + + Code coverage report for src/lib/api-key-storage.ts + + + + + + + + + +
+
+

All files / src/lib api-key-storage.ts

+
+ +
+ 0% + Statements + 0/251 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/251 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Secure API Key Storage
+ *
+ * Provides secure storage for API keys and sensitive credentials.
+ * Uses OS keychain when available, with encrypted localStorage fallback.
+ *
+ * Security features:
+ * - Keys stored in OS keychain (Windows DPAPI, macOS Keychain, Linux Secret Service)
+ * - Encrypted backup in localStorage for migration support
+ * - Key validation and format checking
+ * - Audit logging for key access
+ * - Support for multiple API key types
+ */
+ 
+import { secureStorage, isSecureStorageAvailable } from './secure-storage';
+import { hashSha256 } from './crypto-utils';
+ 
+// Storage key prefixes
+const API_KEY_PREFIX = 'zclaw_api_key_';
+const API_KEY_META_PREFIX = 'zclaw_api_key_meta_';
+ 
+/**
+ * Supported API key types
+ */
+export type ApiKeyType =
+  | 'openai'
+  | 'anthropic'
+  | 'google'
+  | 'deepseek'
+  | 'zhipu'
+  | 'moonshot'
+  | 'custom';
+ 
+/**
+ * API key metadata
+ */
+export interface ApiKeyMetadata {
+  type: ApiKeyType;
+  name: string;
+  description?: string;
+  createdAt: number;
+  updatedAt: number;
+  lastUsedAt?: number;
+  keyHash: string; // Partial hash for validation
+  prefix: string; // First 8 characters for display
+  isValid?: boolean;
+}
+ 
+/**
+ * API key entry with metadata
+ */
+export interface ApiKeyEntry {
+  key: string;
+  metadata: ApiKeyMetadata;
+}
+ 
+/**
+ * Validation rules for different API key types
+ */
+const KEY_VALIDATION_RULES: Record<ApiKeyType, {
+  pattern: RegExp;
+  minLength: number;
+  maxLength: number;
+  prefix?: string[];
+}> = {
+  openai: {
+    pattern: /^sk-[A-Za-z0-9_-]{20,}$/,
+    minLength: 20,
+    maxLength: 200,
+    prefix: ['sk-'],
+  },
+  anthropic: {
+    pattern: /^sk-ant-[A-Za-z0-9_-]{20,}$/,
+    minLength: 20,
+    maxLength: 200,
+    prefix: ['sk-ant-'],
+  },
+  google: {
+    pattern: /^AIza[A-Za-z0-9_-]{35}$/,
+    minLength: 35,
+    maxLength: 50,
+    prefix: ['AIza'],
+  },
+  deepseek: {
+    pattern: /^sk-[A-Za-z0-9]{20,}$/,
+    minLength: 20,
+    maxLength: 100,
+    prefix: ['sk-'],
+  },
+  zhipu: {
+    pattern: /^[A-Za-z0-9_.-]{20,}$/,
+    minLength: 20,
+    maxLength: 100,
+  },
+  moonshot: {
+    pattern: /^sk-[A-Za-z0-9]{20,}$/,
+    minLength: 20,
+    maxLength: 100,
+    prefix: ['sk-'],
+  },
+  custom: {
+    pattern: /^.{8,}$/,
+    minLength: 8,
+    maxLength: 500,
+  },
+};
+ 
+/**
+ * Validate an API key format
+ *
+ * @param type - The API key type
+ * @param key - The API key to validate
+ * @returns True if the key format is valid
+ */
+export function validateApiKeyFormat(type: ApiKeyType, key: string): {
+  valid: boolean;
+  error?: string;
+} {
+  const rules = KEY_VALIDATION_RULES[type];
+ 
+  if (!key || typeof key !== 'string') {
+    return { valid: false, error: 'API key is required' };
+  }
+ 
+  // Trim whitespace
+  const trimmedKey = key.trim();
+ 
+  if (trimmedKey.length < rules.minLength) {
+    return {
+      valid: false,
+      error: `API key too short (minimum ${rules.minLength} characters)`,
+    };
+  }
+ 
+  if (trimmedKey.length > rules.maxLength) {
+    return {
+      valid: false,
+      error: `API key too long (maximum ${rules.maxLength} characters)`,
+    };
+  }
+ 
+  if (!rules.pattern.test(trimmedKey)) {
+    return {
+      valid: false,
+      error: `Invalid API key format for type: ${type}`,
+    };
+  }
+ 
+  if (rules.prefix && !rules.prefix.some(p => trimmedKey.startsWith(p))) {
+    return {
+      valid: false,
+      error: `API key must start with: ${rules.prefix.join(' or ')}`,
+    };
+  }
+ 
+  return { valid: true };
+}
+ 
+/**
+ * Create a partial hash for key validation
+ * Uses first 8 characters for identification without exposing full key
+ */
+async function createKeyHash(key: string): Promise<string> {
+  // Use partial hash for validation
+  const partialKey = key.slice(0, 8) + key.slice(-4);
+  return hashSha256(partialKey);
+}
+ 
+/**
+ * Store an API key securely
+ *
+ * @param type - The API key type
+ * @param key - The API key value
+ * @param options - Optional metadata
+ */
+export async function storeApiKey(
+  type: ApiKeyType,
+  key: string,
+  options?: {
+    name?: string;
+    description?: string;
+  }
+): Promise<ApiKeyMetadata> {
+  // Validate key format
+  const validation = validateApiKeyFormat(type, key);
+  if (!validation.valid) {
+    throw new Error(validation.error);
+  }
+ 
+  const trimmedKey = key.trim();
+  const now = Date.now();
+  const keyHash = await createKeyHash(trimmedKey);
+ 
+  const metadata: ApiKeyMetadata = {
+    type,
+    name: options?.name || `${type}_api_key`,
+    description: options?.description,
+    createdAt: now,
+    updatedAt: now,
+    keyHash,
+    prefix: trimmedKey.slice(0, 8) + '...',
+    isValid: true,
+  };
+ 
+  // Store key in secure storage
+  const storageKey = API_KEY_PREFIX + type;
+  await secureStorage.set(storageKey, trimmedKey);
+ 
+  // Store metadata in localStorage (non-sensitive)
+  localStorage.setItem(
+    API_KEY_META_PREFIX + type,
+    JSON.stringify(metadata)
+  );
+ 
+  // Log security event
+  logSecurityEvent('api_key_stored', { type, prefix: metadata.prefix });
+ 
+  return metadata;
+}
+ 
+/**
+ * Retrieve an API key from secure storage
+ *
+ * @param type - The API key type
+ * @returns The API key or null if not found
+ */
+export async function getApiKey(type: ApiKeyType): Promise<string | null> {
+  const storageKey = API_KEY_PREFIX + type;
+  const key = await secureStorage.get(storageKey);
+ 
+  if (!key) {
+    return null;
+  }
+ 
+  // Validate key still matches stored hash
+  const metaJson = localStorage.getItem(API_KEY_META_PREFIX + type);
+  if (metaJson) {
+    try {
+      const metadata: ApiKeyMetadata = JSON.parse(metaJson);
+      const currentHash = await createKeyHash(key);
+ 
+      if (currentHash !== metadata.keyHash) {
+        console.error('[ApiKeyStorage] Key hash mismatch - possible tampering');
+        logSecurityEvent('api_key_hash_mismatch', { type });
+        return null;
+      }
+ 
+      // Update last used timestamp
+      metadata.lastUsedAt = Date.now();
+      localStorage.setItem(API_KEY_META_PREFIX + type, JSON.stringify(metadata));
+    } catch {
+      // Ignore metadata parsing errors
+    }
+  }
+ 
+  logSecurityEvent('api_key_accessed', { type });
+  return key;
+}
+ 
+/**
+ * Get API key metadata (without the actual key)
+ *
+ * @param type - The API key type
+ * @returns The metadata or null if not found
+ */
+export function getApiKeyMetadata(type: ApiKeyType): ApiKeyMetadata | null {
+  const metaJson = localStorage.getItem(API_KEY_META_PREFIX + type);
+  if (!metaJson) {
+    return null;
+  }
+ 
+  try {
+    return JSON.parse(metaJson) as ApiKeyMetadata;
+  } catch {
+    return null;
+  }
+}
+ 
+/**
+ * List all stored API key metadata
+ *
+ * @returns Array of API key metadata
+ */
+export function listApiKeyMetadata(): ApiKeyMetadata[] {
+  const metadata: ApiKeyMetadata[] = [];
+ 
+  for (let i = 0; i < localStorage.length; i++) {
+    const key = localStorage.key(i);
+    if (key?.startsWith(API_KEY_META_PREFIX)) {
+      try {
+        const meta = JSON.parse(localStorage.getItem(key) || '');
+        metadata.push(meta);
+      } catch {
+        // Ignore parsing errors
+      }
+    }
+  }
+ 
+  return metadata;
+}
+ 
+/**
+ * Delete an API key
+ *
+ * @param type - The API key type
+ */
+export async function deleteApiKey(type: ApiKeyType): Promise<void> {
+  const storageKey = API_KEY_PREFIX + type;
+  await secureStorage.delete(storageKey);
+  localStorage.removeItem(API_KEY_META_PREFIX + type);
+ 
+  logSecurityEvent('api_key_deleted', { type });
+}
+ 
+/**
+ * Update API key metadata
+ *
+ * @param type - The API key type
+ * @param updates - Metadata updates
+ */
+export function updateApiKeyMetadata(
+  type: ApiKeyType,
+  updates: Partial<Pick<ApiKeyMetadata, 'name' | 'description'>>
+): void {
+  const metaJson = localStorage.getItem(API_KEY_META_PREFIX + type);
+  if (!metaJson) {
+    throw new Error(`API key metadata not found for type: ${type}`);
+  }
+ 
+  const metadata: ApiKeyMetadata = JSON.parse(metaJson);
+  Object.assign(metadata, updates, { updatedAt: Date.now() });
+ 
+  localStorage.setItem(API_KEY_META_PREFIX + type, JSON.stringify(metadata));
+}
+ 
+/**
+ * Check if an API key exists for a type
+ *
+ * @param type - The API key type
+ * @returns True if key exists
+ */
+export async function hasApiKey(type: ApiKeyType): Promise<boolean> {
+  const key = await getApiKey(type);
+  return key !== null;
+}
+ 
+/**
+ * Validate a stored API key
+ *
+ * @param type - The API key type
+ * @returns Validation result
+ */
+export async function validateStoredApiKey(type: ApiKeyType): Promise<{
+  valid: boolean;
+  error?: string;
+}> {
+  const key = await getApiKey(type);
+  if (!key) {
+    return { valid: false, error: 'API key not found' };
+  }
+ 
+  return validateApiKeyFormat(type, key);
+}
+ 
+/**
+ * Rotate an API key
+ *
+ * @param type - The API key type
+ * @param newKey - The new API key value
+ */
+export async function rotateApiKey(type: ApiKeyType, newKey: string): Promise<ApiKeyMetadata> {
+  // Delete old key first
+  await deleteApiKey(type);
+ 
+  // Store new key
+  return storeApiKey(type, newKey, {
+    name: `${type}_api_key_rotated`,
+    description: `Rotated at ${new Date().toISOString()}`,
+  });
+}
+ 
+/**
+ * Export API key configuration (without actual keys)
+ * Useful for backup or migration
+ */
+export function exportApiKeyConfig(): Array<Omit<ApiKeyMetadata, 'keyHash'>> {
+  return listApiKeyMetadata().map(({ keyHash: _, ...meta }) => meta);
+}
+ 
+/**
+ * Check if using OS keychain for storage
+ */
+export async function isUsingKeychain(): Promise<boolean> {
+  return isSecureStorageAvailable();
+}
+ 
+// ============================================================================
+// Security Audit Logging
+// ============================================================================
+ 
+interface SecurityEvent {
+  type: string;
+  timestamp: number;
+  details: Record<string, unknown>;
+}
+ 
+const SECURITY_LOG_KEY = 'zclaw_security_events';
+const MAX_LOG_ENTRIES = 1000;
+ 
+/**
+ * Log a security event
+ */
+function logSecurityEvent(
+  type: string,
+  details: Record<string, unknown>
+): void {
+  try {
+    const events: SecurityEvent[] = JSON.parse(
+      localStorage.getItem(SECURITY_LOG_KEY) || '[]'
+    );
+ 
+    events.push({
+      type,
+      timestamp: Date.now(),
+      details,
+    });
+ 
+    // Trim old entries
+    if (events.length > MAX_LOG_ENTRIES) {
+      events.splice(0, events.length - MAX_LOG_ENTRIES);
+    }
+ 
+    localStorage.setItem(SECURITY_LOG_KEY, JSON.stringify(events));
+  } catch {
+    // Ignore logging failures
+  }
+}
+ 
+/**
+ * Get security event log
+ */
+export function getSecurityLog(): SecurityEvent[] {
+  try {
+    return JSON.parse(localStorage.getItem(SECURITY_LOG_KEY) || '[]');
+  } catch {
+    return [];
+  }
+}
+ 
+/**
+ * Clear security event log
+ */
+export function clearSecurityLog(): void {
+  localStorage.removeItem(SECURITY_LOG_KEY);
+}
+ 
+/**
+ * Generate a random API key for testing
+ * WARNING: Only use for testing purposes
+ */
+export function generateTestApiKey(type: ApiKeyType): string {
+  const rules = KEY_VALIDATION_RULES[type];
+  const length = rules.minLength + 10;
+  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+ 
+  let key = '';
+  if (rules.prefix && rules.prefix.length > 0) {
+    key = rules.prefix[0];
+  }
+ 
+  for (let i = key.length; i < length; i++) {
+    key += chars.charAt(Math.floor(Math.random() * chars.length));
+  }
+ 
+  return key;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/audit-logger.ts.html b/desktop/coverage/src/lib/audit-logger.ts.html new file mode 100644 index 0000000..bef1304 --- /dev/null +++ b/desktop/coverage/src/lib/audit-logger.ts.html @@ -0,0 +1,571 @@ + + + + + + Code coverage report for src/lib/audit-logger.ts + + + + + + + + + +
+
+

All files / src/lib audit-logger.ts

+
+ +
+ 0% + Statements + 0/104 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/104 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * audit-logger.ts - 前端审计日志记录工具
+ *
+ * 为 ZCLAW 前端操作提供统一的审计日志记录功能。
+ * 记录关键操作(Hand 触发、Agent 创建等)到本地存储。
+ */
+ 
+export type AuditAction =
+  | 'hand.trigger'
+  | 'hand.approve'
+  | 'hand.cancel'
+  | 'agent.create'
+  | 'agent.update'
+  | 'agent.delete';
+ 
+export type AuditResult = 'success' | 'failure' | 'pending';
+ 
+export interface FrontendAuditEntry {
+  id: string;
+  timestamp: string;
+  action: AuditAction;
+  target: string;
+  result: AuditResult;
+  actor?: string;
+  details?: Record<string, unknown>;
+  error?: string;
+}
+ 
+export interface AuditLogOptions {
+  action: AuditAction;
+  target: string;
+  result: AuditResult;
+  actor?: string;
+  details?: Record<string, unknown>;
+  error?: string;
+}
+ 
+const STORAGE_KEY = 'zclaw-audit-logs';
+const MAX_LOCAL_LOGS = 500;
+ 
+function generateId(): string {
+  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
+    return crypto.randomUUID();
+  }
+  return `audit_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
+}
+ 
+function getTimestamp(): string {
+  return new Date().toISOString();
+}
+ 
+function loadLocalLogs(): FrontendAuditEntry[] {
+  try {
+    const stored = localStorage.getItem(STORAGE_KEY);
+    if (!stored) return [];
+    const logs = JSON.parse(stored) as FrontendAuditEntry[];
+    return Array.isArray(logs) ? logs : [];
+  } catch {
+    return [];
+  }
+}
+ 
+function saveLocalLogs(logs: FrontendAuditEntry[]): void {
+  try {
+    const trimmedLogs = logs.slice(-MAX_LOCAL_LOGS);
+    localStorage.setItem(STORAGE_KEY, JSON.stringify(trimmedLogs));
+  } catch (err) {
+    console.error('[AuditLogger] Failed to save logs to localStorage:', err);
+  }
+}
+ 
+class AuditLogger {
+  private logs: FrontendAuditEntry[] = [];
+  private initialized = false;
+ 
+  constructor() {
+    this.init();
+  }
+ 
+  private init(): void {
+    if (this.initialized) return;
+    this.logs = loadLocalLogs();
+    this.initialized = true;
+  }
+ 
+  async log(options: AuditLogOptions): Promise<FrontendAuditEntry> {
+    const entry: FrontendAuditEntry = {
+      id: generateId(),
+      timestamp: getTimestamp(),
+      action: options.action,
+      target: options.target,
+      result: options.result,
+      actor: options.actor,
+      details: options.details,
+      error: options.error,
+    };
+ 
+    this.logs.push(entry);
+    saveLocalLogs(this.logs);
+ 
+    console.log('[AuditLogger]', entry.action, entry.target, entry.result, entry.details || '');
+ 
+    return entry;
+  }
+ 
+  async logSuccess(
+    action: AuditAction,
+    target: string,
+    details?: Record<string, unknown>
+  ): Promise<FrontendAuditEntry> {
+    return this.log({ action, target, result: 'success', details });
+  }
+ 
+  async logFailure(
+    action: AuditAction,
+    target: string,
+    error: string,
+    details?: Record<string, unknown>
+  ): Promise<FrontendAuditEntry> {
+    return this.log({ action, target, result: 'failure', error, details });
+  }
+ 
+  getLogs(): FrontendAuditEntry[] {
+    return [...this.logs];
+  }
+ 
+  getLogsByAction(action: AuditAction): FrontendAuditEntry[] {
+    return this.logs.filter(log => log.action === action);
+  }
+ 
+  clearLogs(): void {
+    this.logs = [];
+    localStorage.removeItem(STORAGE_KEY);
+  }
+ 
+  exportLogs(): string {
+    return JSON.stringify(this.logs, null, 2);
+  }
+}
+ 
+export const auditLogger = new AuditLogger();
+ 
+export function logAudit(options: AuditLogOptions): Promise<FrontendAuditEntry> {
+  return auditLogger.log(options);
+}
+ 
+export function logAuditSuccess(
+  action: AuditAction,
+  target: string,
+  details?: Record<string, unknown>
+): Promise<FrontendAuditEntry> {
+  return auditLogger.logSuccess(action, target, details);
+}
+ 
+export function logAuditFailure(
+  action: AuditAction,
+  target: string,
+  error: string,
+  details?: Record<string, unknown>
+): Promise<FrontendAuditEntry> {
+  return auditLogger.logFailure(action, target, error, details);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/autonomy-manager.ts.html b/desktop/coverage/src/lib/autonomy-manager.ts.html new file mode 100644 index 0000000..b720e15 --- /dev/null +++ b/desktop/coverage/src/lib/autonomy-manager.ts.html @@ -0,0 +1,1729 @@ + + + + + + Code coverage report for src/lib/autonomy-manager.ts + + + + + + + + + +
+
+

All files / src/lib autonomy-manager.ts

+
+ +
+ 0% + Statements + 0/337 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/337 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Autonomy Manager - Tiered authorization system for L4 self-evolution
+ *
+ * Provides granular control over what actions the Agent can take autonomously:
+ * - Supervised: All actions require user confirmation
+ * - Assisted: Low-risk actions execute automatically
+ * - Autonomous: Agent decides when to act and notify
+ *
+ * Security boundaries:
+ * - High-risk operations ALWAYS require confirmation
+ * - All autonomous actions are logged for audit
+ * - One-click rollback to any historical state
+ *
+ * Reference: ZCLAW_AGENT_INTELLIGENCE_EVOLUTION.md §6.4.3
+ */
+ 
+// === Types ===
+ 
+export type AutonomyLevel = 'supervised' | 'assisted' | 'autonomous';
+ 
+export type RiskLevel = 'low' | 'medium' | 'high';
+ 
+export type ActionType =
+  | 'memory_save'
+  | 'memory_delete'
+  | 'identity_update'
+  | 'identity_rollback'
+  | 'skill_install'
+  | 'skill_uninstall'
+  | 'config_change'
+  | 'workflow_trigger'
+  | 'hand_trigger'
+  | 'llm_call'
+  | 'reflection_run'
+  | 'compaction_run';
+ 
+export interface AutonomyConfig {
+  level: AutonomyLevel;
+  allowedActions: {
+    memoryAutoSave: boolean;
+    identityAutoUpdate: boolean;
+    skillAutoInstall: boolean;
+    selfModification: boolean;
+    autoCompaction: boolean;
+    autoReflection: boolean;
+  };
+  approvalThreshold: {
+    importanceMax: number;  // Auto-approve if importance <= this (default: 5)
+    riskMax: RiskLevel;     // Auto-approve if risk <= this (default: 'low')
+  };
+  notifyOnAction: boolean;  // Notify user after autonomous action
+  auditLogEnabled: boolean; // Log all autonomous actions
+}
+ 
+export interface AutonomyDecision {
+  action: ActionType;
+  allowed: boolean;
+  requiresApproval: boolean;
+  reason: string;
+  riskLevel: RiskLevel;
+  importance: number;
+  timestamp: string;
+}
+ 
+export interface AuditLogEntry {
+  id: string;
+  action: ActionType;
+  decision: AutonomyDecision;
+  context: Record<string, unknown>;
+  outcome: 'success' | 'failed' | 'rolled_back';
+  rolledBackAt?: string;
+  timestamp: string;
+}
+ 
+// === Risk Mapping ===
+ 
+const ACTION_RISK_MAP: Record<ActionType, RiskLevel> = {
+  memory_save: 'low',
+  memory_delete: 'high',
+  identity_update: 'high',
+  identity_rollback: 'medium',
+  skill_install: 'medium',
+  skill_uninstall: 'medium',
+  config_change: 'medium',
+  workflow_trigger: 'low',
+  hand_trigger: 'medium',
+  llm_call: 'low',
+  reflection_run: 'low',
+  compaction_run: 'low',
+};
+ 
+const RISK_ORDER: Record<RiskLevel, number> = {
+  low: 1,
+  medium: 2,
+  high: 3,
+};
+ 
+// === Default Configs ===
+ 
+export const DEFAULT_AUTONOMY_CONFIGS: Record<AutonomyLevel, AutonomyConfig> = {
+  supervised: {
+    level: 'supervised',
+    allowedActions: {
+      memoryAutoSave: false,
+      identityAutoUpdate: false,
+      skillAutoInstall: false,
+      selfModification: false,
+      autoCompaction: false,
+      autoReflection: false,
+    },
+    approvalThreshold: {
+      importanceMax: 0,
+      riskMax: 'low',
+    },
+    notifyOnAction: true,
+    auditLogEnabled: true,
+  },
+  assisted: {
+    level: 'assisted',
+    allowedActions: {
+      memoryAutoSave: true,
+      identityAutoUpdate: false,
+      skillAutoInstall: false,
+      selfModification: false,
+      autoCompaction: true,
+      autoReflection: true,
+    },
+    approvalThreshold: {
+      importanceMax: 5,
+      riskMax: 'low',
+    },
+    notifyOnAction: true,
+    auditLogEnabled: true,
+  },
+  autonomous: {
+    level: 'autonomous',
+    allowedActions: {
+      memoryAutoSave: true,
+      identityAutoUpdate: true,
+      skillAutoInstall: true,
+      selfModification: false, // Always require approval for self-modification
+      autoCompaction: true,
+      autoReflection: true,
+    },
+    approvalThreshold: {
+      importanceMax: 7,
+      riskMax: 'medium',
+    },
+    notifyOnAction: false, // Only notify on high-impact actions
+    auditLogEnabled: true,
+  },
+};
+ 
+// === Storage ===
+ 
+const AUTONOMY_CONFIG_KEY = 'zclaw-autonomy-config';
+const AUDIT_LOG_KEY = 'zclaw-autonomy-audit-log';
+ 
+// === Autonomy Manager ===
+ 
+export class AutonomyManager {
+  private config: AutonomyConfig;
+  private auditLog: AuditLogEntry[] = [];
+  private pendingApprovals: Map<string, AutonomyDecision> = new Map();
+ 
+  constructor(config?: Partial<AutonomyConfig>) {
+    this.config = this.loadConfig();
+    if (config) {
+      this.config = { ...this.config, ...config };
+    }
+    this.loadAuditLog();
+  }
+ 
+  // === Decision Making ===
+ 
+  /**
+   * Evaluate whether an action can be executed autonomously.
+   */
+  evaluate(
+    action: ActionType,
+    context?: {
+      importance?: number;
+      riskOverride?: RiskLevel;
+      details?: Record<string, unknown>;
+    }
+  ): AutonomyDecision {
+    const importance = context?.importance ?? 5;
+    const baseRisk = ACTION_RISK_MAP[action];
+    const riskLevel = context?.riskOverride ?? baseRisk;
+ 
+    // High-risk actions ALWAYS require approval
+    const isHighRisk = riskLevel === 'high';
+    const isSelfModification = action === 'identity_update';
+    const isDeletion = action === 'memory_delete';
+ 
+    let allowed = false;
+    let requiresApproval = true;
+    let reason = '';
+ 
+    // Determine if action is allowed based on config
+    if (isHighRisk || isDeletion) {
+      // Always require approval for high-risk and deletion
+      allowed = false;
+      requiresApproval = true;
+      reason = `高风险操作 [${action}] 始终需要用户确认`;
+    } else if (isSelfModification && !this.config.allowedActions.selfModification) {
+      // Self-modification requires explicit permission
+      allowed = false;
+      requiresApproval = true;
+      reason = `身份修改 [${action}] 需要显式授权`;
+    } else {
+      // Check against thresholds
+      const importanceOk = importance <= this.config.approvalThreshold.importanceMax;
+      const riskOk = RISK_ORDER[riskLevel] <= RISK_ORDER[this.config.approvalThreshold.riskMax];
+      const actionAllowed = this.isActionAllowed(action);
+ 
+      if (actionAllowed && importanceOk && riskOk) {
+        allowed = true;
+        requiresApproval = false;
+        reason = `自动批准: 重要性=${importance}, 风险=${riskLevel}`;
+      } else if (actionAllowed) {
+        allowed = false;
+        requiresApproval = true;
+        reason = `需要审批: 重要性=${importance}(阈值${this.config.approvalThreshold.importanceMax}), 风险=${riskLevel}(阈值${this.config.approvalThreshold.riskMax})`;
+      } else {
+        allowed = false;
+        requiresApproval = true;
+        reason = `操作 [${action}] 未在允许列表中`;
+      }
+    }
+ 
+    const decision: AutonomyDecision = {
+      action,
+      allowed,
+      requiresApproval,
+      reason,
+      riskLevel,
+      importance,
+      timestamp: new Date().toISOString(),
+    };
+ 
+    // Log the decision
+    if (this.config.auditLogEnabled) {
+      this.logDecision(decision, context?.details ?? {});
+    }
+ 
+    return decision;
+  }
+ 
+  /**
+   * Check if an action type is allowed by current config.
+   */
+  private isActionAllowed(action: ActionType): boolean {
+    const actionMap: Record<ActionType, keyof AutonomyConfig['allowedActions'] | null> = {
+      memory_save: 'memoryAutoSave',
+      memory_delete: null, // Never auto-allowed
+      identity_update: 'identityAutoUpdate',
+      identity_rollback: null,
+      skill_install: 'skillAutoInstall',
+      skill_uninstall: 'skillAutoInstall',
+      config_change: null,
+      workflow_trigger: 'autoCompaction',
+      hand_trigger: null,
+      llm_call: 'autoReflection',
+      reflection_run: 'autoReflection',
+      compaction_run: 'autoCompaction',
+    };
+ 
+    const configKey = actionMap[action];
+    if (!configKey) return false;
+    return this.config.allowedActions[configKey] ?? false;
+  }
+ 
+  // === Approval Workflow ===
+ 
+  /**
+   * Request approval for an action.
+   * Returns approval ID that can be used to approve/reject.
+   */
+  requestApproval(decision: AutonomyDecision): string {
+    const approvalId = `approval_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
+    this.pendingApprovals.set(approvalId, decision);
+ 
+    // Store in localStorage for persistence
+    this.persistPendingApprovals();
+ 
+    console.log(`[AutonomyManager] Approval requested: ${approvalId} for ${decision.action}`);
+    return approvalId;
+  }
+ 
+  /**
+   * Approve a pending action.
+   */
+  approve(approvalId: string): boolean {
+    const decision = this.pendingApprovals.get(approvalId);
+    if (!decision) {
+      console.warn(`[AutonomyManager] Approval not found: ${approvalId}`);
+      return false;
+    }
+ 
+    // Update decision
+    decision.allowed = true;
+    decision.requiresApproval = false;
+    decision.reason = `用户已批准 [${approvalId}]`;
+ 
+    // Remove from pending
+    this.pendingApprovals.delete(approvalId);
+    this.persistPendingApprovals();
+ 
+    // Update audit log
+    this.updateAuditLogOutcome(approvalId, 'success');
+ 
+    console.log(`[AutonomyManager] Approved: ${approvalId}`);
+    return true;
+  }
+ 
+  /**
+   * Reject a pending action.
+   */
+  reject(approvalId: string): boolean {
+    const decision = this.pendingApprovals.get(approvalId);
+    if (!decision) {
+      console.warn(`[AutonomyManager] Approval not found: ${approvalId}`);
+      return false;
+    }
+ 
+    // Remove from pending
+    this.pendingApprovals.delete(approvalId);
+    this.persistPendingApprovals();
+ 
+    // Update audit log
+    this.updateAuditLogOutcome(approvalId, 'failed');
+ 
+    console.log(`[AutonomyManager] Rejected: ${approvalId}`);
+    return true;
+  }
+ 
+  /**
+   * Get all pending approvals.
+   */
+  getPendingApprovals(): Array<{ id: string; decision: AutonomyDecision }> {
+    return Array.from(this.pendingApprovals.entries()).map(([id, decision]) => ({
+      id,
+      decision,
+    }));
+  }
+ 
+  // === Audit Log ===
+ 
+  private logDecision(decision: AutonomyDecision, context: Record<string, unknown>): void {
+    const entry: AuditLogEntry = {
+      id: `audit_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
+      action: decision.action,
+      decision,
+      context,
+      outcome: decision.allowed ? 'success' : 'failed',
+      timestamp: decision.timestamp,
+    };
+ 
+    this.auditLog.push(entry);
+ 
+    // Keep last 100 entries
+    if (this.auditLog.length > 100) {
+      this.auditLog = this.auditLog.slice(-100);
+    }
+ 
+    this.saveAuditLog();
+  }
+ 
+  private updateAuditLogOutcome(approvalId: string, outcome: 'success' | 'failed' | 'rolled_back'): void {
+    // Find the most recent entry for this action and update outcome
+    const entry = this.auditLog.find(e => e.decision.reason.includes(approvalId));
+    if (entry) {
+      entry.outcome = outcome;
+      this.saveAuditLog();
+    }
+  }
+ 
+  /**
+   * Rollback an action by its audit log ID.
+   */
+  rollback(auditId: string): boolean {
+    const entry = this.auditLog.find(e => e.id === auditId);
+    if (!entry) {
+      console.warn(`[AutonomyManager] Audit entry not found: ${auditId}`);
+      return false;
+    }
+ 
+    if (entry.outcome === 'rolled_back') {
+      console.warn(`[AutonomyManager] Already rolled back: ${auditId}`);
+      return false;
+    }
+ 
+    // Mark as rolled back
+    entry.outcome = 'rolled_back';
+    entry.rolledBackAt = new Date().toISOString();
+    this.saveAuditLog();
+ 
+    console.log(`[AutonomyManager] Rolled back: ${auditId}`);
+    return true;
+  }
+ 
+  /**
+   * Get audit log entries.
+   */
+  getAuditLog(limit: number = 50): AuditLogEntry[] {
+    return this.auditLog.slice(-limit);
+  }
+ 
+  /**
+   * Clear audit log.
+   */
+  clearAuditLog(): void {
+    this.auditLog = [];
+    this.saveAuditLog();
+  }
+ 
+  // === Config Management ===
+ 
+  getConfig(): AutonomyConfig {
+    return { ...this.config };
+  }
+ 
+  updateConfig(updates: Partial<AutonomyConfig>): void {
+    this.config = { ...this.config, ...updates };
+    this.saveConfig();
+  }
+ 
+  setLevel(level: AutonomyLevel): void {
+    this.config = { ...DEFAULT_AUTONOMY_CONFIGS[level], level };
+    this.saveConfig();
+    console.log(`[AutonomyManager] Level changed to: ${level}`);
+  }
+ 
+  // === Persistence ===
+ 
+  private loadConfig(): AutonomyConfig {
+    try {
+      const raw = localStorage.getItem(AUTONOMY_CONFIG_KEY);
+      if (raw) {
+        const parsed = JSON.parse(raw);
+        return { ...DEFAULT_AUTONOMY_CONFIGS.assisted, ...parsed };
+      }
+    } catch {
+      // Ignore
+    }
+    return DEFAULT_AUTONOMY_CONFIGS.assisted;
+  }
+ 
+  private saveConfig(): void {
+    try {
+      localStorage.setItem(AUTONOMY_CONFIG_KEY, JSON.stringify(this.config));
+    } catch {
+      // Ignore
+    }
+  }
+ 
+  private loadAuditLog(): void {
+    try {
+      const raw = localStorage.getItem(AUDIT_LOG_KEY);
+      if (raw) {
+        this.auditLog = JSON.parse(raw);
+      }
+    } catch {
+      this.auditLog = [];
+    }
+  }
+ 
+  private saveAuditLog(): void {
+    try {
+      localStorage.setItem(AUDIT_LOG_KEY, JSON.stringify(this.auditLog.slice(-100)));
+    } catch {
+      // Ignore
+    }
+  }
+ 
+  private persistPendingApprovals(): void {
+    try {
+      const pending = Array.from(this.pendingApprovals.entries());
+      localStorage.setItem('zclaw-pending-approvals', JSON.stringify(pending));
+    } catch {
+      // Ignore
+    }
+  }
+}
+ 
+// === Singleton ===
+ 
+let _instance: AutonomyManager | null = null;
+ 
+export function getAutonomyManager(config?: Partial<AutonomyConfig>): AutonomyManager {
+  if (!_instance) {
+    _instance = new AutonomyManager(config);
+  }
+  return _instance;
+}
+ 
+export function resetAutonomyManager(): void {
+  _instance = null;
+}
+ 
+// === Helper Functions ===
+ 
+/**
+ * Quick check if an action can proceed autonomously.
+ */
+export function canAutoExecute(
+  action: ActionType,
+  importance: number = 5
+): { canProceed: boolean; decision: AutonomyDecision } {
+  const manager = getAutonomyManager();
+  const decision = manager.evaluate(action, { importance });
+  return {
+    canProceed: decision.allowed && !decision.requiresApproval,
+    decision,
+  };
+}
+ 
+/**
+ * Execute an action with autonomy check.
+ * Returns the decision and whether the action was executed.
+ */
+export async function executeWithAutonomy<T>(
+  action: ActionType,
+  importance: number,
+  executor: () => Promise<T>,
+  onApprovalNeeded?: (decision: AutonomyDecision, approvalId: string) => void
+): Promise<{ executed: boolean; result?: T; decision: AutonomyDecision; approvalId?: string }> {
+  const manager = getAutonomyManager();
+  const decision = manager.evaluate(action, { importance });
+ 
+  if (decision.allowed && !decision.requiresApproval) {
+    // Execute immediately
+    try {
+      const result = await executor();
+      return { executed: true, result, decision };
+    } catch (error) {
+      console.error(`[AutonomyManager] Action ${action} failed:`, error);
+      return { executed: false, decision };
+    }
+  }
+ 
+  // Need approval
+  const approvalId = manager.requestApproval(decision);
+  onApprovalNeeded?.(decision, approvalId);
+ 
+  return { executed: false, decision, approvalId };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/browser-client.ts.html b/desktop/coverage/src/lib/browser-client.ts.html new file mode 100644 index 0000000..4259a89 --- /dev/null +++ b/desktop/coverage/src/lib/browser-client.ts.html @@ -0,0 +1,1465 @@ + + + + + + Code coverage report for src/lib/browser-client.ts + + + + + + + + + +
+
+

All files / src/lib browser-client.ts

+
+ +
+ 0% + Statements + 0/204 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/204 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Browser Automation Client for ZCLAW
+ * Provides TypeScript API for Fantoccini-based browser automation
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+ 
+// ============================================================================
+// Types
+// ============================================================================
+ 
+export interface BrowserSessionResult {
+  session_id: string;
+}
+ 
+export interface BrowserSessionInfo {
+  id: string;
+  name: string;
+  current_url: string | null;
+  title: string | null;
+  status: string;
+  created_at: string;
+  last_activity: string;
+}
+ 
+export interface BrowserNavigationResult {
+  url: string | null;
+  title: string | null;
+}
+ 
+export interface BrowserElementInfo {
+  selector: string;
+  tag_name: string | null;
+  text: string | null;
+  is_displayed: boolean;
+  is_enabled: boolean;
+  is_selected: boolean;
+  location: BrowserElementLocation | null;
+  size: BrowserElementSize | null;
+}
+ 
+export interface BrowserElementLocation {
+  x: number;
+  y: number;
+}
+ 
+export interface BrowserElementSize {
+  width: number;
+  height: number;
+}
+ 
+export interface BrowserScreenshotResult {
+  base64: string;
+  format: string;
+}
+ 
+export interface FormFieldData {
+  selector: string;
+  value: string;
+}
+ 
+// ============================================================================
+// Session Management
+// ============================================================================
+ 
+/**
+ * Create a new browser session
+ */
+export async function createSession(options?: {
+  webdriverUrl?: string;
+  headless?: boolean;
+  browserType?: 'chrome' | 'firefox' | 'edge' | 'safari';
+  windowWidth?: number;
+  windowHeight?: number;
+}): Promise<BrowserSessionResult> {
+  return invoke('browser_create_session', {
+    webdriverUrl: options?.webdriverUrl,
+    headless: options?.headless,
+    browserType: options?.browserType,
+    windowWidth: options?.windowWidth,
+    windowHeight: options?.windowHeight,
+  });
+}
+ 
+/**
+ * Close a browser session
+ */
+export async function closeSession(sessionId: string): Promise<void> {
+  return invoke('browser_close_session', { sessionId });
+}
+ 
+/**
+ * List all browser sessions
+ */
+export async function listSessions(): Promise<BrowserSessionInfo[]> {
+  return invoke('browser_list_sessions');
+}
+ 
+/**
+ * Get session info
+ */
+export async function getSession(sessionId: string): Promise<BrowserSessionInfo> {
+  return invoke('browser_get_session', { sessionId });
+}
+ 
+// ============================================================================
+// Navigation
+// ============================================================================
+ 
+/**
+ * Navigate to URL
+ */
+export async function navigate(
+  sessionId: string,
+  url: string
+): Promise<BrowserNavigationResult> {
+  return invoke('browser_navigate', { sessionId, url });
+}
+ 
+/**
+ * Go back
+ */
+export async function back(sessionId: string): Promise<void> {
+  return invoke('browser_back', { sessionId });
+}
+ 
+/**
+ * Go forward
+ */
+export async function forward(sessionId: string): Promise<void> {
+  return invoke('browser_forward', { sessionId });
+}
+ 
+/**
+ * Refresh page
+ */
+export async function refresh(sessionId: string): Promise<void> {
+  return invoke('browser_refresh', { sessionId });
+}
+ 
+/**
+ * Get current URL
+ */
+export async function getCurrentUrl(sessionId: string): Promise<string> {
+  return invoke('browser_get_url', { sessionId });
+}
+ 
+/**
+ * Get page title
+ */
+export async function getTitle(sessionId: string): Promise<string> {
+  return invoke('browser_get_title', { sessionId });
+}
+ 
+// ============================================================================
+// Element Interaction
+// ============================================================================
+ 
+/**
+ * Find element by CSS selector
+ */
+export async function findElement(
+  sessionId: string,
+  selector: string
+): Promise<BrowserElementInfo> {
+  return invoke('browser_find_element', { sessionId, selector });
+}
+ 
+/**
+ * Find multiple elements
+ */
+export async function findElements(
+  sessionId: string,
+  selector: string
+): Promise<BrowserElementInfo[]> {
+  return invoke('browser_find_elements', { sessionId, selector });
+}
+ 
+/**
+ * Click element
+ */
+export async function click(sessionId: string, selector: string): Promise<void> {
+  return invoke('browser_click', { sessionId, selector });
+}
+ 
+/**
+ * Type text into element
+ */
+export async function typeText(
+  sessionId: string,
+  selector: string,
+  text: string,
+  clearFirst?: boolean
+): Promise<void> {
+  return invoke('browser_type', { sessionId, selector, text, clearFirst });
+}
+ 
+/**
+ * Get element text
+ */
+export async function getText(sessionId: string, selector: string): Promise<string> {
+  return invoke('browser_get_text', { sessionId, selector });
+}
+ 
+/**
+ * Get element attribute
+ */
+export async function getAttribute(
+  sessionId: string,
+  selector: string,
+  attribute: string
+): Promise<string | null> {
+  return invoke('browser_get_attribute', { sessionId, selector, attribute });
+}
+ 
+/**
+ * Wait for element
+ */
+export async function waitForElement(
+  sessionId: string,
+  selector: string,
+  timeoutMs?: number
+): Promise<BrowserElementInfo> {
+  return invoke('browser_wait_for_element', {
+    sessionId,
+    selector,
+    timeoutMs: timeoutMs ?? 10000,
+  });
+}
+ 
+// ============================================================================
+// Advanced Operations
+// ============================================================================
+ 
+/**
+ * Execute JavaScript
+ */
+export async function executeScript(
+  sessionId: string,
+  script: string,
+  args?: unknown[]
+): Promise<unknown> {
+  return invoke('browser_execute_script', { sessionId, script, args });
+}
+ 
+/**
+ * Take screenshot
+ */
+export async function screenshot(sessionId: string): Promise<BrowserScreenshotResult> {
+  return invoke('browser_screenshot', { sessionId });
+}
+ 
+/**
+ * Take element screenshot
+ */
+export async function elementScreenshot(
+  sessionId: string,
+  selector: string
+): Promise<BrowserScreenshotResult> {
+  return invoke('browser_element_screenshot', { sessionId, selector });
+}
+ 
+/**
+ * Get page source
+ */
+export async function getSource(sessionId: string): Promise<string> {
+  return invoke('browser_get_source', { sessionId });
+}
+ 
+// ============================================================================
+// High-Level Tasks
+// ============================================================================
+ 
+/**
+ * Scrape page content
+ */
+export async function scrapePage(
+  sessionId: string,
+  selectors: string[],
+  waitFor?: string,
+  timeoutMs?: number
+): Promise<Record<string, string[]>> {
+  return invoke('browser_scrape_page', {
+    sessionId,
+    selectors,
+    waitFor,
+    timeoutMs,
+  });
+}
+ 
+/**
+ * Fill form
+ */
+export async function fillForm(
+  sessionId: string,
+  fields: FormFieldData[],
+  submitSelector?: string
+): Promise<void> {
+  return invoke('browser_fill_form', { sessionId, fields, submitSelector });
+}
+ 
+// ============================================================================
+// Browser Client Class (Convenience Wrapper)
+// ============================================================================
+ 
+/**
+ * High-level browser client for easier usage
+ */
+export class Browser {
+  private sessionId: string | null = null;
+ 
+  /**
+   * Start a new browser session
+   */
+  async start(options?: {
+    webdriverUrl?: string;
+    headless?: boolean;
+    browserType?: 'chrome' | 'firefox' | 'edge' | 'safari';
+    windowWidth?: number;
+    windowHeight?: number;
+  }): Promise<string> {
+    const result = await createSession(options);
+    this.sessionId = result.session_id;
+    return this.sessionId;
+  }
+ 
+  /**
+   * Close browser session
+   */
+  async close(): Promise<void> {
+    if (this.sessionId) {
+      await closeSession(this.sessionId);
+      this.sessionId = null;
+    }
+  }
+ 
+  /**
+   * Get current session ID
+   */
+  getSessionId(): string | null {
+    return this.sessionId;
+  }
+ 
+  /**
+   * Navigate to URL
+   */
+  async goto(url: string): Promise<BrowserNavigationResult> {
+    this.ensureSession();
+    return navigate(this.sessionId!, url);
+  }
+ 
+  /**
+   * Find element
+   */
+  async $(selector: string): Promise<BrowserElementInfo> {
+    this.ensureSession();
+    return findElement(this.sessionId!, selector);
+  }
+ 
+  /**
+   * Find multiple elements
+   */
+  async $$(selector: string): Promise<BrowserElementInfo[]> {
+    this.ensureSession();
+    return findElements(this.sessionId!, selector);
+  }
+ 
+  /**
+   * Click element
+   */
+  async click(selector: string): Promise<void> {
+    this.ensureSession();
+    return click(this.sessionId!, selector);
+  }
+ 
+  /**
+   * Type text
+   */
+  async type(selector: string, text: string, clearFirst = false): Promise<void> {
+    this.ensureSession();
+    return typeText(this.sessionId!, selector, text, clearFirst);
+  }
+ 
+  /**
+   * Wait for element
+   */
+  async wait(selector: string, timeoutMs = 10000): Promise<BrowserElementInfo> {
+    this.ensureSession();
+    return waitForElement(this.sessionId!, selector, timeoutMs);
+  }
+ 
+  /**
+   * Take screenshot
+   */
+  async screenshot(): Promise<BrowserScreenshotResult> {
+    this.ensureSession();
+    return screenshot(this.sessionId!);
+  }
+ 
+  /**
+   * Execute JavaScript
+   */
+  async eval(script: string, args?: unknown[]): Promise<unknown> {
+    this.ensureSession();
+    return executeScript(this.sessionId!, script, args);
+  }
+ 
+  /**
+   * Get page source
+   */
+  async source(): Promise<string> {
+    this.ensureSession();
+    return getSource(this.sessionId!);
+  }
+ 
+  /**
+   * Get current URL
+   */
+  async url(): Promise<string> {
+    this.ensureSession();
+    return getCurrentUrl(this.sessionId!);
+  }
+ 
+  /**
+   * Get page title
+   */
+  async title(): Promise<string> {
+    this.ensureSession();
+    return getTitle(this.sessionId!);
+  }
+ 
+  /**
+   * Scrape page content
+   */
+  async scrape(
+    selectors: string[],
+    waitFor?: string,
+    timeoutMs?: number
+  ): Promise<Record<string, string[]>> {
+    this.ensureSession();
+    return scrapePage(this.sessionId!, selectors, waitFor, timeoutMs);
+  }
+ 
+  /**
+   * Fill form
+   */
+  async fillForm(fields: FormFieldData[], submitSelector?: string): Promise<void> {
+    this.ensureSession();
+    return fillForm(this.sessionId!, fields, submitSelector);
+  }
+ 
+  private ensureSession(): void {
+    if (!this.sessionId) {
+      throw new Error('Browser session not started. Call start() first.');
+    }
+  }
+}
+ 
+// Default export
+export default Browser;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/config-parser.ts.html b/desktop/coverage/src/lib/config-parser.ts.html new file mode 100644 index 0000000..b4252d8 --- /dev/null +++ b/desktop/coverage/src/lib/config-parser.ts.html @@ -0,0 +1,1219 @@ + + + + + + Code coverage report for src/lib/config-parser.ts + + + + + + + + + +
+
+

All files / src/lib config-parser.ts

+
+ +
+ 86.84% + Statements + 198/228 +
+ + +
+ 89.58% + Branches + 43/48 +
+ + +
+ 83.33% + Functions + 10/12 +
+ + +
+ 86.84% + Lines + 198/228 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +3791x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +3x +  +3x +  +  +3x +3x +3x +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +9x +9x +  +9x +1x +1x +1x +1x +1x +1x +1x +8x +  +9x +80x +80x +26x +26x +26x +26x +26x +26x +80x +  +9x +7x +7x +1x +1x +1x +1x +1x +1x +7x +1x +1x +1x +1x +1x +1x +7x +  +9x +5x +5x +5x +  +  +  +  +  +  +5x +1x +1x +1x +1x +1x +1x +5x +5x +  +9x +5x +5x +1x +1x +1x +1x +1x +1x +5x +  +  +  +  +  +  +5x +8x +8x +8x +8x +8x +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +2x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +3x +3x +3x +1x +  +  +  +  +80x +80x +80x +80x +146x +17x +17x +146x +  +  +129x +129x +63x +63x +  +  +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +1x +1x +1x +1x +1x +1x +2x +1x +1x +1x +1x +1x +  +1x +1x +2x +2x +2x +1x + 
/**
+ * OpenFang Configuration Parser
+ *
+ * Provides configuration parsing, validation, and serialization for OpenFang TOML files.
+ *
+ * @module lib/config-parser
+ */
+ 
+import { tomlUtils, TomlParseError } from './toml-utils';
+import { DEFAULT_MODEL_ID, DEFAULT_PROVIDER } from '../constants/models';
+import type {
+  OpenFangConfig,
+  ConfigValidationResult,
+  ConfigValidationError,
+  ConfigValidationWarning,
+  ConfigFileMetadata,
+  ServerConfig,
+  AgentSectionConfig,
+  LLMConfig,
+} from '../types/config';
+ 
+/**
+ * Error class for configuration parsing errors
+ */
+export class ConfigParseError extends Error {
+  constructor(
+    message: string,
+    public readonly cause?: unknown
+  ) {
+    super(message);
+    this.name = 'ConfigParseError';
+  }
+}
+ 
+ /**
+ * Error class for configuration validation errors (thrown when validation fails)
+ */
+export class ConfigValidationFailedError extends Error {
+  constructor(
+    message: string,
+    public readonly errors: ConfigValidationError[]
+  ) {
+    super(message);
+    this.name = 'ConfigValidationFailedError';
+  }
+}
+ 
+ /**
+ * Required configuration fields with their paths
+ */
+const REQUIRED_FIELDS: Array<{ path: string; description: string }> = [
+  { path: 'server', description: 'Server configuration' },
+    { path: 'server.host', description: 'Server host address' },
+    { path: 'server.port', description: 'Server port number' },
+    { path: 'agent', description: 'Agent configuration' },
+    { path: 'agent.defaults', description: 'Agent defaults' },
+    { path: 'agent.defaults.workspace', description: 'Default workspace path' },
+    { path: 'agent.defaults.default_model', description: 'Default model name' },
+    { path: 'llm', description: 'LLM configuration' },
+    { path: 'llm.default_provider', description: 'Default LLM provider' },
+    { path: 'llm.default_model', description: 'Default LLM model' },
+];
+ 
+/**
+ * Default configuration values
+ */
+const DEFAULT_CONFIG: Partial<OpenFangConfig> = {
+  server: {
+    host: '127.0.0.1',
+    port: 4200,
+    websocket_port: 4200,
+    websocket_path: '/ws',
+    api_version: 'v1',
+  },
+  agent: {
+    defaults: {
+      workspace: '~/.openfang/workspace',
+      default_model: DEFAULT_MODEL_ID,
+    },
+  },
+  llm: {
+    default_provider: DEFAULT_PROVIDER,
+    default_model: DEFAULT_MODEL_ID,
+  },
+};
+ 
+ /**
+ * Configuration parser and validator
+ */
+export const configParser = {
+  /**
+   * Parse TOML content into an OpenFang configuration object
+   *
+   * @param content - The TOML content to parse
+   * @param envVars - Optional environment variables for resolution
+   * @returns The parsed configuration object
+   * @throws ConfigParseError if parsing fails
+   *
+   * @example
+   * ```typescript
+   * const config = configParser.parseConfig(tomlContent, { OPENAI_API_KEY: 'sk-...' });
+   * ```
+   */
+  parseConfig: (content: string, envVars?: Record<string, string | undefined>): OpenFangConfig => {
+    try {
+      // First resolve environment variables
+      const resolved = tomlUtils.resolveEnvVars(content, envVars);
+ 
+      // Parse TOML
+      const parsed = tomlUtils.parse<OpenFangConfig>(resolved);
+      return parsed;
+    } catch (error) {
+      if (error instanceof TomlParseError) {
+        throw new ConfigParseError(`Failed to parse configuration: ${error.message}`, error);
+      }
+      throw new ConfigParseError(
+        `Unexpected error parsing configuration: ${error instanceof Error ? error.message : String(error)}`,
+        error
+      );
+    }
+  },
+ 
+  /**
+   * Validate an OpenFang configuration object
+   *
+   * @param config - The configuration object to validate
+   * @returns Validation result with errors and warnings
+   *
+   * @example
+   * ```typescript
+   * const result = configParser.validateConfig(parsedConfig);
+   * if (!result.valid) {
+   *   console.error('Config errors:', result.errors);
+   * }
+   * ```
+   */
+  validateConfig: (config: unknown): ConfigValidationResult => {
+    const errors: ConfigValidationError[] = [];
+    const warnings: ConfigValidationWarning[] = [];
+    // Basic type check
+    if (typeof config !== 'object' || config === null) {
+      errors.push({
+        path: '',
+        message: 'Configuration must be a non-null object',
+        severity: 'error',
+      });
+      return { valid: false, errors, warnings };
+    }
+    const cfg = config as Record<string, unknown>;
+    // Check required fields
+    for (const { path, description } of REQUIRED_FIELDS) {
+      const value = getNestedValue(cfg, path);
+      if (value === undefined) {
+        errors.push({
+          path,
+          message: `Missing required field: ${description}`,
+          severity: 'error',
+        });
+      }
+    }
+    // Validate server configuration
+    if (cfg.server && typeof cfg.server === 'object') {
+      const server = cfg.server as ServerConfig;
+      if (typeof server.port === 'number' && (server.port < 1 || server.port > 65535)) {
+        errors.push({
+          path: 'server.port',
+          message: 'Port must be between 1 and 65535',
+          severity: 'error',
+        });
+      }
+      if (typeof server.host === 'string' && server.host.length === 0) {
+        errors.push({
+          path: 'server.host',
+          message: 'Host cannot be empty',
+          severity: 'error',
+        });
+      }
+    }
+    // Validate agent configuration
+    if (cfg.agent && typeof cfg.agent === 'object') {
+      const agent = cfg.agent as AgentSectionConfig;
+      if (agent.defaults) {
+        if (typeof agent.defaults.workspace === 'string' && agent.defaults.workspace.length === 0) {
+          warnings.push({
+            path: 'agent.defaults.workspace',
+            message: 'Workspace path is empty',
+            severity: 'warning',
+          });
+        }
+        if (typeof agent.defaults.default_model === 'string' && agent.defaults.default_model.length === 0) {
+          errors.push({
+            path: 'agent.defaults.default_model',
+            message: 'Default model cannot be empty',
+            severity: 'error',
+          });
+        }
+      }
+    }
+    // Validate LLM configuration
+    if (cfg.llm && typeof cfg.llm === 'object') {
+      const llm = cfg.llm as LLMConfig;
+      if (typeof llm.default_provider === 'string' && llm.default_provider.length === 0) {
+        errors.push({
+          path: 'llm.default_provider',
+          message: 'Default provider cannot be empty',
+          severity: 'error',
+        });
+      }
+      if (typeof llm.default_model === 'string' && llm.default_model.length === 0) {
+        errors.push({
+          path: 'llm.default_model',
+          message: 'Default model cannot be empty',
+          severity: 'error',
+        });
+      }
+    }
+    return {
+      valid: errors.length === 0,
+      errors,
+      warnings,
+    };
+  },
+ 
+  /**
+   * Parse and validate configuration in one step
+   *
+   * @param content - The TOML content to parse
+   * @param envVars - Optional environment variables for resolution
+   * @returns The parsed and validated configuration
+   * @throws ConfigParseError if parsing fails
+   * @throws ConfigValidationFailedError if validation fails
+   *
+   * @example
+   * ```typescript
+   * const config = configParser.parseAndValidate(tomlContent);
+   * ```
+   */
+  parseAndValidate: (
+    content: string,
+    envVars?: Record<string, string | undefined>
+  ): OpenFangConfig => {
+    const config = configParser.parseConfig(content, envVars);
+    const result = configParser.validateConfig(config);
+    if (!result.valid) {
+      throw new ConfigValidationFailedError(
+        `Configuration validation failed: ${result.errors.map((e) => e.message).join(', ')}`,
+        result.errors
+      );
+    }
+    return config;
+  },
+ 
+  /**
+   * Serialize a configuration object to TOML format
+   *
+   * @param config - The configuration object to serialize
+   * @returns The TOML string
+   *
+   * @example
+   * ```typescript
+   * const toml = configParser.stringifyConfig(config);
+   * ```
+   */
+  stringifyConfig: (config: OpenFangConfig): string => {
+    return tomlUtils.stringify(config as unknown as Record<string, unknown>);
+  },
+ 
+  /**
+   * Merge partial configuration with defaults
+   *
+   * @param config - Partial configuration to merge
+   * @returns Complete configuration with defaults applied
+   *
+   * @example
+   * ```typescript
+   * const fullConfig = configParser.mergeWithDefaults(partialConfig);
+   * ```
+   */
+  mergeWithDefaults: (config: Partial<OpenFangConfig>): OpenFangConfig => {
+    return deepMerge(DEFAULT_CONFIG, config) as unknown as OpenFangConfig;
+  },
+ 
+  /**
+   * Extract metadata from a TOML configuration file
+   *
+   * @param content - The TOML content
+   * @param filePath - The file path
+   * @returns Configuration file metadata
+   *
+   * @example
+   * ```typescript
+   * const metadata = configParser.extractMetadata(tomlContent, '/path/to/config.toml');
+   * console.log('Env vars needed:', metadata.envVars);
+   * ```
+   */
+  extractMetadata: (content: string, filePath: string): ConfigFileMetadata => {
+    const envVars = tomlUtils.extractEnvVarNames(content);
+    const hasUnresolvedEnvVars = tomlUtils.hasUnresolvedEnvVars(content);
+    return {
+      path: filePath,
+      name: filePath.split('/').pop() || filePath,
+      envVars,
+      hasUnresolvedEnvVars,
+    };
+  },
+ 
+  /**
+   * Get default configuration
+   *
+   * @returns Default OpenFang configuration
+   */
+  getDefaults: (): OpenFangConfig => {
+    return JSON.parse(JSON.stringify(DEFAULT_CONFIG)) as OpenFangConfig;
+  },
+ 
+  /**
+   * Check if a configuration object is valid
+   *
+   * @param config - The configuration to check
+   * @returns Type guard for OpenFangConfig
+   */
+  isOpenFangConfig: (config: unknown): config is OpenFangConfig => {
+    const result = configParser.validateConfig(config);
+    return result.valid;
+  },
+};
+ 
+/**
+ * Helper function to get a nested value from an object using dot-notation path
+ */
+function getNestedValue(obj: Record<string, unknown>, path: string): unknown {
+  const parts = path.split('.');
+  let current: unknown = obj;
+  for (const part of parts) {
+    if (current === null || current === undefined) {
+      return undefined;
+    }
+    if (typeof current !== 'object') {
+      return undefined;
+    }
+    current = (current as Record<string, unknown>)[part];
+  }
+  return current;
+}
+ 
+/**
+ * Helper function to deep merge two objects
+ */
+function deepMerge<T extends Record<string, unknown>>(
+  target: Partial<T>,
+  source: Partial<T>
+): Partial<T> {
+  const result = { ...target };
+  for (const key of Object.keys(source) as (keyof T)[]) {
+    const sourceValue = source[key];
+    const targetValue = target[key];
+    if (
+      sourceValue !== undefined &&
+      typeof sourceValue === 'object' &&
+      sourceValue !== null &&
+      !Array.isArray(sourceValue) &&
+      targetValue !== undefined &&
+      typeof targetValue === 'object' &&
+      targetValue !== null &&
+      !Array.isArray(targetValue)
+    ) {
+      result[key] = deepMerge(
+        targetValue as Record<string, unknown>,
+        sourceValue as Record<string, unknown>
+      ) as T[keyof T];
+    } else if (sourceValue !== undefined) {
+      // Safe assignment: sourceValue is typed as Partial<T>[keyof T], result[key] expects T[keyof T]
+      result[key] = sourceValue as T[keyof T];
+    }
+  }
+  return result;
+}
+export default configParser;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/crypto-utils.ts.html b/desktop/coverage/src/lib/crypto-utils.ts.html new file mode 100644 index 0000000..d549963 --- /dev/null +++ b/desktop/coverage/src/lib/crypto-utils.ts.html @@ -0,0 +1,1165 @@ + + + + + + Code coverage report for src/lib/crypto-utils.ts + + + + + + + + + +
+
+

All files / src/lib crypto-utils.ts

+
+ +
+ 82.87% + Statements + 150/181 +
+ + +
+ 97.29% + Branches + 36/37 +
+ + +
+ 68.42% + Functions + 13/19 +
+ + +
+ 82.87% + Lines + 150/181 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +61x +  +59x +61x +1468x +1468x +59x +59x +  +  +  +  +1x +31x +  +29x +29x +31x +630x +630x +28x +28x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +13x +13x +13x +16x +  +  +16x +13x +  +  +  +  +13x +13x +13x +13x +13x +13x +13x +  +  +  +  +  +  +  +  +  +13x +13x +13x +13x +  +13x +  +  +13x +13x +13x +8x +8x +  +5x +5x +5x +5x +5x +5x +5x +5x +  +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +  +5x +  +5x +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +18x +18x +18x +18x +18x +18x +  +18x +18x +18x +18x +18x +  +18x +18x +18x +18x +18x +18x +  +  +  +  +  +  +  +  +13x +13x +13x +13x +13x +13x +13x +13x +13x +13x +  +12x +12x +  +  +  +  +  +  +  +1x +8x +8x +8x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +3x +1x +1x +  +2x +3x +8x +8x +  +2x +2x +  +  +  +  +  +  +  +2x +2x +2x +2x +2x +  +  +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +5x +1x +1x +  +4x +4x +4x +2x +1x +1x +  +5x + 
/**
+ * Cryptographic utilities for secure storage
+ * Uses Web Crypto API for AES-GCM encryption
+ *
+ * Security features:
+ * - AES-256-GCM for authenticated encryption
+ * - PBKDF2 with 100,000 iterations for key derivation
+ * - Random IV for each encryption operation
+ * - Constant-time comparison for integrity verification
+ * - Secure key caching with automatic expiration
+ */
+ 
+const SALT = new TextEncoder().encode('zclaw-secure-storage-salt');
+const ITERATIONS = 100000;
+const KEY_EXPIRY_MS = 30 * 60 * 1000; // 30 minutes
+ 
+/**
+ * Convert Uint8Array to base64 string
+ */
+export function arrayToBase64(array: Uint8Array): string {
+  if (array.length === 0) return '';
+ 
+  let binary = '';
+  for (let i = 0; i < array.length; i++) {
+    binary += String.fromCharCode(array[i]);
+  }
+  return btoa(binary);
+}
+ 
+/**
+ * Convert base64 string to Uint8Array
+ */
+export function base64ToArray(base64: string): Uint8Array {
+  if (!base64) return new Uint8Array([]);
+ 
+  const binary = atob(base64);
+  const array = new Uint8Array(binary.length);
+  for (let i = 0; i < binary.length; i++) {
+    array[i] = binary.charCodeAt(i);
+  }
+  return array;
+}
+ 
+/**
+ * Key cache entry with expiration
+ */
+interface CachedKey {
+  key: CryptoKey;
+  createdAt: number;
+}
+ 
+/**
+ * Cache for derived keys with automatic expiration
+ */
+const keyCache = new Map<string, CachedKey>();
+ 
+/**
+ * Clean up expired keys from cache
+ */
+function cleanupExpiredKeys(): void {
+  const now = Date.now();
+  for (const [cacheKey, entry] of keyCache.entries()) {
+    if (now - entry.createdAt > KEY_EXPIRY_MS) {
+      keyCache.delete(cacheKey);
+    }
+  }
+}
+ 
+/**
+ * Generate a cache key from master key and salt
+ */
+function getCacheKey(masterKey: string, salt: Uint8Array): string {
+  const encoder = new TextEncoder();
+  const combined = new Uint8Array(encoder.encode(masterKey).length + salt.length);
+  combined.set(encoder.encode(masterKey), 0);
+  combined.set(salt, encoder.encode(masterKey).length);
+  return arrayToBase64(combined.slice(0, 32)); // Use first 32 bytes as cache key
+}
+ 
+/**
+ * Derive an encryption key from a master key
+ * Uses PBKDF2 with SHA-256 for key derivation
+ *
+ * @param masterKey - The master key string
+ * @param salt - Optional salt (uses default if not provided)
+ * @returns Promise<CryptoKey> - The derived encryption key
+ */
+export async function deriveKey(
+  masterKey: string,
+  salt: Uint8Array = SALT
+): Promise<CryptoKey> {
+  // Clean up expired keys periodically
+  cleanupExpiredKeys();
+ 
+  // Check cache first
+  const cacheKey = getCacheKey(masterKey, salt);
+  const cached = keyCache.get(cacheKey);
+  if (cached && Date.now() - cached.createdAt < KEY_EXPIRY_MS) {
+    return cached.key;
+  }
+ 
+  const encoder = new TextEncoder();
+  const keyMaterial = await crypto.subtle.importKey(
+    'raw',
+    encoder.encode(masterKey),
+    'PBKDF2',
+    false,
+    ['deriveBits', 'deriveKey']
+  );
+ 
+  const derivedKey = await crypto.subtle.deriveKey(
+    {
+      name: 'PBKDF2',
+      salt,
+      iterations: ITERATIONS,
+      hash: 'SHA-256',
+    },
+    keyMaterial,
+    { name: 'AES-GCM', length: 256 },
+    false,
+    ['encrypt', 'decrypt']
+  );
+ 
+  // Cache the derived key
+  keyCache.set(cacheKey, { key: derivedKey, createdAt: Date.now() });
+ 
+  return derivedKey;
+}
+ 
+/**
+ * Encrypted data structure
+ */
+export interface EncryptedData {
+  iv: string;
+  data: string;
+  authTag?: string; // For future use with separate auth tag
+  version?: number; // Schema version for future migrations
+}
+ 
+/**
+ * Current encryption schema version
+ */
+const ENCRYPTION_VERSION = 1;
+ 
+/**
+ * Encrypt data using AES-GCM
+ *
+ * @param plaintext - The plaintext string to encrypt
+ * @param key - The encryption key
+ * @returns Promise<EncryptedData> - The encrypted data with IV
+ */
+export async function encrypt(
+  plaintext: string,
+  key: CryptoKey
+): Promise<EncryptedData> {
+  const encoder = new TextEncoder();
+  const iv = crypto.getRandomValues(new Uint8Array(12));
+ 
+  const encrypted = await crypto.subtle.encrypt(
+    { name: 'AES-GCM', iv },
+    key,
+    encoder.encode(plaintext)
+  );
+ 
+  return {
+    iv: arrayToBase64(iv),
+    data: arrayToBase64(new Uint8Array(encrypted)),
+    version: ENCRYPTION_VERSION,
+  };
+}
+ 
+/**
+ * Decrypt data using AES-GCM
+ *
+ * @param encrypted - The encrypted data object
+ * @param key - The decryption key
+ * @returns Promise<string> - The decrypted plaintext
+ */
+export async function decrypt(
+  encrypted: EncryptedData,
+  key: CryptoKey
+): Promise<string> {
+  const decoder = new TextDecoder();
+  const decrypted = await crypto.subtle.decrypt(
+    { name: 'AES-GCM', iv: base64ToArray(encrypted.iv) },
+    key,
+    base64ToArray(encrypted.data)
+  );
+ 
+  return decoder.decode(decrypted);
+}
+ 
+/**
+ * Generate a random master key for encryption
+ * Uses cryptographically secure random number generator
+ *
+ * @returns string - Base64-encoded 256-bit random key
+ */
+export function generateMasterKey(): string {
+  const array = crypto.getRandomValues(new Uint8Array(32));
+  return arrayToBase64(array);
+}
+ 
+/**
+ * Generate a random salt
+ *
+ * @param length - Salt length in bytes (default: 16)
+ * @returns Uint8Array - Random salt
+ */
+export function generateSalt(length: number = 16): Uint8Array {
+  return crypto.getRandomValues(new Uint8Array(length));
+}
+ 
+/**
+ * Constant-time comparison to prevent timing attacks
+ *
+ * @param a - First byte array
+ * @param b - Second byte array
+ * @returns boolean - True if arrays are equal
+ */
+export function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {
+  if (a.length !== b.length) {
+    return false;
+  }
+ 
+  let result = 0;
+  for (let i = 0; i < a.length; i++) {
+    result |= a[i] ^ b[i];
+  }
+ 
+  return result === 0;
+}
+ 
+/**
+ * Hash a string using SHA-256
+ *
+ * @param input - The input string to hash
+ * @returns Promise<string> - Hex-encoded hash
+ */
+export async function hashSha256(input: string): Promise<string> {
+  const encoder = new TextEncoder();
+  const data = encoder.encode(input);
+  const hashBuffer = await crypto.subtle.digest('SHA-256', data);
+  const hashArray = new Uint8Array(hashBuffer);
+ 
+  // Convert to hex string
+  return Array.from(hashArray)
+    .map(b => b.toString(16).padStart(2, '0'))
+    .join('');
+}
+ 
+/**
+ * Hash a string using SHA-512 (for sensitive data)
+ *
+ * @param input - The input string to hash
+ * @returns Promise<string> - Hex-encoded hash
+ */
+export async function hashSha512(input: string): Promise<string> {
+  const encoder = new TextEncoder();
+  const data = encoder.encode(input);
+  const hashBuffer = await crypto.subtle.digest('SHA-512', data);
+  const hashArray = new Uint8Array(hashBuffer);
+ 
+  return Array.from(hashArray)
+    .map(b => b.toString(16).padStart(2, '0'))
+    .join('');
+}
+ 
+/**
+ * Generate a cryptographically secure random string
+ *
+ * @param length - Length of the string (default: 32)
+ * @returns string - Random alphanumeric string
+ */
+export function generateRandomString(length: number = 32): string {
+  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+  const array = crypto.getRandomValues(new Uint8Array(length));
+  let result = '';
+  for (let i = 0; i < length; i++) {
+    result += chars[array[i] % chars.length];
+  }
+  return result;
+}
+ 
+/**
+ * Clear the key cache (for logout or security events)
+ */
+export function clearKeyCache(): void {
+  keyCache.clear();
+}
+ 
+/**
+ * Encrypt a JSON object
+ *
+ * @param obj - The object to encrypt
+ * @param key - The encryption key
+ * @returns Promise<EncryptedData> - The encrypted data
+ */
+export async function encryptObject<T>(
+  obj: T,
+  key: CryptoKey
+): Promise<EncryptedData> {
+  const plaintext = JSON.stringify(obj);
+  return encrypt(plaintext, key);
+}
+ 
+/**
+ * Decrypt a JSON object
+ *
+ * @param encrypted - The encrypted data
+ * @param key - The decryption key
+ * @returns Promise<T> - The decrypted object
+ */
+export async function decryptObject<T>(
+  encrypted: EncryptedData,
+  key: CryptoKey
+): Promise<T> {
+  const plaintext = await decrypt(encrypted, key);
+  return JSON.parse(plaintext) as T;
+}
+ 
+/**
+ * Securely wipe a string from memory (best effort)
+ * Note: JavaScript strings are immutable, so this only works for
+ * data that was explicitly copied to a Uint8Array
+ *
+ * @param array - The byte array to wipe
+ */
+export function secureWipe(array: Uint8Array): void {
+  crypto.getRandomValues(array);
+  array.fill(0);
+}
+ 
+/**
+ * Check if Web Crypto API is available
+ */
+export function isCryptoAvailable(): boolean {
+  return (
+    typeof crypto !== 'undefined' &&
+    typeof crypto.subtle !== 'undefined' &&
+    typeof crypto.getRandomValues === 'function'
+  );
+}
+ 
+/**
+ * Validate encrypted data structure
+ */
+export function isValidEncryptedData(data: unknown): data is EncryptedData {
+  if (typeof data !== 'object' || data === null) {
+    return false;
+  }
+ 
+  const obj = data as Record<string, unknown>;
+  return (
+    typeof obj.iv === 'string' &&
+    typeof obj.data === 'string' &&
+    obj.iv.length > 0 &&
+    obj.data.length > 0
+  );
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/encrypted-chat-storage.ts.html b/desktop/coverage/src/lib/encrypted-chat-storage.ts.html new file mode 100644 index 0000000..3e59d12 --- /dev/null +++ b/desktop/coverage/src/lib/encrypted-chat-storage.ts.html @@ -0,0 +1,1321 @@ + + + + + + Code coverage report for src/lib/encrypted-chat-storage.ts + + + + + + + + + +
+
+

All files / src/lib encrypted-chat-storage.ts

+
+ +
+ 0% + Statements + 0/233 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/233 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Encrypted Chat History Storage
+ *
+ * Provides encrypted persistence for chat messages and conversations.
+ * Uses AES-256-GCM encryption with the secure storage infrastructure.
+ *
+ * Security features:
+ * - All chat data encrypted at rest
+ * - Master key stored in OS keychain when available
+ * - Automatic key derivation with key rotation support
+ * - Secure backup to encrypted localStorage
+ */
+ 
+import {
+  deriveKey,
+  encryptObject,
+  decryptObject,
+  generateMasterKey,
+  hashSha256,
+  isValidEncryptedData,
+  clearKeyCache,
+} from './crypto-utils';
+import { secureStorage, isSecureStorageAvailable } from './secure-storage';
+ 
+// Storage keys
+const CHAT_DATA_KEY = 'zclaw_chat_data';
+const CHAT_KEY_IDENTIFIER = 'zclaw_chat_master_key';
+const CHAT_KEY_HASH_KEY = 'zclaw_chat_key_hash';
+const ENCRYPTED_PREFIX = 'enc_chat_';
+ 
+// Encryption version for future migrations
+const STORAGE_VERSION = 1;
+ 
+/**
+ * Storage metadata for integrity verification
+ */
+interface StorageMetadata {
+  version: number;
+  keyHash: string;
+  createdAt: number;
+  lastAccessedAt: number;
+  encryptedAt: number;
+}
+ 
+/**
+ * Encrypted storage container
+ */
+interface EncryptedContainer {
+  metadata: StorageMetadata;
+  data: string; // Encrypted payload
+}
+ 
+/**
+ * Cached crypto key for chat encryption
+ */
+let cachedChatKey: CryptoKey | null = null;
+let keyHash: string | null = null;
+ 
+/**
+ * Get or initialize the master encryption key for chat storage
+ * Uses OS keychain when available, falls back to encrypted localStorage
+ */
+async function getOrCreateMasterKey(): Promise<string> {
+  // Try to get existing key from secure storage
+  const existingKey = await secureStorage.get(CHAT_KEY_IDENTIFIER);
+  if (existingKey) {
+    return existingKey;
+  }
+ 
+  // Generate new master key
+  const newKey = generateMasterKey();
+ 
+  // Store in secure storage (keychain or encrypted localStorage)
+  await secureStorage.set(CHAT_KEY_IDENTIFIER, newKey);
+ 
+  // Store hash for integrity verification
+  const keyHashValue = await hashSha256(newKey);
+  localStorage.setItem(CHAT_KEY_HASH_KEY, keyHashValue);
+ 
+  console.log('[EncryptedChatStorage] Generated new master key');
+  return newKey;
+}
+ 
+/**
+ * Get the derived encryption key for chat data
+ */
+async function getChatEncryptionKey(): Promise<CryptoKey> {
+  if (cachedChatKey && keyHash) {
+    // Verify key hash matches
+    const storedHash = localStorage.getItem(CHAT_KEY_HASH_KEY);
+    if (storedHash === keyHash) {
+      return cachedChatKey;
+    }
+    // Hash mismatch - clear cache and re-derive
+    console.warn('[EncryptedChatStorage] Key hash mismatch, re-deriving key');
+    cachedChatKey = null;
+    keyHash = null;
+  }
+ 
+  const masterKey = await getOrCreateMasterKey();
+  cachedChatKey = await deriveKey(masterKey);
+  keyHash = await hashSha256(masterKey);
+ 
+  return cachedChatKey;
+}
+ 
+/**
+ * Initialize encrypted chat storage
+ * Called during app startup
+ */
+export async function initializeEncryptedChatStorage(): Promise<void> {
+  try {
+    // Pre-load the encryption key
+    await getChatEncryptionKey();
+ 
+    // Check if we have existing encrypted data to migrate
+    const legacyData = localStorage.getItem('zclaw-chat-storage');
+    if (legacyData && !localStorage.getItem(ENCRYPTED_PREFIX + 'migrated')) {
+      await migrateFromLegacyStorage(legacyData);
+      localStorage.setItem(ENCRYPTED_PREFIX + 'migrated', 'true');
+      console.log('[EncryptedChatStorage] Migrated legacy data');
+    }
+ 
+    console.log('[EncryptedChatStorage] Initialized successfully');
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Initialization failed:', error);
+    throw error;
+  }
+}
+ 
+/**
+ * Migrate data from legacy unencrypted storage
+ */
+async function migrateFromLegacyStorage(legacyData: string): Promise<void> {
+  try {
+    const parsed = JSON.parse(legacyData);
+    if (parsed?.state?.conversations) {
+      await saveConversations(parsed.state.conversations);
+      console.log(`[EncryptedChatStorage] Migrated ${parsed.state.conversations.length} conversations`);
+    }
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Migration failed:', error);
+  }
+}
+ 
+/**
+ * Save conversations to encrypted storage
+ *
+ * @param conversations - Array of conversation objects
+ */
+export async function saveConversations(conversations: unknown[]): Promise<void> {
+  if (!conversations || conversations.length === 0) {
+    return;
+  }
+ 
+  try {
+    const key = await getChatEncryptionKey();
+    const now = Date.now();
+ 
+    // Create container with metadata
+    const container: EncryptedContainer = {
+      metadata: {
+        version: STORAGE_VERSION,
+        keyHash: keyHash || '',
+        createdAt: now,
+        lastAccessedAt: now,
+        encryptedAt: now,
+      },
+      data: '', // Will be set after encryption
+    };
+ 
+    // Encrypt the conversations array
+    const encrypted = await encryptObject(conversations, key);
+    container.data = JSON.stringify(encrypted);
+ 
+    // Store the encrypted container
+    localStorage.setItem(CHAT_DATA_KEY, JSON.stringify(container));
+ 
+    console.log(`[EncryptedChatStorage] Saved ${conversations.length} conversations`);
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Failed to save conversations:', error);
+    throw error;
+  }
+}
+ 
+/**
+ * Load conversations from encrypted storage
+ *
+ * @returns Array of conversation objects or empty array if none exist
+ */
+export async function loadConversations<T = unknown>(): Promise<T[]> {
+  try {
+    const stored = localStorage.getItem(CHAT_DATA_KEY);
+    if (!stored) {
+      return [];
+    }
+ 
+    const container: EncryptedContainer = JSON.parse(stored);
+ 
+    // Validate container structure
+    if (!container.data || !container.metadata) {
+      console.warn('[EncryptedChatStorage] Invalid container structure');
+      return [];
+    }
+ 
+    // Check version compatibility
+    if (container.metadata.version > STORAGE_VERSION) {
+      console.error('[EncryptedChatStorage] Incompatible storage version');
+      return [];
+    }
+ 
+    // Parse and decrypt the data
+    const encryptedData = JSON.parse(container.data);
+    if (!isValidEncryptedData(encryptedData)) {
+      console.error('[EncryptedChatStorage] Invalid encrypted data');
+      return [];
+    }
+ 
+    const key = await getChatEncryptionKey();
+    const conversations = await decryptObject<T[]>(encryptedData, key);
+ 
+    // Update last accessed time
+    container.metadata.lastAccessedAt = Date.now();
+    localStorage.setItem(CHAT_DATA_KEY, JSON.stringify(container));
+ 
+    console.log(`[EncryptedChatStorage] Loaded ${conversations.length} conversations`);
+    return conversations;
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Failed to load conversations:', error);
+    return [];
+  }
+}
+ 
+/**
+ * Delete all chat data from storage
+ */
+export async function clearAllChatData(): Promise<void> {
+  try {
+    // Clear encrypted data
+    localStorage.removeItem(CHAT_DATA_KEY);
+    localStorage.removeItem(ENCRYPTED_PREFIX + 'migrated');
+ 
+    // Clear the master key from secure storage
+    await secureStorage.delete(CHAT_KEY_IDENTIFIER);
+    localStorage.removeItem(CHAT_KEY_HASH_KEY);
+ 
+    // Clear cached key
+    cachedChatKey = null;
+    keyHash = null;
+    clearKeyCache();
+ 
+    console.log('[EncryptedChatStorage] Cleared all chat data');
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Failed to clear chat data:', error);
+    throw error;
+  }
+}
+ 
+/**
+ * Export encrypted chat data for backup
+ * Returns encrypted blob that can be imported later
+ *
+ * @returns Base64-encoded encrypted backup
+ */
+export async function exportEncryptedBackup(): Promise<string> {
+  try {
+    const stored = localStorage.getItem(CHAT_DATA_KEY);
+    if (!stored) {
+      throw new Error('No chat data to export');
+    }
+ 
+    // The data is already encrypted, just return it
+    const container: EncryptedContainer = JSON.parse(stored);
+    const exportData = {
+      type: 'zclaw_chat_backup',
+      version: STORAGE_VERSION,
+      exportedAt: Date.now(),
+      container,
+    };
+ 
+    return btoa(JSON.stringify(exportData));
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Export failed:', error);
+    throw error;
+  }
+}
+ 
+/**
+ * Import encrypted chat data from backup
+ *
+ * @param backupData - Base64-encoded encrypted backup
+ * @param merge - Whether to merge with existing data (default: false, replaces)
+ */
+export async function importEncryptedBackup(
+  backupData: string,
+  merge: boolean = false
+): Promise<void> {
+  try {
+    const decoded = JSON.parse(atob(backupData));
+ 
+    // Validate backup format
+    if (decoded.type !== 'zclaw_chat_backup') {
+      throw new Error('Invalid backup format');
+    }
+ 
+    if (decoded.version > STORAGE_VERSION) {
+      throw new Error('Incompatible backup version');
+    }
+ 
+    if (merge) {
+      // Load existing conversations and merge
+      const existing = await loadConversations();
+      const imported = await decryptObject<unknown[]>(
+        JSON.parse(decoded.container.data),
+        await getChatEncryptionKey()
+      );
+      const merged = [...existing, ...imported];
+      await saveConversations(merged);
+    } else {
+      // Replace existing data
+      localStorage.setItem(CHAT_DATA_KEY, JSON.stringify(decoded.container));
+    }
+ 
+    console.log('[EncryptedChatStorage] Import completed successfully');
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Import failed:', error);
+    throw error;
+  }
+}
+ 
+/**
+ * Check if encrypted storage is being used
+ */
+export async function isEncryptedStorageActive(): Promise<boolean> {
+  const stored = localStorage.getItem(CHAT_DATA_KEY);
+  if (!stored) {
+    return false;
+  }
+ 
+  try {
+    const container: EncryptedContainer = JSON.parse(stored);
+    return container.metadata?.version === STORAGE_VERSION;
+  } catch {
+    return false;
+  }
+}
+ 
+/**
+ * Get storage statistics
+ */
+export async function getStorageStats(): Promise<{
+  encrypted: boolean;
+  usingKeychain: boolean;
+  conversationCount: number;
+  storageSize: number;
+}> {
+  const stored = localStorage.getItem(CHAT_DATA_KEY);
+  let conversationCount = 0;
+  let encrypted = false;
+ 
+  if (stored) {
+    try {
+      const container: EncryptedContainer = JSON.parse(stored);
+      encrypted = container.metadata?.version === STORAGE_VERSION;
+ 
+      // Count conversations without full decryption
+      const conversations = await loadConversations();
+      conversationCount = conversations.length;
+    } catch {
+      // Ignore parsing errors
+    }
+  }
+ 
+  return {
+    encrypted,
+    usingKeychain: await isSecureStorageAvailable(),
+    conversationCount,
+    storageSize: stored ? new Blob([stored]).size : 0,
+  };
+}
+ 
+/**
+ * Rotate encryption key
+ * Re-encrypts all data with a new key
+ */
+export async function rotateEncryptionKey(): Promise<void> {
+  try {
+    // Load existing data
+    const conversations = await loadConversations();
+ 
+    // Clear old key
+    await secureStorage.delete(CHAT_KEY_IDENTIFIER);
+    localStorage.removeItem(CHAT_KEY_HASH_KEY);
+    cachedChatKey = null;
+    keyHash = null;
+    clearKeyCache();
+ 
+    // Generate new key (will be created on next getChatEncryptionKey call)
+    const newKey = generateMasterKey();
+    await secureStorage.set(CHAT_KEY_IDENTIFIER, newKey);
+    const newKeyHash = await hashSha256(newKey);
+    localStorage.setItem(CHAT_KEY_HASH_KEY, newKeyHash);
+ 
+    // Re-save all data with new key
+    await saveConversations(conversations);
+ 
+    console.log('[EncryptedChatStorage] Encryption key rotated successfully');
+  } catch (error) {
+    console.error('[EncryptedChatStorage] Key rotation failed:', error);
+    throw error;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/error-handling.ts.html b/desktop/coverage/src/lib/error-handling.ts.html new file mode 100644 index 0000000..fc7bb3f --- /dev/null +++ b/desktop/coverage/src/lib/error-handling.ts.html @@ -0,0 +1,1258 @@ + + + + + + Code coverage report for src/lib/error-handling.ts + + + + + + + + + +
+
+

All files / src/lib error-handling.ts

+
+ +
+ 0% + Statements + 0/238 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/238 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ZCLAW Error Handling Utilities
+ *
+ * Centralized error reporting, notification, and tracking system.
+ */
+ 
+import { v4 as uuidv4 } from 'uuid';
+import {
+  AppError,
+  classifyError,
+  ErrorCategory,
+  ErrorSeverity,
+} from './error-types';
+ 
+// === Types ===
+ 
+export interface StoredError extends AppError {
+  dismissed: boolean;
+  reported: boolean;
+  stack?: string;
+  context?: Record<string, unknown>;
+}
+ 
+// === Error Store ===
+ 
+interface ErrorStore {
+  errors: StoredError[];
+  addError: (error: AppError) => void;
+  dismissError: (id: string) => void;
+  dismissAll: () => void;
+  markReported: (id: string) => void;
+  getUndismissedErrors: () => StoredError[];
+  getErrorCount: () => number;
+  getErrorsByCategory: (category: ErrorCategory) => StoredError[];
+  getErrorsBySeverity: (severity: ErrorSeverity) => StoredError[];
+}
+ 
+// === Global Error Store ===
+ 
+let errorStore: ErrorStore = {
+  errors: [],
+  addError: () => {},
+  dismissError: () => {},
+  dismissAll: () => {},
+  markReported: () => {},
+  getUndismissedErrors: () => [],
+  getErrorCount: () => 0,
+  getErrorsByCategory: () => [],
+  getErrorsBySeverity: () => [],
+};
+ 
+// === Initialize Store ===
+ 
+function initErrorStore(): void {
+  errorStore = {
+    errors: [],
+ 
+    addError: (error: AppError) => {
+      const storedError: StoredError = {
+        ...error,
+        dismissed: false,
+        reported: false,
+      };
+      errorStore.errors = [storedError, ...errorStore.errors];
+      // Notify listeners
+      notifyErrorListeners(error);
+    },
+ 
+    dismissError(id: string): void {
+      const error = errorStore.errors.find(e => e.id === id);
+      if (error) {
+        errorStore.errors = errorStore.errors.map(e =>
+          e.id === id ? { ...e, dismissed: true } : e
+        );
+      }
+    },
+ 
+    dismissAll(): void {
+      errorStore.errors = errorStore.errors.map(e => ({ ...e, dismissed: true }));
+    },
+ 
+    markReported(id: string): void {
+      const error = errorStore.errors.find(e => e.id === id);
+      if (error) {
+        errorStore.errors = errorStore.errors.map(e =>
+          e.id === id ? { ...e, reported: true } : e
+        );
+      }
+    },
+ 
+    getUndismissedErrors(): StoredError[] {
+      return errorStore.errors.filter(e => !e.dismissed);
+    },
+ 
+    getErrorCount(): number {
+      return errorStore.errors.filter(e => !e.dismissed).length;
+    },
+ 
+    getErrorsByCategory(category: ErrorCategory): StoredError[] {
+      return errorStore.errors.filter(e => e.category === category && !e.dismissed);
+    },
+ 
+    getErrorsBySeverity(severity: ErrorSeverity): StoredError[] {
+      return errorStore.errors.filter(e => e.severity === severity && !e.dismissed);
+    },
+  };
+}
+ 
+// === Error Listeners ===
+ 
+type ErrorListener = (error: AppError) => void;
+const errorListeners: Set<ErrorListener> = new Set();
+ 
+function addErrorListener(listener: ErrorListener): () => void {
+  errorListeners.add(listener);
+  return () => errorListeners.delete(listener);
+}
+ 
+function notifyErrorListeners(error: AppError): void {
+  errorListeners.forEach(listener => {
+    try {
+      listener(error);
+    } catch (e) {
+      console.error('[ErrorHandling] Listener error:', e);
+    }
+  });
+}
+ 
+// Initialize on first import
+initErrorStore();
+ 
+// === Public API ===
+ 
+/**
+ * Report an error to the centralized error handling system.
+ */
+export function reportError(
+  error: unknown,
+  context?: {
+    componentStack?: string;
+    errorName?: string;
+    errorMessage?: string;
+  }
+): AppError {
+  const appError = classifyError(error);
+ 
+  // Add context information if provided
+  if (context) {
+    const technicalDetails = [
+      context.componentStack && `Component Stack:\n${context.componentStack}`,
+      context.errorName && `Error Name: ${context.errorName}`,
+      context.errorMessage && `Error Message: ${context.errorMessage}`,
+    ].filter(Boolean).join('\n\n');
+ 
+    if (technicalDetails) {
+      (appError as { technicalDetails?: string }).technicalDetails = technicalDetails;
+    }
+  }
+ 
+  errorStore.addError(appError);
+ 
+  // Log to console in development
+  if (import.meta.env.DEV) {
+    console.error('[ErrorHandling] Error reported:', {
+      id: appError.id,
+      category: appError.category,
+      severity: appError.severity,
+      title: appError.title,
+      message: appError.message,
+    });
+  }
+ 
+  return appError;
+}
+ 
+/**
+ * Report an error from an API response.
+ */
+export function reportApiError(
+  response: Response,
+  endpoint: string,
+  method: string = 'GET'
+): AppError {
+  const status = response.status;
+  let category: ErrorCategory = 'server';
+  let severity: ErrorSeverity = 'medium';
+  let title = 'API Error';
+  let message = `Request to ${endpoint} failed with status ${status}`;
+  let recoverySteps: { description: string }[] = [];
+ 
+  if (status === 401) {
+    category = 'auth';
+    severity = 'high';
+    title = 'Authentication Required';
+    message = 'Your session has expired. Please authenticate again.';
+    recoverySteps = [
+      { description: 'Click "Reconnect" to authenticate' },
+      { description: 'Check your API key in settings' },
+    ];
+  } else if (status === 403) {
+    category = 'permission';
+    severity = 'medium';
+    title = 'Permission Denied';
+    message = 'You do not have permission to perform this action.';
+    recoverySteps = [
+      { description: 'Contact your administrator for access' },
+      { description: 'Check your RBAC configuration' },
+    ];
+  } else if (status === 404) {
+    category = 'client';
+    severity = 'low';
+    title = 'Not Found';
+    message = `The requested resource was not found: ${endpoint}`;
+    recoverySteps = [
+      { description: 'Verify the resource exists' },
+      { description: 'Check the URL is correct' },
+    ];
+  } else if (status === 422) {
+    category = 'validation';
+    severity = 'low';
+    title = 'Validation Error';
+    message = 'The request data is invalid.';
+    recoverySteps = [
+      { description: 'Check your input data format' },
+      { description: 'Verify required fields are provided' },
+    ];
+  } else if (status === 429) {
+    category = 'client';
+    severity = 'medium';
+    title = 'Rate Limited';
+    message = 'Too many requests. Please wait before trying again.';
+    recoverySteps = [
+      { description: 'Wait a moment before retrying' },
+      { description: 'Reduce request frequency' },
+    ];
+  } else if (status >= 500) {
+    category = 'server';
+    severity = 'high';
+    title = 'Server Error';
+    message = 'The server encountered an error processing your request.';
+    recoverySteps = [
+      { description: 'Try again in a few moments' },
+      { description: 'Contact support if the problem persists' },
+    ];
+  }
+ 
+  const appError: AppError = {
+    id: uuidv4(),
+    category,
+    severity,
+    title,
+    message,
+    technicalDetails: `${method} ${endpoint}\nStatus: ${status}\nResponse: ${response.statusText}`,
+    recoverable: status !== 500 || status < 400,
+    recoverySteps,
+    timestamp: new Date(),
+    originalError: response,
+  };
+ 
+  errorStore.addError(appError);
+  return appError;
+}
+ 
+/**
+ * Report a network error.
+ */
+export function reportNetworkError(
+  error: Error,
+  url?: string
+): AppError {
+  return reportError(error, {
+    errorMessage: url ? `URL: ${url}\n${error.message}` : error.message,
+  });
+}
+ 
+/**
+ * Report a WebSocket error.
+ */
+export function reportWebSocketError(
+  event: CloseEvent | ErrorEvent,
+  url: string
+): AppError {
+  const code = 'code' in event ? event.code : 0;
+  const reason = 'reason' in event ? event.reason : 'Unknown';
+ 
+  return reportError(
+    new Error(`WebSocket error: ${reason} (code: ${code})`),
+    {
+      errorMessage: `WebSocket URL: ${url}\nCode: ${code}\nReason: ${reason}`,
+    }
+  );
+}
+ 
+/**
+ * Dismiss an error by ID.
+ */
+export function dismissError(id: string): void {
+  errorStore.dismissError(id);
+}
+ 
+/**
+ * Dismiss all active errors.
+ */
+export function dismissAllErrors(): void {
+  errorStore.dismissAll();
+}
+ 
+/**
+ * Dismiss all active errors (alias for dismissAllErrors).
+ */
+export function dismissAll(): void {
+  errorStore.dismissAll();
+}
+ 
+/**
+ * Mark an error as reported.
+ */
+export function markErrorReported(id: string): void {
+  errorStore.markReported(id);
+}
+ 
+/**
+ * Get all active (non-dismissed) errors.
+ */
+export function getActiveErrors(): StoredError[] {
+  return errorStore.getUndismissedErrors();
+}
+ 
+/**
+ * Get all undismissed errors (alias for getActiveErrors).
+ */
+export function getUndismissedErrors(): StoredError[] {
+  return errorStore.getUndismissedErrors();
+}
+ 
+/**
+ * Get the count of active errors.
+ */
+export function getActiveErrorCount(): number {
+  return errorStore.getErrorCount();
+}
+ 
+/**
+ * Get errors filtered by category.
+ */
+export function getErrorsByCategory(category: ErrorCategory): StoredError[] {
+  return errorStore.getErrorsByCategory(category);
+}
+ 
+/**
+ * Get errors filtered by severity.
+ */
+export function getErrorsBySeverity(severity: ErrorSeverity): StoredError[] {
+  return errorStore.getErrorsBySeverity(severity);
+}
+ 
+/**
+ * Subscribe to error events.
+ */
+export function subscribeToErrors(listener: ErrorListener): () => void {
+  return addErrorListener(listener);
+}
+ 
+/**
+ * Check if there are any critical errors.
+ */
+export function hasCriticalErrors(): boolean {
+  return errorStore.getErrorsBySeverity('critical').length > 0;
+}
+ 
+/**
+ * Check if there are any high severity errors.
+ */
+export function hasHighSeverityErrors(): boolean {
+  const highSeverity = ['high', 'critical'];
+  return errorStore.errors.some(e => highSeverity.includes(e.severity) && !e.dismissed);
+}
+ 
+// === Types ===
+ 
+interface CloseEvent {
+  code?: number;
+  reason?: string;
+  wasClean?: boolean;
+}
+ 
+interface ErrorEvent {
+  code?: number;
+  reason?: string;
+  message?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/error-types.ts.html b/desktop/coverage/src/lib/error-types.ts.html new file mode 100644 index 0000000..67e135d --- /dev/null +++ b/desktop/coverage/src/lib/error-types.ts.html @@ -0,0 +1,1669 @@ + + + + + + Code coverage report for src/lib/error-types.ts + + + + + + + + + +
+
+

All files / src/lib error-types.ts

+
+ +
+ 0% + Statements + 0/407 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/407 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ZCLAW Error Types and Utilities
+ *
+ * Provides a unified error classification system with recovery suggestions
+ * for user-friendly error handling.
+ */
+ 
+// === Error Categories ===
+ 
+export type ErrorCategory =
+  | 'network'      // Network connectivity issues
+  | 'auth'         // Authentication and authorization failures
+  | 'permission'   // RBAC permission denied
+  | 'validation'   // Input validation errors
+  | 'timeout'      // Request timeout
+  | 'server'       // Server-side errors (5xx)
+  | 'client'       // Client-side errors (4xx)
+  | 'config'       // Configuration errors
+  | 'system';      // System/runtime errors
+ 
+// === Error Severity ===
+ 
+export type ErrorSeverity = 'low' | 'medium' | 'high' | 'critical';
+ 
+// === App Error Interface ===
+ 
+export interface AppError {
+  id: string;
+  category: ErrorCategory;
+  severity: ErrorSeverity;
+  title: string;
+  message: string;
+  technicalDetails?: string;
+  recoverable: boolean;
+  recoverySteps: RecoveryStep[];
+  timestamp: Date;
+  originalError?: unknown;
+}
+ 
+export interface RecoveryStep {
+  description: string;
+  action?: () => void | Promise<void>;
+  label?: string;
+}
+ 
+// === Error Detection Patterns ===
+ 
+interface ErrorPattern {
+  patterns: (string | RegExp)[];
+  category: ErrorCategory;
+  severity: ErrorSeverity;
+  title: string;
+  messageTemplate: (match: string) => string;
+  recoverySteps: RecoveryStep[];
+  recoverable: boolean;
+}
+ 
+const ERROR_PATTERNS: ErrorPattern[] = [
+  // Network Errors
+  {
+    patterns: [
+      'Failed to fetch',
+      'NetworkError',
+      'ERR_NETWORK',
+      'ERR_CONNECTION_REFUSED',
+      'ERR_CONNECTION_RESET',
+      'ERR_INTERNET_DISCONNECTED',
+      'WebSocket connection failed',
+      'ECONNREFUSED',
+    ],
+    category: 'network',
+    severity: 'high',
+    title: 'Network Connection Error',
+    messageTemplate: () => 'Unable to connect to the server. Please check your network connection.',
+    recoverySteps: [
+      { description: 'Check your internet connection is active' },
+      { description: 'Verify the server address is correct' },
+      { description: 'Try again in a few moments' },
+    ],
+    recoverable: true,
+  },
+  {
+    patterns: ['ERR_NAME_NOT_RESOLVED', 'DNS', 'ENOTFOUND'],
+    category: 'network',
+    severity: 'high',
+    title: 'DNS Resolution Failed',
+    messageTemplate: () => 'Could not resolve the server address. The server may be offline or the address is incorrect.',
+    recoverySteps: [
+      { description: 'Verify the server URL is correct' },
+      { description: 'Check if the server is running' },
+      { description: 'Try using an IP address instead of hostname' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Authentication Errors
+  {
+    patterns: [
+      '401',
+      'Unauthorized',
+      'Invalid token',
+      'Token expired',
+      'Authentication failed',
+      'Not authenticated',
+      'JWT expired',
+    ],
+    category: 'auth',
+    severity: 'high',
+    title: 'Authentication Failed',
+    messageTemplate: () => 'Your session has expired or is invalid. Please log in again.',
+    recoverySteps: [
+      { description: 'Click "Reconnect" to authenticate again' },
+      { description: 'Check your API key or credentials in settings' },
+      { description: 'Verify your account is active' },
+    ],
+    recoverable: true,
+  },
+  {
+    patterns: ['Invalid API key', 'API key expired', 'Invalid credentials'],
+    category: 'auth',
+    severity: 'high',
+    title: 'Invalid Credentials',
+    messageTemplate: () => 'The provided API key or credentials are invalid.',
+    recoverySteps: [
+      { description: 'Check your API key in the settings' },
+      { description: 'Generate a new API key from your provider dashboard' },
+      { description: 'Ensure the key has not been revoked' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Permission Errors
+  {
+    patterns: [
+      '403',
+      'Forbidden',
+      'Permission denied',
+      'Access denied',
+      'Insufficient permissions',
+      'RBAC',
+      'Not authorized',
+    ],
+    category: 'permission',
+    severity: 'medium',
+    title: 'Permission Denied',
+    messageTemplate: () => 'You do not have permission to perform this action.',
+    recoverySteps: [
+      { description: 'Contact your administrator for access' },
+      { description: 'Check your role has the required capabilities' },
+      { description: 'Verify the resource exists and you have access' },
+    ],
+    recoverable: false,
+  },
+ 
+  // Timeout Errors
+  {
+    patterns: [
+      'ETIMEDOUT',
+      'Timeout',
+      'Request timeout',
+      'timed out',
+      'Deadline exceeded',
+    ],
+    category: 'timeout',
+    severity: 'medium',
+    title: 'Request Timeout',
+    messageTemplate: () => 'The request took too long to complete. The server may be overloaded.',
+    recoverySteps: [
+      { description: 'Try again with a simpler request' },
+      { description: 'Wait a moment and retry' },
+      { description: 'Check server status and load' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Validation Errors
+  {
+    patterns: [
+      '400',
+      'Bad Request',
+      'Validation failed',
+      'Invalid input',
+      'Invalid parameter',
+      'Schema validation',
+    ],
+    category: 'validation',
+    severity: 'low',
+    title: 'Invalid Input',
+    messageTemplate: (match) => `The request contains invalid data: ${match}`,
+    recoverySteps: [
+      { description: 'Check your input for errors' },
+      { description: 'Ensure all required fields are filled' },
+      { description: 'Verify the format matches requirements' },
+    ],
+    recoverable: true,
+  },
+  {
+    patterns: ['413', 'Payload too large', 'Request entity too large'],
+    category: 'validation',
+    severity: 'medium',
+    title: 'Request Too Large',
+    messageTemplate: () => 'The request exceeds the maximum allowed size.',
+    recoverySteps: [
+      { description: 'Reduce the size of your input' },
+      { description: 'Split large requests into smaller ones' },
+      { description: 'Remove unnecessary attachments or data' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Server Errors
+  {
+    patterns: [
+      '500',
+      'Internal Server Error',
+      'InternalServerError',
+      '502',
+      'Bad Gateway',
+      '503',
+      'Service Unavailable',
+      '504',
+      'Gateway Timeout',
+    ],
+    category: 'server',
+    severity: 'high',
+    title: 'Server Error',
+    messageTemplate: () => 'The server encountered an error and could not complete your request.',
+    recoverySteps: [
+      { description: 'Wait a few moments and try again' },
+      { description: 'Check the service status page' },
+      { description: 'Contact support if the problem persists' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Rate Limiting
+  {
+    patterns: ['429', 'Too Many Requests', 'Rate limit', 'quota exceeded'],
+    category: 'client',
+    severity: 'medium',
+    title: 'Rate Limited',
+    messageTemplate: () => 'Too many requests. Please wait before trying again.',
+    recoverySteps: [
+      { description: 'Wait a minute before sending more requests' },
+      { description: 'Reduce request frequency' },
+      { description: 'Check your usage quota' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Configuration Errors
+  {
+    patterns: [
+      'Config not found',
+      'Invalid configuration',
+      'TOML parse error',
+      'Missing configuration',
+    ],
+    category: 'config',
+    severity: 'medium',
+    title: 'Configuration Error',
+    messageTemplate: () => 'There is a problem with the application configuration.',
+    recoverySteps: [
+      { description: 'Check your configuration file syntax' },
+      { description: 'Verify all required settings are present' },
+      { description: 'Reset to default configuration if needed' },
+    ],
+    recoverable: true,
+  },
+ 
+  // WebSocket Errors
+  {
+    patterns: [
+      'WebSocket',
+      'socket closed',
+      'socket hang up',
+      'Connection closed',
+      'Not connected',
+    ],
+    category: 'network',
+    severity: 'high',
+    title: 'Connection Lost',
+    messageTemplate: () => 'The connection to the server was lost. Attempting to reconnect...',
+    recoverySteps: [
+      { description: 'Check your network connection' },
+      { description: 'Click "Reconnect" to establish a new connection' },
+      { description: 'Verify the server is running' },
+    ],
+    recoverable: true,
+  },
+ 
+  // Hand/Workflow Errors
+  {
+    patterns: ['Hand failed', 'Hand error', 'needs_approval', 'approval required'],
+    category: 'permission',
+    severity: 'medium',
+    title: 'Hand Execution Failed',
+    messageTemplate: () => 'The autonomous capability (Hand) could not execute.',
+    recoverySteps: [
+      { description: 'Check if the Hand requires approval' },
+      { description: 'Verify you have the necessary permissions' },
+      { description: 'Review the Hand configuration' },
+    ],
+    recoverable: true,
+  },
+  {
+    patterns: ['Workflow failed', 'Workflow error', 'step failed'],
+    category: 'server',
+    severity: 'medium',
+    title: 'Workflow Execution Failed',
+    messageTemplate: () => 'The workflow encountered an error during execution.',
+    recoverySteps: [
+      { description: 'Review the workflow steps for errors' },
+      { description: 'Check the workflow configuration' },
+      { description: 'Try running individual steps manually' },
+    ],
+    recoverable: true,
+  },
+];
+ 
+// === Error Classification Function ===
+ 
+function matchPattern(error: unknown): { pattern: ErrorPattern; match: string } | null {
+  const errorString = typeof error === 'string'
+    ? error
+    : error instanceof Error
+      ? `${error.message} ${error.name} ${error.stack || ''}`
+      : String(error);
+ 
+  for (const pattern of ERROR_PATTERNS) {
+    for (const p of pattern.patterns) {
+      const regex = p instanceof RegExp ? p : new RegExp(p, 'i');
+      const match = errorString.match(regex);
+      if (match) {
+        return { pattern, match: match[0] };
+      }
+    }
+  }
+  return null;
+}
+ 
+/**
+ * Classify an error and create an AppError with recovery suggestions.
+ */
+export function classifyError(error: unknown): AppError {
+  const matched = matchPattern(error);
+ 
+  if (matched) {
+    const { pattern, match } = matched;
+    return {
+      id: `err_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
+      category: pattern.category,
+      severity: pattern.severity,
+      title: pattern.title,
+      message: pattern.messageTemplate(match),
+      // Only include name and message, not stack trace (security)
+      technicalDetails: error instanceof Error
+        ? `${error.name}: ${error.message}`
+        : String(error),
+      recoverable: pattern.recoverable,
+      recoverySteps: pattern.recoverySteps,
+      timestamp: new Date(),
+      // Only preserve original error in development mode
+      originalError: import.meta.env.DEV ? error : undefined,
+    };
+  }
+ 
+  // Unknown error - return generic error
+  return {
+    id: `err_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
+    category: 'system',
+    severity: 'medium',
+    title: 'An Error Occurred',
+    message: error instanceof Error ? error.message : 'An unexpected error occurred.',
+    // Only include name and message, not stack trace (security)
+    technicalDetails: error instanceof Error
+      ? `${error.name}: ${error.message}`
+      : String(error),
+    recoverable: true,
+    recoverySteps: [
+      { description: 'Try the operation again' },
+      { description: 'Refresh the page if the problem persists' },
+      { description: 'Contact support with the error details' },
+    ],
+    timestamp: new Date(),
+    // Only preserve original error in development mode
+    originalError: import.meta.env.DEV ? error : undefined,
+  };
+}
+ 
+// === Error Category Icons and Colors ===
+ 
+export interface ErrorCategoryStyle {
+  icon: string;
+  color: string;
+  bgColor: string;
+  borderColor: string;
+}
+ 
+export const ERROR_CATEGORY_STYLES: Record<ErrorCategory, ErrorCategoryStyle> = {
+  network: {
+    icon: 'Wifi',
+    color: 'text-orange-600 dark:text-orange-400',
+    bgColor: 'bg-orange-50 dark:bg-orange-900/20',
+    borderColor: 'border-orange-200 dark:border-orange-800',
+  },
+  auth: {
+    icon: 'Key',
+    color: 'text-red-600 dark:text-red-400',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    borderColor: 'border-red-200 dark:border-red-800',
+  },
+  permission: {
+    icon: 'Shield',
+    color: 'text-purple-600 dark:text-purple-400',
+    bgColor: 'bg-purple-50 dark:bg-purple-900/20',
+    borderColor: 'border-purple-200 dark:border-purple-800',
+  },
+  validation: {
+    icon: 'AlertCircle',
+    color: 'text-yellow-600 dark:text-yellow-400',
+    bgColor: 'bg-yellow-50 dark:bg-yellow-900/20',
+    borderColor: 'border-yellow-200 dark:border-yellow-800',
+  },
+  timeout: {
+    icon: 'Clock',
+    color: 'text-amber-600 dark:text-amber-400',
+    bgColor: 'bg-amber-50 dark:bg-amber-900/20',
+    borderColor: 'border-amber-200 dark:border-amber-800',
+  },
+  server: {
+    icon: 'Server',
+    color: 'text-red-600 dark:text-red-400',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    borderColor: 'border-red-200 dark:border-red-800',
+  },
+  client: {
+    icon: 'User',
+    color: 'text-blue-600 dark:text-blue-400',
+    bgColor: 'bg-blue-50 dark:bg-blue-900/20',
+    borderColor: 'border-blue-200 dark:border-blue-800',
+  },
+  config: {
+    icon: 'Settings',
+    color: 'text-gray-600 dark:text-gray-400',
+    bgColor: 'bg-gray-50 dark:bg-gray-900/20',
+    borderColor: 'border-gray-200 dark:border-gray-800',
+  },
+  system: {
+    icon: 'AlertTriangle',
+    color: 'text-red-600 dark:text-red-400',
+    bgColor: 'bg-red-50 dark:bg-red-900/20',
+    borderColor: 'border-red-200 dark:border-red-800',
+  },
+};
+ 
+// === Error Severity Styles ===
+ 
+export const ERROR_SEVERITY_STYLES: Record<ErrorSeverity, { badge: string; priority: number }> = {
+  low: {
+    badge: 'bg-gray-100 text-gray-600 dark:bg-gray-800 dark:text-gray-400',
+    priority: 1,
+  },
+  medium: {
+    badge: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',
+    priority: 2,
+  },
+  high: {
+    badge: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400',
+    priority: 3,
+  },
+  critical: {
+    badge: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
+    priority: 4,
+  },
+};
+ 
+// === Helper Functions ===
+ 
+/**
+ * Format an error for display in a toast notification.
+ */
+export function formatErrorForToast(error: AppError): { title: string; message: string } {
+  return {
+    title: error.title,
+    message: error.message.length > 100
+      ? `${error.message.slice(0, 100)}...`
+      : error.message,
+  };
+}
+ 
+/**
+ * Check if an error is recoverable and suggest primary action.
+ */
+export function getPrimaryRecoveryAction(error: AppError): RecoveryStep | undefined {
+  if (!error.recoverable || error.recoverySteps.length === 0) {
+    return undefined;
+  }
+  return error.recoverySteps[0];
+}
+ 
+/**
+ * Create a copy of the error details for clipboard.
+ */
+export function formatErrorForClipboard(error: AppError): string {
+  const lines = [
+    `Error ID: ${error.id}`,
+    `Category: ${error.category}`,
+    `Severity: ${error.severity}`,
+    `Time: ${error.timestamp.toISOString()}`,
+    '',
+    `Title: ${error.title}`,
+    `Message: ${error.message}`,
+  ];
+ 
+  if (error.technicalDetails) {
+    lines.push('', 'Technical Details:', error.technicalDetails);
+  }
+ 
+  if (error.recoverySteps.length > 0) {
+    lines.push('', 'Recovery Steps:');
+    error.recoverySteps.forEach((step, i) => {
+      lines.push(`${i + 1}. ${step.description}`);
+    });
+  }
+ 
+  return lines.join('\n');
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/error-utils.ts.html b/desktop/coverage/src/lib/error-utils.ts.html new file mode 100644 index 0000000..e195304 --- /dev/null +++ b/desktop/coverage/src/lib/error-utils.ts.html @@ -0,0 +1,331 @@ + + + + + + Code coverage report for src/lib/error-utils.ts + + + + + + + + + +
+
+

All files / src/lib error-utils.ts

+
+ +
+ 0% + Statements + 0/38 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * 错误处理工具函数
+ * 提供统一的错误消息提取和静默错误处理
+ */
+ 
+/**
+ * 从未知错误中提取错误消息
+ * @param err - 捕获的错误
+ * @returns 格式化的错误消息字符串
+ */
+export function getErrorMessage(err: unknown): string {
+  if (err instanceof Error) return err.message;
+  if (typeof err === 'string') return err;
+  if (err && typeof err === 'object' && 'message' in err) {
+    return String((err as { message: unknown }).message);
+  }
+  return 'Unknown error';
+}
+ 
+/**
+ * 类型守卫:检查是否为 Error 实例
+ */
+export function isError(err: unknown): err is Error {
+  return err instanceof Error;
+}
+ 
+/**
+ * 获取错误的堆栈跟踪(仅开发环境)
+ */
+export function getErrorStack(err: unknown): string | undefined {
+  if (import.meta.env.DEV && err instanceof Error) {
+    return err.stack;
+  }
+  return undefined;
+}
+ 
+/**
+ * 创建静默错误处理器
+ * 用于 UI 事件处理器中预期的、不需要用户通知的错误
+ * 在开发环境中会记录警告,生产环境中静默处理
+ *
+ * @param context - 上下文名称,用于日志标识
+ * @returns 错误处理函数
+ *
+ * @example
+ * // 在事件处理器中使用
+ * onClick={() => { handleSubmit().catch(silentErrorHandler('FeedbackModal')); }}
+ */
+export function silentErrorHandler(context: string): (err: unknown) => void {
+  return (err: unknown) => {
+    if (import.meta.env.DEV) {
+      console.warn(`[${context}] Operation failed silently:`, getErrorMessage(err));
+    }
+  };
+}
+ 
+/**
+ * 安全执行异步操作,捕获错误并可选地记录
+ * 用于不阻塞主流程的副作用操作
+ *
+ * @param context - 上下文名称
+ * @param fn - 要执行的异步函数
+ * @param options - 配置选项
+ *
+ * @example
+ * // 安全执行连接操作
+ * safeAsync('App', () => connect());
+ */
+export async function safeAsync<T>(
+  context: string,
+  fn: () => Promise<T>,
+  options: { logInDev?: boolean } = { logInDev: true }
+): Promise<T | undefined> {
+  try {
+    return await fn();
+  } catch (err: unknown) {
+    if (options.logInDev !== false && import.meta.env.DEV) {
+      console.warn(`[${context}] Async operation failed:`, getErrorMessage(err));
+    }
+    return undefined;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/gateway-api.ts.html b/desktop/coverage/src/lib/gateway-api.ts.html new file mode 100644 index 0000000..94dc0d9 --- /dev/null +++ b/desktop/coverage/src/lib/gateway-api.ts.html @@ -0,0 +1,2107 @@ + + + + + + Code coverage report for src/lib/gateway-api.ts + + + + + + + + + +
+
+

All files / src/lib gateway-api.ts

+
+ +
+ 17.83% + Statements + 66/370 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 1.58% + Functions + 1/63 +
+ + +
+ 17.83% + Lines + 66/370 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +6751x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +1x + 
/**
+ * gateway-api.ts - Gateway REST API Methods
+ *
+ * Extracted from gateway-client.ts for modularity.
+ * Contains all REST API method implementations grouped by domain:
+ *   - Health / Status
+ *   - Agents (Clones)
+ *   - Stats & Workspace
+ *   - Config (Quick Config, Channels, Skills, Scheduler, Models)
+ *   - Hands (OpenFang)
+ *   - Workflows (OpenFang)
+ *   - Sessions (OpenFang)
+ *   - Triggers (OpenFang)
+ *   - Audit (OpenFang)
+ *   - Security (OpenFang)
+ *   - Approvals (OpenFang)
+ *
+ * These methods are installed onto GatewayClient.prototype via installApiMethods().
+ * The GatewayClient core class exposes restGet/restPost/restPut/restDelete/restPatch
+ * as public methods for this purpose.
+ */
+ 
+import type { GatewayClient } from './gateway-client';
+import type { GatewayConfigSnapshot, GatewayModelChoice } from './gateway-config';
+import { tomlUtils } from './toml-utils';
+import {
+  getQuickConfigFallback,
+  getWorkspaceInfoFallback,
+  getUsageStatsFallback,
+  getPluginStatusFallback,
+  getScheduledTasksFallback,
+  getSecurityStatusFallback,
+  isNotFoundError,
+} from './api-fallbacks';
+ 
+// === Install all API methods onto GatewayClient prototype ===
+ 
+export function installApiMethods(ClientClass: { prototype: GatewayClient }): void {
+  const proto = ClientClass.prototype as any;
+ 
+  // ─── Health / Status ───
+ 
+  proto.health = async function (this: GatewayClient): Promise<any> {
+    return this.request('health');
+  };
+ 
+  proto.status = async function (this: GatewayClient): Promise<any> {
+    return this.request('status');
+  };
+ 
+  // ─── Agents (Clones) ───
+ 
+  proto.listClones = async function (this: GatewayClient): Promise<any> {
+    return this.restGet('/api/agents');
+  };
+ 
+  proto.createClone = async function (this: GatewayClient, opts: {
+    name: string;
+    role?: string;
+    nickname?: string;
+    scenarios?: string[];
+    model?: string;
+    workspaceDir?: string;
+    restrictFiles?: boolean;
+    privacyOptIn?: boolean;
+    userName?: string;
+    userRole?: string;
+    emoji?: string;
+    personality?: string;
+    communicationStyle?: string;
+    notes?: string;
+  }): Promise<any> {
+    // Build manifest config object, then serialize via tomlUtils
+    const manifest: Record<string, unknown> = {
+      name: opts.nickname || opts.name,
+      model_provider: 'bailian',
+      model_name: opts.model || 'qwen3.5-plus',
+    };
+ 
+    // Identity section
+    const identity: Record<string, string> = {};
+    if (opts.emoji) identity.emoji = opts.emoji;
+    if (opts.personality) identity.personality = opts.personality;
+    if (opts.communicationStyle) identity.communication_style = opts.communicationStyle;
+    if (Object.keys(identity).length > 0) manifest.identity = identity;
+ 
+    // Scenarios
+    if (opts.scenarios && opts.scenarios.length > 0) {
+      manifest.scenarios = opts.scenarios;
+    }
+ 
+    // User context
+    const userContext: Record<string, string> = {};
+    if (opts.userName) userContext.name = opts.userName;
+    if (opts.userRole) userContext.role = opts.userRole;
+    if (Object.keys(userContext).length > 0) manifest.user_context = userContext;
+ 
+    const manifestToml = tomlUtils.stringify(manifest);
+ 
+    return this.restPost('/api/agents', {
+      manifest_toml: manifestToml,
+    });
+  };
+ 
+  proto.updateClone = async function (this: GatewayClient, id: string, updates: Record<string, any>): Promise<any> {
+    return this.restPut(`/api/agents/${id}`, updates);
+  };
+ 
+  proto.deleteClone = async function (this: GatewayClient, id: string): Promise<any> {
+    return this.restDelete(`/api/agents/${id}`);
+  };
+ 
+  // ─── Stats & Workspace ───
+ 
+  proto.getUsageStats = async function (this: GatewayClient): Promise<any> {
+    try {
+      return await this.restGet('/api/stats/usage');
+    } catch (error) {
+      if (isNotFoundError(error)) {
+        return getUsageStatsFallback([]);
+      }
+      return {
+        totalMessages: 0,
+        totalTokens: 0,
+        sessionsCount: 0,
+        agentsCount: 0,
+      };
+    }
+  };
+ 
+  proto.getSessionStats = async function (this: GatewayClient): Promise<any> {
+    try {
+      return await this.restGet('/api/stats/sessions');
+    } catch {
+      return { sessions: [] };
+    }
+  };
+ 
+  proto.getWorkspaceInfo = async function (this: GatewayClient): Promise<any> {
+    try {
+      return await this.restGet('/api/workspace');
+    } catch (error) {
+      if (isNotFoundError(error)) {
+        return getWorkspaceInfoFallback();
+      }
+      return {
+        rootDir: typeof process !== 'undefined' ? (process.env.HOME || process.env.USERPROFILE || '~') : '~',
+        skillsDir: null,
+        handsDir: null,
+        configDir: null,
+      };
+    }
+  };
+ 
+  proto.getPluginStatus = async function (this: GatewayClient): Promise<any> {
+    try {
+      return await this.restGet('/api/plugins/status');
+    } catch (error) {
+      if (isNotFoundError(error)) {
+        const plugins = getPluginStatusFallback([]);
+        return { plugins, loaded: plugins.length, total: plugins.length };
+      }
+      return { plugins: [], loaded: 0, total: 0 };
+    }
+  };
+ 
+  // ─── Quick Config ───
+ 
+  proto.getQuickConfig = async function (this: GatewayClient): Promise<any> {
+    try {
+      const config = await this.restGet<{
+        data_dir?: string;
+        home_dir?: string;
+        default_model?: { model?: string; provider?: string };
+      }>('/api/config');
+ 
+      // 从 localStorage 读取前端特定配置
+      const storedTheme = localStorage.getItem('zclaw-theme') as 'light' | 'dark' | null;
+      const storedAutoStart = localStorage.getItem('zclaw-autoStart');
+      const storedShowToolCalls = localStorage.getItem('zclaw-showToolCalls');
+ 
+      // Map OpenFang config to frontend expected format
+      return {
+        quickConfig: {
+          agentName: 'ZCLAW',
+          agentRole: 'AI 助手',
+          userName: '用户',
+          userRole: '用户',
+          agentNickname: 'ZCLAW',
+          scenarios: ['通用对话', '代码助手', '文档编写'],
+          workspaceDir: config.data_dir || config.home_dir,
+          gatewayUrl: this.getRestBaseUrl(),
+          defaultModel: config.default_model?.model,
+          defaultProvider: config.default_model?.provider,
+          theme: storedTheme || 'light',
+          autoStart: storedAutoStart === 'true',
+          showToolCalls: storedShowToolCalls !== 'false',
+          autoSaveContext: true,
+          fileWatching: true,
+          privacyOptIn: false,
+        }
+      };
+    } catch (error) {
+      if (isNotFoundError(error)) {
+        return { quickConfig: getQuickConfigFallback() };
+      }
+      return {};
+    }
+  };
+ 
+  proto.saveQuickConfig = async function (this: GatewayClient, config: Record<string, any>): Promise<any> {
+    // 保存前端特定配置到 localStorage
+    if (config.theme !== undefined) {
+      localStorage.setItem('zclaw-theme', config.theme);
+    }
+    if (config.autoStart !== undefined) {
+      localStorage.setItem('zclaw-autoStart', String(config.autoStart));
+    }
+    if (config.showToolCalls !== undefined) {
+      localStorage.setItem('zclaw-showToolCalls', String(config.showToolCalls));
+    }
+ 
+    // Map frontend config back to OpenFang format
+    const openfangConfig = {
+      data_dir: config.workspaceDir,
+      default_model: config.defaultModel ? {
+        model: config.defaultModel,
+        provider: config.defaultProvider || 'bailian',
+      } : undefined,
+    };
+    return this.restPut('/api/config', openfangConfig);
+  };
+ 
+  // ─── Skills ───
+ 
+  proto.listSkills = async function (this: GatewayClient): Promise<any> {
+    return this.restGet('/api/skills');
+  };
+ 
+  proto.getSkill = async function (this: GatewayClient, id: string): Promise<any> {
+    return this.restGet(`/api/skills/${id}`);
+  };
+ 
+  proto.createSkill = async function (this: GatewayClient, skill: {
+    name: string;
+    description?: string;
+    triggers: Array<{ type: string; pattern?: string }>;
+    actions: Array<{ type: string; params?: Record<string, unknown> }>;
+    enabled?: boolean;
+  }): Promise<any> {
+    return this.restPost('/api/skills', skill);
+  };
+ 
+  proto.updateSkill = async function (this: GatewayClient, id: string, updates: {
+    name?: string;
+    description?: string;
+    triggers?: Array<{ type: string; pattern?: string }>;
+    actions?: Array<{ type: string; params?: Record<string, unknown> }>;
+    enabled?: boolean;
+  }): Promise<any> {
+    return this.restPut(`/api/skills/${id}`, updates);
+  };
+ 
+  proto.deleteSkill = async function (this: GatewayClient, id: string): Promise<any> {
+    return this.restDelete(`/api/skills/${id}`);
+  };
+ 
+  // ─── Channels ───
+ 
+  proto.listChannels = async function (this: GatewayClient): Promise<any> {
+    return this.restGet('/api/channels');
+  };
+ 
+  proto.getChannel = async function (this: GatewayClient, id: string): Promise<any> {
+    return this.restGet(`/api/channels/${id}`);
+  };
+ 
+  proto.createChannel = async function (this: GatewayClient, channel: {
+    type: string;
+    name: string;
+    config: Record<string, unknown>;
+    enabled?: boolean;
+  }): Promise<any> {
+    return this.restPost('/api/channels', channel);
+  };
+ 
+  proto.updateChannel = async function (this: GatewayClient, id: string, updates: {
+    name?: string;
+    config?: Record<string, unknown>;
+    enabled?: boolean;
+  }): Promise<any> {
+    return this.restPut(`/api/channels/${id}`, updates);
+  };
+ 
+  proto.deleteChannel = async function (this: GatewayClient, id: string): Promise<any> {
+    return this.restDelete(`/api/channels/${id}`);
+  };
+ 
+  proto.getFeishuStatus = async function (this: GatewayClient): Promise<any> {
+    return this.restGet('/api/channels/feishu/status');
+  };
+ 
+  // ─── Scheduler ───
+ 
+  proto.listScheduledTasks = async function (this: GatewayClient): Promise<any> {
+    try {
+      return await this.restGet('/api/scheduler/tasks');
+    } catch (error) {
+      if (isNotFoundError(error)) {
+        const tasks = getScheduledTasksFallback([]);
+        return { tasks, total: tasks.length };
+      }
+      return { tasks: [], total: 0 };
+    }
+  };
+ 
+  proto.createScheduledTask = async function (this: GatewayClient, task: {
+    name: string;
+    schedule: string;
+    scheduleType: 'cron' | 'interval' | 'once';
+    target?: { type: 'agent' | 'hand' | 'workflow'; id: string };
+    description?: string;
+    enabled?: boolean;
+  }): Promise<{ id: string; name: string; schedule: string; status: string }> {
+    return this.restPost('/api/scheduler/tasks', task);
+  };
+ 
+  proto.deleteScheduledTask = async function (this: GatewayClient, id: string): Promise<void> {
+    return this.restDelete(`/api/scheduler/tasks/${id}`);
+  };
+ 
+  proto.toggleScheduledTask = async function (this: GatewayClient, id: string, enabled: boolean): Promise<{ id: string; enabled: boolean }> {
+    return this.restPatch(`/api/scheduler/tasks/${id}`, { enabled });
+  };
+ 
+  // ─── OpenFang Hands API ───
+ 
+  proto.listHands = async function (this: GatewayClient): Promise<{
+    hands: {
+      id?: string;
+      name: string;
+      description?: string;
+      status?: string;
+      requirements_met?: boolean;
+      category?: string;
+      icon?: string;
+      tool_count?: number;
+      tools?: string[];
+      metric_count?: number;
+      metrics?: string[];
+    }[]
+  }> {
+    return this.restGet('/api/hands');
+  };
+ 
+  proto.getHand = async function (this: GatewayClient, name: string): Promise<{
+    id?: string;
+    name?: string;
+    description?: string;
+    status?: string;
+    requirements_met?: boolean;
+    category?: string;
+    icon?: string;
+    provider?: string;
+    model?: string;
+    requirements?: { description?: string; name?: string; met?: boolean; satisfied?: boolean; details?: string; hint?: string }[];
+    tools?: string[];
+    metrics?: string[];
+    config?: Record<string, unknown>;
+    tool_count?: number;
+    metric_count?: number;
+  }> {
+    return this.restGet(`/api/hands/${name}`);
+  };
+ 
+  proto.triggerHand = async function (this: GatewayClient, name: string, params?: Record<string, unknown>): Promise<{ runId: string; status: string }> {
+    console.log(`[GatewayClient] Triggering hand: ${name}`, params);
+    try {
+      const result = await this.restPost<{
+        instance_id: string;
+        status: string;
+      }>(`/api/hands/${name}/activate`, params || {});
+      console.log(`[GatewayClient] Hand trigger response:`, result);
+      return { runId: result.instance_id, status: result.status };
+    } catch (err) {
+      console.error(`[GatewayClient] Hand trigger failed for ${name}:`, err);
+      throw err;
+    }
+  };
+ 
+  proto.getHandStatus = async function (this: GatewayClient, name: string, runId: string): Promise<{ status: string; result?: unknown }> {
+    return this.restGet(`/api/hands/${name}/runs/${runId}`);
+  };
+ 
+  proto.approveHand = async function (this: GatewayClient, name: string, runId: string, approved: boolean, reason?: string): Promise<{ status: string }> {
+    return this.restPost(`/api/hands/${name}/runs/${runId}/approve`, { approved, reason });
+  };
+ 
+  proto.cancelHand = async function (this: GatewayClient, name: string, runId: string): Promise<{ status: string }> {
+    return this.restPost(`/api/hands/${name}/runs/${runId}/cancel`, {});
+  };
+ 
+  proto.listHandRuns = async function (this: GatewayClient, name: string, opts?: { limit?: number; offset?: number }): Promise<{ runs: { runId: string; status: string; startedAt: string }[] }> {
+    const params = new URLSearchParams();
+    if (opts?.limit) params.set('limit', String(opts.limit));
+    if (opts?.offset) params.set('offset', String(opts.offset));
+    return this.restGet(`/api/hands/${name}/runs?${params}`);
+  };
+ 
+  // ─── OpenFang Workflows API ───
+ 
+  proto.listWorkflows = async function (this: GatewayClient): Promise<{ workflows: { id: string; name: string; steps: number }[] }> {
+    return this.restGet('/api/workflows');
+  };
+ 
+  proto.getWorkflow = async function (this: GatewayClient, id: string): Promise<{ id: string; name: string; steps: unknown[] }> {
+    return this.restGet(`/api/workflows/${id}`);
+  };
+ 
+  proto.executeWorkflow = async function (this: GatewayClient, id: string, input?: Record<string, unknown>): Promise<{ runId: string; status: string }> {
+    return this.restPost(`/api/workflows/${id}/execute`, input);
+  };
+ 
+  proto.getWorkflowRun = async function (this: GatewayClient, workflowId: string, runId: string): Promise<{ status: string; step: string; result?: unknown }> {
+    return this.restGet(`/api/workflows/${workflowId}/runs/${runId}`);
+  };
+ 
+  proto.listWorkflowRuns = async function (this: GatewayClient, workflowId: string, opts?: { limit?: number; offset?: number }): Promise<{
+    runs: Array<{
+      runId: string;
+      status: string;
+      startedAt: string;
+      completedAt?: string;
+      step?: string;
+      result?: unknown;
+      error?: string;
+    }>;
+  }> {
+    const params = new URLSearchParams();
+    if (opts?.limit) params.set('limit', String(opts.limit));
+    if (opts?.offset) params.set('offset', String(opts.offset));
+    return this.restGet(`/api/workflows/${workflowId}/runs?${params}`);
+  };
+ 
+  proto.cancelWorkflow = async function (this: GatewayClient, workflowId: string, runId: string): Promise<{ status: string }> {
+    return this.restPost(`/api/workflows/${workflowId}/runs/${runId}/cancel`, {});
+  };
+ 
+  proto.createWorkflow = async function (this: GatewayClient, workflow: {
+    name: string;
+    description?: string;
+    steps: Array<{
+      handName: string;
+      name?: string;
+      params?: Record<string, unknown>;
+      condition?: string;
+    }>;
+  }): Promise<{ id: string; name: string }> {
+    return this.restPost('/api/workflows', workflow);
+  };
+ 
+  proto.updateWorkflow = async function (this: GatewayClient, id: string, updates: {
+    name?: string;
+    description?: string;
+    steps?: Array<{
+      handName: string;
+      name?: string;
+      params?: Record<string, unknown>;
+      condition?: string;
+    }>;
+  }): Promise<{ id: string; name: string }> {
+    return this.restPut(`/api/workflows/${id}`, updates);
+  };
+ 
+  proto.deleteWorkflow = async function (this: GatewayClient, id: string): Promise<{ status: string }> {
+    return this.restDelete(`/api/workflows/${id}`);
+  };
+ 
+  // ─── OpenFang Session API ───
+ 
+  proto.listSessions = async function (this: GatewayClient, opts?: { limit?: number; offset?: number }): Promise<{
+    sessions: Array<{
+      id: string;
+      agent_id: string;
+      created_at: string;
+      updated_at?: string;
+      message_count?: number;
+      status?: 'active' | 'archived' | 'expired';
+    }>;
+  }> {
+    const params = new URLSearchParams();
+    if (opts?.limit) params.set('limit', String(opts.limit));
+    if (opts?.offset) params.set('offset', String(opts.offset));
+    return this.restGet(`/api/sessions?${params}`);
+  };
+ 
+  proto.getSession = async function (this: GatewayClient, sessionId: string): Promise<{
+    id: string;
+    agent_id: string;
+    created_at: string;
+    updated_at?: string;
+    message_count?: number;
+    status?: 'active' | 'archived' | 'expired';
+    metadata?: Record<string, unknown>;
+  }> {
+    return this.restGet(`/api/sessions/${sessionId}`);
+  };
+ 
+  proto.createSession = async function (this: GatewayClient, opts: {
+    agent_id: string;
+    metadata?: Record<string, unknown>;
+  }): Promise<{
+    id: string;
+    agent_id: string;
+    created_at: string;
+  }> {
+    return this.restPost('/api/sessions', opts);
+  };
+ 
+  proto.deleteSession = async function (this: GatewayClient, sessionId: string): Promise<{ status: string }> {
+    return this.restDelete(`/api/sessions/${sessionId}`);
+  };
+ 
+  proto.getSessionMessages = async function (this: GatewayClient, sessionId: string, opts?: {
+    limit?: number;
+    offset?: number;
+  }): Promise<{
+    messages: Array<{
+      id: string;
+      role: 'user' | 'assistant' | 'system';
+      content: string;
+      created_at: string;
+      tokens?: { input?: number; output?: number };
+    }>;
+  }> {
+    const params = new URLSearchParams();
+    if (opts?.limit) params.set('limit', String(opts.limit));
+    if (opts?.offset) params.set('offset', String(opts.offset));
+    return this.restGet(`/api/sessions/${sessionId}/messages?${params}`);
+  };
+ 
+  // ─── OpenFang Triggers API ───
+ 
+  proto.listTriggers = async function (this: GatewayClient): Promise<{ triggers: { id: string; type: string; enabled: boolean }[] }> {
+    return this.restGet('/api/triggers');
+  };
+ 
+  proto.getTrigger = async function (this: GatewayClient, id: string): Promise<{
+    id: string;
+    type: string;
+    name?: string;
+    enabled: boolean;
+    config?: Record<string, unknown>;
+  }> {
+    return this.restGet(`/api/triggers/${id}`);
+  };
+ 
+  proto.createTrigger = async function (this: GatewayClient, trigger: {
+    type: string;
+    name?: string;
+    enabled?: boolean;
+    config?: Record<string, unknown>;
+    handName?: string;
+    workflowId?: string;
+  }): Promise<{ id: string }> {
+    return this.restPost('/api/triggers', trigger);
+  };
+ 
+  proto.updateTrigger = async function (this: GatewayClient, id: string, updates: {
+    name?: string;
+    enabled?: boolean;
+    config?: Record<string, unknown>;
+    handName?: string;
+    workflowId?: string;
+  }): Promise<{ id: string }> {
+    return this.restPut(`/api/triggers/${id}`, updates);
+  };
+ 
+  proto.deleteTrigger = async function (this: GatewayClient, id: string): Promise<{ status: string }> {
+    return this.restDelete(`/api/triggers/${id}`);
+  };
+ 
+  // ─── OpenFang Audit API ───
+ 
+  proto.getAuditLogs = async function (this: GatewayClient, opts?: { limit?: number; offset?: number }): Promise<{ logs: unknown[] }> {
+    const params = new URLSearchParams();
+    if (opts?.limit) params.set('limit', String(opts.limit));
+    if (opts?.offset) params.set('offset', String(opts.offset));
+    return this.restGet(`/api/audit/logs?${params}`);
+  };
+ 
+  proto.verifyAuditLogChain = async function (this: GatewayClient, logId: string): Promise<{
+    valid: boolean;
+    chain_depth?: number;
+    root_hash?: string;
+    broken_at_index?: number;
+  }> {
+    return this.restGet(`/api/audit/verify/${logId}`);
+  };
+ 
+  // ─── OpenFang Security API ───
+ 
+  proto.getSecurityStatus = async function (this: GatewayClient): Promise<{ layers: { name: string; enabled: boolean }[] }> {
+    try {
+      return await this.restGet('/api/security/status');
+    } catch (error) {
+      if (isNotFoundError(error)) {
+        const status = getSecurityStatusFallback();
+        return { layers: status.layers };
+      }
+      return {
+        layers: [
+          { name: 'device_auth', enabled: true },
+          { name: 'rbac', enabled: true },
+          { name: 'audit_log', enabled: true },
+        ],
+      };
+    }
+  };
+ 
+  proto.getCapabilities = async function (this: GatewayClient): Promise<{ capabilities: string[] }> {
+    try {
+      return await this.restGet('/api/capabilities');
+    } catch {
+      return { capabilities: ['chat', 'agents', 'hands', 'workflows'] };
+    }
+  };
+ 
+  // ─── OpenFang Approvals API ───
+ 
+  proto.listApprovals = async function (this: GatewayClient, status?: string): Promise<{
+    approvals: {
+      id: string;
+      hand_name: string;
+      run_id: string;
+      status: string;
+      requested_at: string;
+      requested_by?: string;
+      reason?: string;
+      action?: string;
+      params?: Record<string, unknown>;
+      responded_at?: string;
+      responded_by?: string;
+      response_reason?: string;
+    }[];
+  }> {
+    const params = status ? `?status=${status}` : '';
+    return this.restGet(`/api/approvals${params}`);
+  };
+ 
+  proto.respondToApproval = async function (this: GatewayClient, approvalId: string, approved: boolean, reason?: string): Promise<{ status: string }> {
+    return this.restPost(`/api/approvals/${approvalId}/respond`, { approved, reason });
+  };
+ 
+  // ─── Models & Config ───
+ 
+  proto.listModels = async function (this: GatewayClient): Promise<{ models: GatewayModelChoice[] }> {
+    return this.restGet('/api/models');
+  };
+ 
+  proto.getConfig = async function (this: GatewayClient): Promise<GatewayConfigSnapshot | Record<string, any>> {
+    return this.restGet('/api/config');
+  };
+ 
+  proto.applyConfig = async function (this: GatewayClient, raw: string, baseHash?: string, opts?: { sessionKey?: string; note?: string; restartDelayMs?: number }): Promise<any> {
+    return this.request('config.apply', {
+      raw,
+      baseHash,
+      sessionKey: opts?.sessionKey,
+      note: opts?.note,
+      restartDelayMs: opts?.restartDelayMs,
+    });
+  };
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/gateway-auth.ts.html b/desktop/coverage/src/lib/gateway-auth.ts.html new file mode 100644 index 0000000..b671889 --- /dev/null +++ b/desktop/coverage/src/lib/gateway-auth.ts.html @@ -0,0 +1,610 @@ + + + + + + Code coverage report for src/lib/gateway-auth.ts + + + + + + + + + +
+
+

All files / src/lib gateway-auth.ts

+
+ +
+ 4.25% + Statements + 4/94 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 4.25% + Lines + 4/94 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +1761x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * gateway-auth.ts - Device Authentication Module
+ *
+ * Extracted from gateway-client.ts for modularity.
+ * Handles Ed25519 device key generation, loading, signing,
+ * and device identity management using OS keyring or localStorage.
+ */
+ 
+import nacl from 'tweetnacl';
+import {
+  storeDeviceKeys,
+  getDeviceKeys,
+  deleteDeviceKeys,
+} from './secure-storage';
+ 
+// === Types ===
+ 
+export interface DeviceKeys {
+  deviceId: string;
+  publicKey: Uint8Array;
+  secretKey: Uint8Array;
+  publicKeyBase64: string;
+}
+ 
+export interface LocalDeviceIdentity {
+  deviceId: string;
+  publicKeyBase64: string;
+}
+ 
+// === Base64 Encoding ===
+ 
+export function b64Encode(bytes: Uint8Array): string {
+  let binary = '';
+  for (let i = 0; i < bytes.length; i++) {
+    binary += String.fromCharCode(bytes[i]);
+  }
+  return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
+}
+ 
+// === Key Derivation ===
+ 
+async function deriveDeviceId(publicKey: Uint8Array): Promise<string> {
+  const stableBytes = Uint8Array.from(publicKey);
+  const digest = await crypto.subtle.digest('SHA-256', stableBytes.buffer);
+  return Array.from(new Uint8Array(digest))
+    .map((byte) => byte.toString(16).padStart(2, '0'))
+    .join('');
+}
+ 
+// === Key Generation ===
+ 
+async function generateDeviceKeys(): Promise<DeviceKeys> {
+  const keyPair = nacl.sign.keyPair();
+  const deviceId = await deriveDeviceId(keyPair.publicKey);
+ 
+  return {
+    deviceId,
+    publicKey: keyPair.publicKey,
+    secretKey: keyPair.secretKey,
+    publicKeyBase64: b64Encode(keyPair.publicKey),
+  };
+}
+ 
+// === Key Loading ===
+ 
+/**
+ * Load device keys from secure storage.
+ * Uses OS keyring when available, falls back to localStorage.
+ */
+export async function loadDeviceKeys(): Promise<DeviceKeys> {
+  // Try to load from secure storage (keyring or localStorage fallback)
+  const storedKeys = await getDeviceKeys();
+  if (storedKeys) {
+    try {
+      const deviceId = await deriveDeviceId(storedKeys.publicKey);
+ 
+      return {
+        deviceId,
+        publicKey: storedKeys.publicKey,
+        secretKey: storedKeys.secretKey,
+        publicKeyBase64: b64Encode(storedKeys.publicKey),
+      };
+    } catch (e) {
+      console.warn('[GatewayClient] Failed to load stored keys:', e);
+      // Invalid stored keys, clear and regenerate
+      await deleteDeviceKeys();
+    }
+  }
+ 
+  // Generate new keys
+  const keys = await generateDeviceKeys();
+ 
+  // Store in secure storage (keyring when available, localStorage fallback)
+  await storeDeviceKeys(keys.publicKey, keys.secretKey);
+ 
+  return keys;
+}
+ 
+// === Public Identity ===
+ 
+export async function getLocalDeviceIdentity(): Promise<LocalDeviceIdentity> {
+  const keys = await loadDeviceKeys();
+  return {
+    deviceId: keys.deviceId,
+    publicKeyBase64: keys.publicKeyBase64,
+  };
+}
+ 
+/**
+ * Clear cached device keys to force regeneration on next connect.
+ * Useful when device signature validation fails repeatedly.
+ */
+export async function clearDeviceKeys(): Promise<void> {
+  try {
+    await deleteDeviceKeys();
+    console.log('[GatewayClient] Device keys cleared');
+  } catch (e) {
+    console.warn('[GatewayClient] Failed to clear device keys:', e);
+  }
+}
+ 
+// === Device Auth Signing ===
+ 
+export function buildDeviceAuthPayload(params: {
+  clientId: string;
+  clientMode: string;
+  deviceId: string;
+  nonce: string;
+  role: string;
+  scopes: string[];
+  signedAt: number;
+  token?: string;
+}): string {
+  return [
+    'v2',
+    params.deviceId,
+    params.clientId,
+    params.clientMode,
+    params.role,
+    params.scopes.join(','),
+    String(params.signedAt),
+    params.token || '',
+    params.nonce,
+  ].join('|');
+}
+ 
+export function signDeviceAuth(params: {
+  clientId: string;
+  clientMode: string;
+  deviceId: string;
+  nonce: string;
+  role: string;
+  scopes: string[];
+  secretKey: Uint8Array;
+  token?: string;
+}): { signature: string; signedAt: number } {
+  const signedAt = Date.now();
+  const message = buildDeviceAuthPayload({
+    clientId: params.clientId,
+    clientMode: params.clientMode,
+    deviceId: params.deviceId,
+    nonce: params.nonce,
+    role: params.role,
+    scopes: params.scopes,
+    signedAt,
+    token: params.token,
+  });
+  const messageBytes = new TextEncoder().encode(message);
+  const signature = nacl.sign.detached(messageBytes, params.secretKey);
+ 
+  return {
+    signature: b64Encode(signature),
+    signedAt,
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/gateway-client.ts.html b/desktop/coverage/src/lib/gateway-client.ts.html new file mode 100644 index 0000000..722343c --- /dev/null +++ b/desktop/coverage/src/lib/gateway-client.ts.html @@ -0,0 +1,3751 @@ + + + + + + Code coverage report for src/lib/gateway-client.ts + + + + + + + + + +
+
+

All files / src/lib gateway-client.ts

+
+ +
+ 9.84% + Statements + 78/792 +
+ + +
+ 55.55% + Branches + 5/9 +
+ + +
+ 5.88% + Functions + 3/51 +
+ + +
+ 9.84% + Lines + 78/792 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +12231x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +5x +5x +5x +1x +  +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +1x +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +9x +3x +3x +3x +3x +3x +9x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +1x +  +  +1x +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ZCLAW Gateway Client (Browser/Tauri side)
+ *
+ * Core WebSocket client for OpenFang Kernel protocol.
+ * Handles connection management, WebSocket framing, heartbeat,
+ * event dispatch, and chat/stream operations.
+ *
+ * Module structure:
+ * - gateway-types.ts:   Protocol types, stream types, ConnectionState
+ * - gateway-auth.ts:    Device authentication (Ed25519)
+ * - gateway-storage.ts: URL/token persistence, normalization
+ * - gateway-api.ts:     REST API method implementations (installed via mixin)
+ * - gateway-client.ts:  Core client class (this file)
+ */
+ 
+// === Re-exports for backward compatibility ===
+export type {
+  GatewayRequest,
+  GatewayError,
+  GatewayResponse,
+  GatewayEvent,
+  GatewayPong,
+  GatewayFrame,
+  AgentStreamDelta,
+  OpenFangStreamEvent,
+  ConnectionState,
+  EventCallback,
+} from './gateway-types';
+ 
+export {
+  getLocalDeviceIdentity,
+  clearDeviceKeys,
+} from './gateway-auth';
+export type { LocalDeviceIdentity } from './gateway-auth';
+ 
+export {
+  DEFAULT_GATEWAY_URL,
+  REST_API_URL,
+  FALLBACK_GATEWAY_URLS,
+  normalizeGatewayUrl,
+  isLocalhost,
+  getStoredGatewayUrl,
+  setStoredGatewayUrl,
+  getStoredGatewayToken,
+  setStoredGatewayToken,
+} from './gateway-storage';
+ 
+// === Internal imports ===
+import type {
+  GatewayRequest,
+  GatewayFrame,
+  GatewayResponse,
+  GatewayEvent,
+  OpenFangStreamEvent,
+  ConnectionState,
+  EventCallback,
+  AgentStreamDelta,
+} from './gateway-types';
+ 
+import {
+  loadDeviceKeys,
+  signDeviceAuth,
+  clearDeviceKeys,
+  type DeviceKeys,
+} from './gateway-auth';
+ 
+import {
+  normalizeGatewayUrl,
+  isLocalhost,
+  getStoredGatewayUrl,
+  getStoredGatewayToken,
+} from './gateway-storage';
+ 
+import type { GatewayConfigSnapshot, GatewayModelChoice } from './gateway-config';
+import { installApiMethods } from './gateway-api';
+ 
+// === Security ===
+ 
+/**
+ * Security error for invalid WebSocket connections.
+ * Thrown when non-localhost URLs use ws:// instead of wss://.
+ */
+export class SecurityError extends Error {
+  constructor(message: string) {
+    super(message);
+    this.name = 'SecurityError';
+  }
+}
+ 
+/**
+ * Connection error for WebSocket/HTTP connection failures.
+ */
+export class ConnectionError extends Error {
+  public readonly code?: string;
+  public readonly recoverable: boolean;
+ 
+  constructor(message: string, code?: string, recoverable: boolean = true) {
+    super(message);
+    this.name = 'ConnectionError';
+    this.code = code;
+    this.recoverable = recoverable;
+  }
+}
+ 
+/**
+ * Timeout error for request/response timeouts.
+ */
+export class TimeoutError extends Error {
+  public readonly timeout: number;
+ 
+  constructor(message: string, timeout: number) {
+    super(message);
+    this.name = 'TimeoutError';
+    this.timeout = timeout;
+  }
+}
+ 
+/**
+ * Authentication error for handshake/token failures.
+ */
+export class AuthenticationError extends Error {
+  public readonly code?: string;
+ 
+  constructor(message: string, code?: string) {
+    super(message);
+    this.name = 'AuthenticationError';
+    this.code = code;
+  }
+}
+ 
+/**
+ * Validate WebSocket URL security.
+ * Ensures non-localhost connections use WSS protocol.
+ *
+ * @param url - The WebSocket URL to validate
+ * @throws SecurityError if non-localhost URL uses ws:// instead of wss://
+ */
+export function validateWebSocketSecurity(url: string): void {
+  if (!url.startsWith('wss://') && !isLocalhost(url)) {
+    throw new SecurityError(
+      'Non-localhost connections must use WSS protocol for security. ' +
+      `URL: ${url.replace(/:[^:@]+@/, ':****@')}`
+    );
+  }
+}
+ 
+function createIdempotencyKey(): string {
+  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
+    return crypto.randomUUID();
+  }
+  return `idem_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
+}
+ 
+// === Client ===
+ 
+export class GatewayClient {
+  private ws: WebSocket | null = null;
+  private openfangWs: WebSocket | null = null;  // OpenFang stream WebSocket
+  private state: ConnectionState = 'disconnected';
+  private requestId = 0;
+  private pendingRequests = new Map<string, {
+    resolve: (value: unknown) => void;
+    reject: (reason: unknown) => void;
+    timer: number;
+  }>();
+  private eventListeners = new Map<string, Set<EventCallback>>();
+  private reconnectAttempts = 0;
+  private reconnectTimer: number | null = null;
+  private deviceKeysPromise: Promise<DeviceKeys>;
+  private streamCallbacks = new Map<string, {
+    onDelta: (delta: string) => void;
+    onTool?: (tool: string, input: string, output: string) => void;
+    onHand?: (name: string, status: string, result?: unknown) => void;
+    onComplete: () => void;
+    onError: (error: string) => void;
+  }>();
+ 
+  // Options
+  private url: string;
+  private token: string;
+  private autoReconnect: boolean;
+  private reconnectInterval: number;
+  private requestTimeout: number;
+ 
+  // Heartbeat
+  private heartbeatInterval: number | null = null;
+  private heartbeatTimeout: number | null = null;
+  private missedHeartbeats: number = 0;
+  private static readonly HEARTBEAT_INTERVAL = 30000; // 30 seconds
+  private static readonly HEARTBEAT_TIMEOUT = 10000;  // 10 seconds
+  private static readonly MAX_MISSED_HEARTBEATS = 3;
+ 
+  // State change callbacks
+  onStateChange?: (state: ConnectionState) => void;
+  onLog?: (level: string, message: string) => void;
+ 
+  constructor(opts?: {
+    url?: string;
+    token?: string;
+    autoReconnect?: boolean;
+    reconnectInterval?: number;
+    requestTimeout?: number;
+  }) {
+    this.url = normalizeGatewayUrl(opts?.url || getStoredGatewayUrl());
+    this.token = opts?.token ?? getStoredGatewayToken();
+    this.autoReconnect = opts?.autoReconnect ?? true;
+    this.reconnectInterval = opts?.reconnectInterval || 3000;
+    this.requestTimeout = opts?.requestTimeout || 30000;
+    this.deviceKeysPromise = loadDeviceKeys();
+  }
+ 
+  updateOptions(opts?: {
+    url?: string;
+    token?: string;
+    autoReconnect?: boolean;
+    reconnectInterval?: number;
+    requestTimeout?: number;
+  }) {
+    if (!opts) return;
+    if (opts.url) {
+      this.url = normalizeGatewayUrl(opts.url);
+    }
+    if (opts.token !== undefined) {
+      this.token = opts.token;
+    }
+    if (opts.autoReconnect !== undefined) {
+      this.autoReconnect = opts.autoReconnect;
+    }
+    if (opts.reconnectInterval !== undefined) {
+      this.reconnectInterval = opts.reconnectInterval;
+    }
+    if (opts.requestTimeout !== undefined) {
+      this.requestTimeout = opts.requestTimeout;
+    }
+  }
+ 
+  getState(): ConnectionState {
+    return this.state;
+  }
+ 
+  // === Connection ===
+ 
+  /** Connect using REST API only (for OpenFang mode) */
+  async connectRest(): Promise<void> {
+    if (this.state === 'connected') {
+      return;
+    }
+    this.setState('connecting');
+    try {
+      // Check if OpenFang API is healthy
+      const health = await this.restGet<{ status: string; version?: string }>('/api/health');
+      if (health.status === 'ok') {
+        this.reconnectAttempts = 0;
+        this.setState('connected');
+        this.startHeartbeat(); // Start heartbeat after successful connection
+        this.log('info', `Connected to OpenFang via REST API${health.version ? ` (v${health.version})` : ''}`);
+        this.emitEvent('connected', { version: health.version });
+      } else {
+        throw new Error('Health check failed');
+      }
+    } catch (err: unknown) {
+      this.setState('disconnected');
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      throw new Error(`Failed to connect to OpenFang: ${errorMessage}`);
+    }
+  }
+ 
+  connect(): Promise<void> {
+    if (this.state === 'connected' || this.state === 'connecting' || this.state === 'handshaking') {
+      return Promise.resolve();
+    }
+ 
+    // Check if URL is for OpenFang (port 4200 or 50051) - use REST mode
+    if (this.url.includes(':4200') || this.url.includes(':50051')) {
+      return this.connectRest();
+    }
+ 
+    // Security validation: enforce WSS for non-localhost connections
+    validateWebSocketSecurity(this.url);
+ 
+    this.autoReconnect = true;
+    this.setState('connecting');
+ 
+    return new Promise((resolve, reject) => {
+      let settled = false;
+      const settleResolve = () => {
+        if (settled) return;
+        settled = true;
+        resolve();
+      };
+      const settleReject = (error: Error) => {
+        if (settled) return;
+        settled = true;
+        reject(error);
+      };
+      const handshakeTimer = window.setTimeout(() => {
+        this.log('error', `Handshake timed out after ${this.requestTimeout}ms`);
+        this.cleanup();
+        settleReject(new Error(`Gateway handshake timed out after ${this.requestTimeout}ms`));
+      }, this.requestTimeout);
+ 
+      try {
+        this.ws = new WebSocket(this.url);
+ 
+        this.ws.onopen = () => {
+          this.setState('handshaking');
+        };
+ 
+        this.ws.onmessage = (evt) => {
+          try {
+            const frame: GatewayFrame = JSON.parse(evt.data);
+            this.handleFrame(frame, () => {
+              clearTimeout(handshakeTimer);
+              settleResolve();
+            }, (error) => {
+              clearTimeout(handshakeTimer);
+              settleReject(error);
+            });
+          } catch (err: unknown) {
+            const errorMessage = err instanceof Error ? err.message : String(err);
+            this.log('error', `Parse error: ${errorMessage}`);
+          }
+        };
+ 
+        this.ws.onclose = (evt) => {
+          const wasConnected = this.state === 'connected';
+          const closedDuringConnect = !wasConnected && !settled;
+          this.cleanup();
+ 
+          if (wasConnected && this.autoReconnect) {
+            this.scheduleReconnect();
+          }
+ 
+          this.emitEvent('close', { code: evt.code, reason: evt.reason });
+          if (closedDuringConnect) {
+            clearTimeout(handshakeTimer);
+            settleReject(new Error(evt.reason || `WebSocket closed before handshake completed (code: ${evt.code})`));
+          }
+        };
+ 
+        this.ws.onerror = () => {
+          if (this.state === 'connecting' || this.state === 'handshaking') {
+            clearTimeout(handshakeTimer);
+            this.cleanup();
+            settleReject(new Error('WebSocket connection failed'));
+          }
+        };
+      } catch (err) {
+        clearTimeout(handshakeTimer);
+        this.cleanup();
+        settleReject(err instanceof Error ? err : new Error(String(err)));
+      }
+    });
+  }
+ 
+  disconnect() {
+    this.autoReconnect = false;
+    this.cancelReconnect();
+ 
+    if (this.ws) {
+      this.ws.close(1000, 'Client disconnect');
+    }
+    this.cleanup();
+  }
+ 
+  // === Request/Response ===
+ 
+  async request(method: string, params?: Record<string, unknown>): Promise<unknown> {
+    if (this.state !== 'connected') {
+      throw new Error(`Not connected (state: ${this.state})`);
+    }
+ 
+    const id = `req_${++this.requestId}`;
+    const frame: GatewayRequest = { type: 'req', id, method, params };
+ 
+    return new Promise((resolve, reject) => {
+      const timer = window.setTimeout(() => {
+        this.pendingRequests.delete(id);
+        reject(new Error(`Request ${method} timed out`));
+      }, this.requestTimeout);
+ 
+      this.pendingRequests.set(id, { resolve, reject, timer });
+      this.send(frame);
+    });
+  }
+ 
+  // === High-level API ===
+ 
+  // Default agent ID for OpenFang (will be set dynamically from /api/agents)
+  private defaultAgentId: string = '';
+ 
+  /** Try to fetch default agent ID from OpenFang /api/agents endpoint */
+  async fetchDefaultAgentId(): Promise<string | null> {
+    try {
+      // Use /api/agents endpoint which returns array of agents
+      const agents = await this.restGet<Array<{ id: string; name?: string; state?: string }>>('/api/agents');
+      if (agents && agents.length > 0) {
+        // Prefer agent with state "Running", otherwise use first agent
+        const runningAgent = agents.find((a: { id: string; name?: string; state?: string }) => a.state === 'Running');
+        const defaultAgent = runningAgent || agents[0];
+        this.defaultAgentId = defaultAgent.id;
+        this.log('info', `Fetched default agent from /api/agents: ${this.defaultAgentId} (${defaultAgent.name || 'unnamed'})`);
+        return this.defaultAgentId;
+      }
+    } catch (err) {
+      this.log('warn', `Failed to fetch default agent from /api/agents: ${err}`);
+    }
+    return null;
+  }
+ 
+  /** Set the default agent ID */
+  setDefaultAgentId(agentId: string): void {
+    this.defaultAgentId = agentId;
+    this.log('info', `Default agent set to: ${agentId}`);
+  }
+ 
+  /** Get the current default agent ID */
+  getDefaultAgentId(): string {
+    return this.defaultAgentId;
+  }
+ 
+  /** Send message to agent (OpenFang chat API) */
+  async chat(message: string, opts?: {
+    sessionKey?: string;
+    agentId?: string;
+    idempotencyKey?: string;
+    extraSystemPrompt?: string;
+    model?: string;
+    temperature?: number;
+    maxTokens?: number;
+  }): Promise<{ runId: string; sessionId?: string; response?: string }> {
+    // OpenFang uses /api/agents/{agentId}/message endpoint
+    let agentId = opts?.agentId || this.defaultAgentId;
+ 
+    // If no agent ID, try to fetch from OpenFang status
+    if (!agentId) {
+      await this.fetchDefaultAgentId();
+      agentId = this.defaultAgentId;
+    }
+ 
+    if (!agentId) {
+      throw new Error('No agent available. Please ensure OpenFang has at least one agent.');
+    }
+ 
+    const result = await this.restPost<{ response?: string; input_tokens?: number; output_tokens?: number }>(`/api/agents/${agentId}/message`, {
+      message,
+      session_id: opts?.sessionKey,
+    });
+    // OpenFang returns { response, input_tokens, output_tokens }
+    return {
+      runId: createIdempotencyKey(),
+      sessionId: opts?.sessionKey,
+      response: result.response,
+    };
+  }
+ 
+  /** Send message with streaming response (OpenFang WebSocket) */
+  async chatStream(
+    message: string,
+    callbacks: {
+      onDelta: (delta: string) => void;
+      onTool?: (tool: string, input: string, output: string) => void;
+      onHand?: (name: string, status: string, result?: unknown) => void;
+      onComplete: () => void;
+      onError: (error: string) => void;
+    },
+    opts?: {
+      sessionKey?: string;
+      agentId?: string;
+    }
+  ): Promise<{ runId: string }> {
+    let agentId = opts?.agentId || this.defaultAgentId;
+    const runId = createIdempotencyKey();
+    const sessionId = opts?.sessionKey || `session_${Date.now()}`;
+ 
+    // If no agent ID, try to fetch from OpenFang status (async, but we'll handle it in connectOpenFangStream)
+    if (!agentId) {
+      // Try to get default agent asynchronously
+      this.fetchDefaultAgentId().then(() => {
+        const resolvedAgentId = this.defaultAgentId;
+        if (resolvedAgentId) {
+          this.streamCallbacks.set(runId, callbacks);
+          this.connectOpenFangStream(resolvedAgentId, runId, sessionId, message);
+        } else {
+          callbacks.onError('No agent available. Please ensure OpenFang has at least one agent.');
+          callbacks.onComplete();
+        }
+      }).catch((err) => {
+        callbacks.onError(`Failed to get agent: ${err}`);
+        callbacks.onComplete();
+      });
+      return { runId };
+    }
+ 
+    // Store callbacks for this run
+    this.streamCallbacks.set(runId, callbacks);
+ 
+    // Connect to OpenFang WebSocket if not connected
+    this.connectOpenFangStream(agentId, runId, sessionId, message);
+ 
+    return { runId };
+  }
+ 
+  /** Connect to OpenFang streaming WebSocket */
+  private connectOpenFangStream(
+    agentId: string,
+    runId: string,
+    sessionId: string,
+    message: string
+  ): void {
+    // Close existing connection if any
+    if (this.openfangWs && this.openfangWs.readyState !== WebSocket.CLOSED) {
+      this.openfangWs.close();
+    }
+ 
+    // Build WebSocket URL
+    // In dev mode, use Vite proxy; in production, use direct connection
+    let wsUrl: string;
+    if (typeof window !== 'undefined' && window.location.port === '1420') {
+      // Dev mode: use Vite proxy with relative path
+      wsUrl = `ws://${window.location.host}/api/agents/${agentId}/ws`;
+    } else {
+      // Production: extract from stored URL
+      const httpUrl = this.getRestBaseUrl();
+      wsUrl = httpUrl.replace(/^http/, 'ws') + `/api/agents/${agentId}/ws`;
+    }
+ 
+    this.log('info', `Connecting to OpenFang stream: ${wsUrl}`);
+ 
+    try {
+      this.openfangWs = new WebSocket(wsUrl);
+ 
+      this.openfangWs.onopen = () => {
+        this.log('info', 'OpenFang WebSocket connected');
+        // Send chat message using OpenFang actual protocol
+        const chatRequest = {
+          type: 'message',
+          content: message,
+          session_id: sessionId,
+        };
+        this.openfangWs?.send(JSON.stringify(chatRequest));
+      };
+ 
+      this.openfangWs.onmessage = (event) => {
+        try {
+          const data = JSON.parse(event.data);
+          this.handleOpenFangStreamEvent(runId, data, sessionId);
+        } catch (err: unknown) {
+          const errorMessage = err instanceof Error ? err.message : String(err);
+          this.log('error', `Failed to parse stream event: ${errorMessage}`);
+        }
+      };
+ 
+      this.openfangWs.onerror = (_event) => {
+        this.log('error', 'OpenFang WebSocket error');
+        const callbacks = this.streamCallbacks.get(runId);
+        if (callbacks) {
+          callbacks.onError('WebSocket connection failed');
+          this.streamCallbacks.delete(runId);
+        }
+      };
+ 
+      this.openfangWs.onclose = (event) => {
+        this.log('info', `OpenFang WebSocket closed: ${event.code} ${event.reason}`);
+        const callbacks = this.streamCallbacks.get(runId);
+        if (callbacks && event.code !== 1000) {
+          callbacks.onError(`Connection closed: ${event.reason || 'unknown'}`);
+        }
+        this.streamCallbacks.delete(runId);
+        this.openfangWs = null;
+      };
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      this.log('error', `Failed to create WebSocket: ${errorMessage}`);
+      const callbacks = this.streamCallbacks.get(runId);
+      if (callbacks) {
+        callbacks.onError(errorMessage);
+        this.streamCallbacks.delete(runId);
+      }
+    }
+  }
+ 
+  /** Handle OpenFang stream events */
+  private handleOpenFangStreamEvent(runId: string, data: OpenFangStreamEvent, sessionId: string): void {
+    const callbacks = this.streamCallbacks.get(runId);
+    if (!callbacks) return;
+ 
+    switch (data.type) {
+      // OpenFang actual event types
+      case 'text_delta':
+        // Stream delta content
+        if (data.content) {
+          callbacks.onDelta(data.content);
+        }
+        break;
+ 
+      case 'phase':
+        // Phase change: streaming | done
+        if (data.phase === 'done') {
+          callbacks.onComplete();
+          this.streamCallbacks.delete(runId);
+          if (this.openfangWs) {
+            this.openfangWs.close(1000, 'Stream complete');
+          }
+        }
+        break;
+ 
+      case 'response':
+        // Final response with tokens info
+        if (data.content) {
+          // If we haven't received any deltas yet, send the full response
+          // This handles non-streaming responses
+        }
+        // Mark complete if phase done wasn't sent
+        callbacks.onComplete();
+        this.streamCallbacks.delete(runId);
+        if (this.openfangWs) {
+          this.openfangWs.close(1000, 'Stream complete');
+        }
+        break;
+ 
+      case 'typing':
+        // Typing indicator: { state: 'start' | 'stop' }
+        // Can be used for UI feedback
+        break;
+ 
+      case 'tool_call':
+        // Tool call event
+        if (callbacks.onTool && data.tool) {
+          callbacks.onTool(data.tool, JSON.stringify(data.input || {}), data.output || '');
+        }
+        break;
+ 
+      case 'tool_result':
+        if (callbacks.onTool && data.tool) {
+          callbacks.onTool(data.tool, '', String(data.result || data.output || ''));
+        }
+        break;
+ 
+      case 'hand':
+        if (callbacks.onHand && data.hand_name) {
+          callbacks.onHand(data.hand_name, data.hand_status || 'triggered', data.hand_result);
+        }
+        break;
+ 
+      case 'error':
+        callbacks.onError(data.message || data.code || data.content || 'Unknown error');
+        this.streamCallbacks.delete(runId);
+        if (this.openfangWs) {
+          this.openfangWs.close(1011, 'Error');
+        }
+        break;
+ 
+      case 'connected':
+        // Connection established
+        this.log('info', `OpenFang agent connected: ${data.agent_id}`);
+        break;
+ 
+      case 'agents_updated':
+        // Agents list updated
+        this.log('debug', 'Agents list updated');
+        break;
+ 
+      default:
+        // Emit unknown events for debugging
+        this.log('debug', `Stream event: ${data.type}`);
+    }
+ 
+    // Also emit to general 'agent' event listeners
+    this.emitEvent('agent', {
+      stream: data.type === 'text_delta' ? 'assistant' : data.type,
+      delta: data.content,
+      content: data.content,
+      runId,
+      sessionId,
+      ...data,
+    });
+  }
+ 
+  /** Cancel an ongoing stream */
+  cancelStream(runId: string): void {
+    const callbacks = this.streamCallbacks.get(runId);
+    if (callbacks) {
+      callbacks.onError('Stream cancelled');
+      this.streamCallbacks.delete(runId);
+    }
+    if (this.openfangWs && this.openfangWs.readyState === WebSocket.OPEN) {
+      this.openfangWs.close(1000, 'User cancelled');
+    }
+  }
+ 
+  // === REST API Helpers (OpenFang) ===
+ 
+  public getRestBaseUrl(): string {
+    // In browser dev mode, use Vite proxy (empty string = relative path)
+    // In production Tauri, extract HTTP URL from WebSocket URL
+    if (typeof window !== 'undefined' && window.location.port === '1420') {
+      // Dev mode: use Vite proxy (requests go to /api/* which Vite proxies to backend)
+      return '';
+    }
+    // Production: extract HTTP URL from WebSocket URL
+    const wsUrl = this.url;
+    return wsUrl.replace(/^ws/, 'http').replace(/\/ws$/, '');
+  }
+ 
+  public async restGet<T>(path: string): Promise<T> {
+    const baseUrl = this.getRestBaseUrl();
+    const response = await fetch(`${baseUrl}${path}`);
+    if (!response.ok) {
+      // For 404 errors, throw with status code so callers can handle gracefully
+      const error = new Error(`REST API error: ${response.status} ${response.statusText}`);
+      (error as any).status = response.status;
+      throw error;
+    }
+    return response.json();
+  }
+ 
+  public async restPost<T>(path: string, body?: unknown): Promise<T> {
+    const baseUrl = this.getRestBaseUrl();
+    const url = `${baseUrl}${path}`;
+    console.log(`[GatewayClient] POST ${url}`, body);
+ 
+    const response = await fetch(url, {
+      method: 'POST',
+      headers: { 'Content-Type': 'application/json' },
+      body: body ? JSON.stringify(body) : undefined,
+    });
+ 
+    if (!response.ok) {
+      const errorBody = await response.text().catch(() => '');
+      console.error(`[GatewayClient] POST ${url} failed: ${response.status} ${response.statusText}`, errorBody);
+      const error = new Error(`REST API error: ${response.status} ${response.statusText}${errorBody ? ` - ${errorBody}` : ''}`);
+      (error as any).status = response.status;
+      (error as any).body = errorBody;
+      throw error;
+    }
+ 
+    const result = await response.json();
+    console.log(`[GatewayClient] POST ${url} response:`, result);
+    return result;
+  }
+ 
+  public async restPut<T>(path: string, body?: unknown): Promise<T> {
+    const baseUrl = this.getRestBaseUrl();
+    const response = await fetch(`${baseUrl}${path}`, {
+      method: 'PUT',
+      headers: { 'Content-Type': 'application/json' },
+      body: body ? JSON.stringify(body) : undefined,
+    });
+    if (!response.ok) {
+      throw new Error(`REST API error: ${response.status} ${response.statusText}`);
+    }
+    return response.json();
+  }
+ 
+  public async restDelete<T>(path: string): Promise<T> {
+    const baseUrl = this.getRestBaseUrl();
+    const response = await fetch(`${baseUrl}${path}`, {
+      method: 'DELETE',
+    });
+    if (!response.ok) {
+      throw new Error(`REST API error: ${response.status} ${response.statusText}`);
+    }
+    return response.json();
+  }
+ 
+  public async restPatch<T>(path: string, body?: unknown): Promise<T> {
+    const baseUrl = this.getRestBaseUrl();
+    const response = await fetch(`${baseUrl}${path}`, {
+      method: 'PATCH',
+      headers: { 'Content-Type': 'application/json' },
+      body: body ? JSON.stringify(body) : undefined,
+    });
+    if (!response.ok) {
+      throw new Error(`REST API error: ${response.status} ${response.statusText}`);
+    }
+    return response.json();
+  }
+ 
+  // === Event Subscription ===
+ 
+  /** Subscribe to a Gateway event (e.g., 'agent', 'chat', 'heartbeat') */
+  on(event: string, callback: EventCallback): () => void {
+    if (!this.eventListeners.has(event)) {
+      this.eventListeners.set(event, new Set());
+    }
+    this.eventListeners.get(event)!.add(callback);
+ 
+    // Return unsubscribe function
+    return () => {
+      this.eventListeners.get(event)?.delete(callback);
+    };
+  }
+ 
+  /** Subscribe to agent stream events */
+  onAgentStream(callback: (delta: AgentStreamDelta) => void): () => void {
+    return this.on('agent', (payload: unknown) => {
+      callback(payload as AgentStreamDelta);
+    });
+  }
+ 
+  // === Internal ===
+ 
+  private handleFrame(frame: GatewayFrame, connectResolve?: () => void, connectReject?: (error: Error) => void) {
+    // Handle pong responses for heartbeat
+    if (frame.type === 'pong') {
+      this.handlePong();
+      return;
+    }
+ 
+    if (frame.type === 'event') {
+      this.handleEvent(frame, connectResolve, connectReject);
+    } else if (frame.type === 'res') {
+      this.handleResponse(frame);
+    }
+  }
+ 
+  private handleEvent(event: GatewayEvent, connectResolve?: () => void, connectReject?: (error: Error) => void) {
+    // Handle connect challenge
+    if (event.event === 'connect.challenge' && this.state === 'handshaking') {
+      const payload = event.payload as { nonce?: string } | undefined;
+      this.performHandshake(payload?.nonce || '', connectResolve, connectReject);
+      return;
+    }
+ 
+    // Dispatch to listeners
+    this.emitEvent(event.event, event.payload);
+  }
+ 
+  private async performHandshake(challengeNonce: string | undefined, connectResolve?: () => void, connectReject?: (error: Error) => void) {
+    if (!challengeNonce) {
+      this.log('error', 'No challenge nonce received');
+      connectReject?.(new Error('Handshake failed: no challenge nonce'));
+      return;
+    }
+    const connectId = `connect_${Date.now()}`;
+    // Use a valid client ID from GATEWAY_CLIENT_ID_SET
+    // Valid IDs: gateway-client, cli, webchat, node-host, test
+    // 'cli' is for control UI / command-line clients
+    const clientId = 'cli';
+    // Valid modes: cli, webchat, backend, node
+    // 'cli' is for command-line/Control UI clients
+    const clientMode = 'cli';
+    const role = 'operator';
+    const scopes = ['operator.read', 'operator.write', 'operator.admin', 'operator.approvals', 'operator.pairing'];
+ 
+    // Debug: log token status
+    this.log('debug', `Handshake token: ${this.token ? `${this.token.substring(0, 8)}... (${this.token.length} chars)` : '(empty)'}`);
+ 
+    try {
+      const deviceKeys = await this.deviceKeysPromise;
+ 
+      // Debug: log device auth details
+      this.log('debug', `Device auth: deviceId=${deviceKeys.deviceId.substring(0, 8)}..., nonce=${challengeNonce.substring(0, 8)}...`);
+ 
+      const { signature, signedAt } = signDeviceAuth({
+        clientId,
+        clientMode,
+        deviceId: deviceKeys.deviceId,
+        nonce: challengeNonce,
+        role,
+        scopes,
+        secretKey: deviceKeys.secretKey,
+        token: this.token,
+      });
+ 
+      // Debug: log signature details
+      this.log('debug', `Signature created: signedAt=${signedAt}, sig=${signature.substring(0, 16)}...`);
+ 
+      const connectReq: GatewayRequest = {
+        type: 'req',
+        id: connectId,
+        method: 'connect',
+        params: {
+          minProtocol: 3,
+          maxProtocol: 3,
+          client: {
+            id: clientId,
+            version: '0.2.0',
+            platform: this.detectPlatform(),
+            mode: clientMode,
+          },
+          role,
+          scopes,
+ 
+          auth: this.token ? { token: this.token } : {},
+          locale: 'zh-CN',
+          userAgent: 'zclaw-tauri/0.2.0',
+          device: {
+            id: deviceKeys.deviceId,
+            publicKey: deviceKeys.publicKeyBase64,
+            signature,
+            signedAt,
+            nonce: challengeNonce,
+          },
+        },
+      };
+ 
+      const originalHandler = this.ws!.onmessage;
+      this.ws!.onmessage = (evt) => {
+        try {
+          const frame = JSON.parse(evt.data);
+          if (frame.type === 'res' && frame.id === connectId) {
+            this.ws!.onmessage = originalHandler;
+            if (frame.ok) {
+              this.setState('connected');
+              this.reconnectAttempts = 0;
+              this.startHeartbeat(); // Start heartbeat after successful connection
+              this.emitEvent('connected', frame.payload);
+              this.log('info', 'Connected to Gateway');
+              connectResolve?.();
+            } else {
+              const errorObj = frame.error;
+              const errorMessage = errorObj?.message || errorObj?.code || JSON.stringify(errorObj);
+              const error = new Error(`Handshake failed: ${errorMessage}`);
+              this.log('error', error.message);
+ 
+              // Check for signature-related errors and clear device keys if needed
+              if (errorMessage.includes('signature') || errorMessage.includes('device')) {
+                this.log('warn', 'Device signature failed, clearing cached keys for retry');
+                clearDeviceKeys();
+              }
+ 
+              this.cleanup();
+              connectReject?.(error);
+            }
+          } else {
+            originalHandler?.call(this.ws!, evt);
+          }
+        } catch {
+          // Ignore parse errors
+        }
+      };
+ 
+      this.send(connectReq);
+    } catch (err: unknown) {
+      const error = err instanceof Error ? err : new Error(String(err));
+      this.log('error', error.message);
+      this.cleanup();
+      connectReject?.(error);
+    }
+  }
+ 
+  private handleResponse(res: GatewayResponse) {
+    const pending = this.pendingRequests.get(res.id);
+    if (pending) {
+      clearTimeout(pending.timer);
+      this.pendingRequests.delete(res.id);
+      if (res.ok) {
+        pending.resolve(res.payload);
+      } else {
+        pending.reject(new Error(JSON.stringify(res.error)));
+      }
+    }
+  }
+ 
+  private send(frame: GatewayFrame) {
+    if (this.ws?.readyState === WebSocket.OPEN) {
+      this.ws.send(JSON.stringify(frame));
+    }
+  }
+ 
+  private emitEvent(event: string, payload: unknown) {
+    const listeners = this.eventListeners.get(event);
+    if (listeners) {
+      for (const cb of listeners) {
+        try { cb(payload); } catch { /* ignore listener errors */ }
+      }
+    }
+    // Also emit wildcard
+    const wildcardListeners = this.eventListeners.get('*');
+    if (wildcardListeners) {
+      for (const cb of wildcardListeners) {
+        try { cb({ event, payload }); } catch { /* ignore */ }
+      }
+    }
+  }
+ 
+  private setState(state: ConnectionState) {
+    this.state = state;
+    this.onStateChange?.(state);
+    this.emitEvent('state', state);
+  }
+ 
+  private cleanup() {
+    // Stop heartbeat on cleanup
+    this.stopHeartbeat();
+ 
+    for (const [, pending] of this.pendingRequests) {
+      clearTimeout(pending.timer);
+      pending.reject(new Error('Connection closed'));
+    }
+    this.pendingRequests.clear();
+ 
+    if (this.ws) {
+      this.ws.onopen = null;
+      this.ws.onmessage = null;
+      this.ws.onclose = null;
+      this.ws.onerror = null;
+      if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {
+        try { this.ws.close(); } catch { /* ignore */ }
+      }
+      this.ws = null;
+    }
+ 
+    this.setState('disconnected');
+  }
+ 
+  // === Heartbeat Methods ===
+ 
+  /**
+   * Start heartbeat to keep connection alive.
+   * Called after successful connection.
+   */
+  private startHeartbeat(): void {
+    this.stopHeartbeat();
+    this.missedHeartbeats = 0;
+ 
+    this.heartbeatInterval = window.setInterval(() => {
+      this.sendHeartbeat();
+    }, GatewayClient.HEARTBEAT_INTERVAL);
+ 
+    this.log('debug', 'Heartbeat started');
+  }
+ 
+  /**
+   * Stop heartbeat.
+   * Called on cleanup or disconnect.
+   */
+  private stopHeartbeat(): void {
+    if (this.heartbeatInterval) {
+      clearInterval(this.heartbeatInterval);
+      this.heartbeatInterval = null;
+    }
+    if (this.heartbeatTimeout) {
+      clearTimeout(this.heartbeatTimeout);
+      this.heartbeatTimeout = null;
+    }
+    this.log('debug', 'Heartbeat stopped');
+  }
+ 
+  /**
+   * Send a ping heartbeat to the server.
+   */
+  private sendHeartbeat(): void {
+    if (this.ws?.readyState !== WebSocket.OPEN) {
+      this.log('debug', 'Skipping heartbeat - WebSocket not open');
+      return;
+    }
+ 
+    this.missedHeartbeats++;
+    if (this.missedHeartbeats > GatewayClient.MAX_MISSED_HEARTBEATS) {
+      this.log('warn', `Max missed heartbeats (${GatewayClient.MAX_MISSED_HEARTBEATS}), reconnecting`);
+      this.stopHeartbeat();
+      this.ws.close(4000, 'Heartbeat timeout');
+      return;
+    }
+ 
+    // Send ping frame
+    try {
+      this.ws.send(JSON.stringify({ type: 'ping' }));
+      this.log('debug', `Ping sent (missed: ${this.missedHeartbeats})`);
+ 
+      // Set timeout for pong
+      this.heartbeatTimeout = window.setTimeout(() => {
+        this.log('warn', 'Heartbeat pong timeout');
+        // Don't reconnect immediately, let the next heartbeat check
+      }, GatewayClient.HEARTBEAT_TIMEOUT);
+    } catch (error) {
+      this.log('error', `Failed to send heartbeat: ${error instanceof Error ? error.message : String(error)}`);
+    }
+  }
+ 
+  /**
+   * Handle pong response from server.
+   */
+  private handlePong(): void {
+    this.missedHeartbeats = 0;
+    if (this.heartbeatTimeout) {
+      clearTimeout(this.heartbeatTimeout);
+      this.heartbeatTimeout = null;
+    }
+    this.log('debug', 'Pong received, heartbeat reset');
+  }
+ 
+  private static readonly MAX_RECONNECT_ATTEMPTS = 10;
+ 
+  private scheduleReconnect() {
+    if (this.reconnectAttempts >= GatewayClient.MAX_RECONNECT_ATTEMPTS) {
+      this.log('error', `Max reconnect attempts (${GatewayClient.MAX_RECONNECT_ATTEMPTS}) reached. Please reconnect manually.`);
+      this.setState('disconnected');
+      this.emitEvent('reconnect_failed', {
+        attempts: this.reconnectAttempts,
+        maxAttempts: GatewayClient.MAX_RECONNECT_ATTEMPTS
+      });
+      return;
+    }
+ 
+    this.reconnectAttempts++;
+    this.setState('reconnecting');
+    const delay = Math.min(this.reconnectInterval * Math.pow(1.5, this.reconnectAttempts - 1), 30000);
+ 
+    this.log('info', `Scheduling reconnect attempt ${this.reconnectAttempts} in ${delay}ms`);
+ 
+    // Emit reconnecting event for UI
+    this.emitEvent('reconnecting', {
+      attempt: this.reconnectAttempts,
+      delay,
+      maxAttempts: GatewayClient.MAX_RECONNECT_ATTEMPTS
+    });
+ 
+    this.reconnectTimer = window.setTimeout(async () => {
+      try {
+        await this.connect();
+      } catch {
+        /* close handler will trigger another reconnect */
+        this.log('warn', `Reconnect attempt ${this.reconnectAttempts} failed`);
+      }
+    }, delay);
+  }
+ 
+  private cancelReconnect() {
+    if (this.reconnectTimer !== null) {
+      clearTimeout(this.reconnectTimer);
+      this.reconnectTimer = null;
+    }
+  }
+ 
+  private detectPlatform(): string {
+    const ua = navigator.userAgent.toLowerCase();
+    if (ua.includes('win')) return 'windows';
+    if (ua.includes('mac')) return 'macos';
+    return 'linux';
+  }
+ 
+  private log(level: string, message: string) {
+    this.onLog?.(level, message);
+  }
+}
+ 
+// Install REST API methods from gateway-api.ts onto GatewayClient prototype
+installApiMethods(GatewayClient);
+ 
+// Singleton instance
+let _client: GatewayClient | null = null;
+ 
+export function getGatewayClient(opts?: ConstructorParameters<typeof GatewayClient>[0]): GatewayClient {
+  if (!_client) {
+    _client = new GatewayClient(opts);
+  } else if (opts) {
+    _client.updateOptions(opts);
+  }
+  return _client;
+}
+ 
+// === API Method Type Declarations ===
+// These methods are installed at runtime by installApiMethods() in gateway-api.ts.
+// We declare them here so TypeScript knows they exist on GatewayClient.
+export interface GatewayClient {
+  health(): Promise<any>;
+  status(): Promise<any>;
+  listClones(): Promise<any>;
+  createClone(opts: { name: string; role?: string; nickname?: string; scenarios?: string[]; model?: string; workspaceDir?: string; restrictFiles?: boolean; privacyOptIn?: boolean; userName?: string; userRole?: string; emoji?: string; personality?: string; communicationStyle?: string; notes?: string }): Promise<any>;
+  updateClone(id: string, updates: Record<string, any>): Promise<any>;
+  deleteClone(id: string): Promise<any>;
+  getUsageStats(): Promise<any>;
+  getSessionStats(): Promise<any>;
+  getWorkspaceInfo(): Promise<any>;
+  getPluginStatus(): Promise<any>;
+  getQuickConfig(): Promise<any>;
+  saveQuickConfig(config: Record<string, any>): Promise<any>;
+  listSkills(): Promise<any>;
+  getSkill(id: string): Promise<any>;
+  createSkill(skill: { name: string; description?: string; triggers: Array<{ type: string; pattern?: string }>; actions: Array<{ type: string; params?: Record<string, unknown> }>; enabled?: boolean }): Promise<any>;
+  updateSkill(id: string, updates: { name?: string; description?: string; triggers?: Array<{ type: string; pattern?: string }>; actions?: Array<{ type: string; params?: Record<string, unknown> }>; enabled?: boolean }): Promise<any>;
+  deleteSkill(id: string): Promise<any>;
+  listChannels(): Promise<any>;
+  getChannel(id: string): Promise<any>;
+  createChannel(channel: { type: string; name: string; config: Record<string, unknown>; enabled?: boolean }): Promise<any>;
+  updateChannel(id: string, updates: { name?: string; config?: Record<string, unknown>; enabled?: boolean }): Promise<any>;
+  deleteChannel(id: string): Promise<any>;
+  getFeishuStatus(): Promise<any>;
+  listScheduledTasks(): Promise<any>;
+  createScheduledTask(task: { name: string; schedule: string; scheduleType: 'cron' | 'interval' | 'once'; target?: { type: 'agent' | 'hand' | 'workflow'; id: string }; description?: string; enabled?: boolean }): Promise<{ id: string; name: string; schedule: string; status: string }>;
+  deleteScheduledTask(id: string): Promise<void>;
+  toggleScheduledTask(id: string, enabled: boolean): Promise<{ id: string; enabled: boolean }>;
+  listHands(): Promise<{ hands: { id?: string; name: string; description?: string; status?: string; requirements_met?: boolean; category?: string; icon?: string; tool_count?: number; tools?: string[]; metric_count?: number; metrics?: string[] }[] }>;
+  getHand(name: string): Promise<any>;
+  triggerHand(name: string, params?: Record<string, unknown>): Promise<{ runId: string; status: string }>;
+  getHandStatus(name: string, runId: string): Promise<{ status: string; result?: unknown }>;
+  approveHand(name: string, runId: string, approved: boolean, reason?: string): Promise<{ status: string }>;
+  cancelHand(name: string, runId: string): Promise<{ status: string }>;
+  listHandRuns(name: string, opts?: { limit?: number; offset?: number }): Promise<{ runs: { runId: string; status: string; startedAt: string }[] }>;
+  listWorkflows(): Promise<{ workflows: { id: string; name: string; steps: number }[] }>;
+  getWorkflow(id: string): Promise<{ id: string; name: string; steps: unknown[] }>;
+  executeWorkflow(id: string, input?: Record<string, unknown>): Promise<{ runId: string; status: string }>;
+  getWorkflowRun(workflowId: string, runId: string): Promise<{ status: string; step: string; result?: unknown }>;
+  listWorkflowRuns(workflowId: string, opts?: { limit?: number; offset?: number }): Promise<{ runs: Array<{ runId: string; status: string; startedAt: string; completedAt?: string; step?: string; result?: unknown; error?: string }> }>;
+  cancelWorkflow(workflowId: string, runId: string): Promise<{ status: string }>;
+  createWorkflow(workflow: { name: string; description?: string; steps: Array<{ handName: string; name?: string; params?: Record<string, unknown>; condition?: string }> }): Promise<{ id: string; name: string }>;
+  updateWorkflow(id: string, updates: { name?: string; description?: string; steps?: Array<{ handName: string; name?: string; params?: Record<string, unknown>; condition?: string }> }): Promise<{ id: string; name: string }>;
+  deleteWorkflow(id: string): Promise<{ status: string }>;
+  listSessions(opts?: { limit?: number; offset?: number }): Promise<{ sessions: Array<{ id: string; agent_id: string; created_at: string; updated_at?: string; message_count?: number; status?: 'active' | 'archived' | 'expired' }> }>;
+  getSession(sessionId: string): Promise<any>;
+  createSession(opts: { agent_id: string; metadata?: Record<string, unknown> }): Promise<{ id: string; agent_id: string; created_at: string }>;
+  deleteSession(sessionId: string): Promise<{ status: string }>;
+  getSessionMessages(sessionId: string, opts?: { limit?: number; offset?: number }): Promise<{ messages: Array<{ id: string; role: 'user' | 'assistant' | 'system'; content: string; created_at: string; tokens?: { input?: number; output?: number } }> }>;
+  listTriggers(): Promise<{ triggers: { id: string; type: string; enabled: boolean }[] }>;
+  getTrigger(id: string): Promise<any>;
+  createTrigger(trigger: { type: string; name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }): Promise<{ id: string }>;
+  updateTrigger(id: string, updates: { name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }): Promise<{ id: string }>;
+  deleteTrigger(id: string): Promise<{ status: string }>;
+  getAuditLogs(opts?: { limit?: number; offset?: number }): Promise<{ logs: unknown[] }>;
+  verifyAuditLogChain(logId: string): Promise<{ valid: boolean; chain_depth?: number; root_hash?: string; broken_at_index?: number }>;
+  getSecurityStatus(): Promise<{ layers: { name: string; enabled: boolean }[] }>;
+  getCapabilities(): Promise<{ capabilities: string[] }>;
+  listApprovals(status?: string): Promise<{ approvals: { id: string; hand_name: string; run_id: string; status: string; requested_at: string; requested_by?: string; reason?: string; action?: string; params?: Record<string, unknown>; responded_at?: string; responded_by?: string; response_reason?: string }[] }>;
+  respondToApproval(approvalId: string, approved: boolean, reason?: string): Promise<{ status: string }>;
+  listModels(): Promise<{ models: GatewayModelChoice[] }>;
+  getConfig(): Promise<GatewayConfigSnapshot | Record<string, any>>;
+  applyConfig(raw: string, baseHash?: string, opts?: { sessionKey?: string; note?: string; restartDelayMs?: number }): Promise<any>;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/gateway-config.ts.html b/desktop/coverage/src/lib/gateway-config.ts.html new file mode 100644 index 0000000..af1ce93 --- /dev/null +++ b/desktop/coverage/src/lib/gateway-config.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/lib/gateway-config.ts + + + + + + + + + +
+
+

All files / src/lib gateway-config.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * OpenFang Gateway Configuration Types
+ *
+ * Types for gateway configuration and model choices.
+ */
+ 
+export interface GatewayModelChoice {
+  id: string;
+  name: string;
+  provider?: string;
+  contextWindow?: number;
+  maxOutput?: number;
+}
+ 
+export interface GatewayConfigSnapshot {
+  agentName?: string;
+  agentRole?: string;
+  userName?: string;
+  userRole?: string;
+  model?: string;
+  workspaceDir?: string;
+  gatewayUrl?: string;
+  gatewayToken?: string;
+  skillsExtraDirs?: string[];
+  mcpServices?: Array<{ id: string; name: string; enabled: boolean }>;
+  theme?: 'light' | 'dark';
+  autoStart?: boolean;
+  showToolCalls?: boolean;
+  restrictFiles?: boolean;
+  autoSaveContext?: boolean;
+  fileWatching?: boolean;
+  privacyOptIn?: boolean;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/gateway-storage.ts.html b/desktop/coverage/src/lib/gateway-storage.ts.html new file mode 100644 index 0000000..46f6234 --- /dev/null +++ b/desktop/coverage/src/lib/gateway-storage.ts.html @@ -0,0 +1,715 @@ + + + + + + Code coverage report for src/lib/gateway-storage.ts + + + + + + + + + +
+
+

All files / src/lib gateway-storage.ts

+
+ +
+ 20.86% + Statements + 24/115 +
+ + +
+ 60% + Branches + 3/5 +
+ + +
+ 12.5% + Functions + 1/8 +
+ + +
+ 20.86% + Lines + 24/115 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +2111x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +14x +14x +14x +10x +7x +14x +  +  +14x +  +  +  +  +  +1x +1x +1x +1x +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * gateway-storage.ts - Gateway URL/Token Storage & Normalization
+ *
+ * Extracted from gateway-client.ts for modularity.
+ * Manages WSS configuration, URL normalization, and
+ * secure storage persistence for gateway URL and token.
+ *
+ * Security: Token is now stored using secure storage (keychain or encrypted localStorage)
+ */
+ 
+import { secureStorage } from './secure-storage';
+import { logKeyEvent, logSecurityEvent } from './security-audit';
+ 
+// === WSS Configuration ===
+ 
+/**
+ * Whether to use WSS (WebSocket Secure) instead of WS.
+ * - Production: defaults to WSS for security
+ * - Development: defaults to WS for convenience
+ * - Override: set VITE_USE_WSS=false to force WS in production
+ */
+const USE_WSS = import.meta.env.VITE_USE_WSS !== 'false' && import.meta.env.PROD;
+ 
+/**
+ * Default protocol based on WSS configuration.
+ */
+const DEFAULT_WS_PROTOCOL = USE_WSS ? 'wss://' : 'ws://';
+ 
+/**
+ * Check if a URL points to localhost.
+ */
+export function isLocalhost(url: string): boolean {
+  try {
+    const parsed = new URL(url);
+    return parsed.hostname === 'localhost' ||
+           parsed.hostname === '127.0.0.1' ||
+           parsed.hostname === '[::1]';
+  } catch {
+    return false;
+  }
+}
+ 
+// === URL Constants ===
+ 
+// OpenFang endpoints (port 50051 - actual running port)
+// Note: REST API uses relative path to leverage Vite proxy for CORS bypass
+export const DEFAULT_GATEWAY_URL = `${DEFAULT_WS_PROTOCOL}127.0.0.1:50051/ws`;
+export const REST_API_URL = ''; // Empty = use relative path (Vite proxy)
+export const FALLBACK_GATEWAY_URLS = [
+  DEFAULT_GATEWAY_URL,
+  `${DEFAULT_WS_PROTOCOL}127.0.0.1:4200/ws`,
+];
+ 
+const GATEWAY_URL_STORAGE_KEY = 'zclaw_gateway_url';
+const GATEWAY_TOKEN_STORAGE_KEY = 'zclaw_gateway_token';
+ 
+// === URL Normalization ===
+ 
+/**
+ * Normalize a gateway URL to ensure correct protocol and path.
+ * - Ensures ws:// or wss:// protocol based on configuration
+ * - Ensures /ws path suffix
+ * - Handles both localhost and IP addresses
+ */
+export function normalizeGatewayUrl(url: string): string {
+  let normalized = url.trim();
+ 
+  // Remove trailing slashes except for protocol
+  normalized = normalized.replace(/\/+$/, '');
+ 
+  // Ensure protocol
+  if (!normalized.startsWith('ws://') && !normalized.startsWith('wss://')) {
+    normalized = USE_WSS ? `wss://${normalized}` : `ws://${normalized}`;
+  }
+ 
+  // Ensure /ws path
+  if (!normalized.endsWith('/ws')) {
+    normalized = `${normalized}/ws`;
+  }
+ 
+  return normalized;
+}
+ 
+// === LocalStorage Helpers ===
+ 
+export function getStoredGatewayUrl(): string {
+  try {
+    const stored = localStorage.getItem(GATEWAY_URL_STORAGE_KEY);
+    return normalizeGatewayUrl(stored || DEFAULT_GATEWAY_URL);
+  } catch {
+    return DEFAULT_GATEWAY_URL;
+  }
+}
+ 
+export function setStoredGatewayUrl(url: string): string {
+  const normalized = normalizeGatewayUrl(url || DEFAULT_GATEWAY_URL);
+  try {
+    localStorage.setItem(GATEWAY_URL_STORAGE_KEY, normalized);
+  } catch { /* ignore localStorage failures */ }
+  return normalized;
+}
+ 
+/**
+ * Get the stored gateway token from secure storage
+ * Uses OS keychain when available, falls back to encrypted localStorage
+ *
+ * @returns The stored token or empty string if not found
+ */
+export async function getStoredGatewayTokenAsync(): Promise<string> {
+  try {
+    const token = await secureStorage.get(GATEWAY_TOKEN_STORAGE_KEY);
+    if (token) {
+      logKeyEvent('key_accessed', 'Retrieved gateway token', { source: 'secure_storage' });
+    }
+    return token || '';
+  } catch (error) {
+    console.error('[GatewayStorage] Failed to get gateway token:', error);
+    return '';
+  }
+}
+ 
+/**
+ * Synchronous version for backward compatibility
+ * @deprecated Use getStoredGatewayTokenAsync() instead
+ */
+export function getStoredGatewayToken(): string {
+  // This returns empty string and logs a warning in dev mode
+  // Real code should use the async version
+  if (process.env.NODE_ENV === 'development') {
+    console.warn('[GatewayStorage] Using synchronous token access - consider using async version');
+  }
+ 
+  // Try to get from localStorage as fallback (may be encrypted)
+  try {
+    const stored = localStorage.getItem(GATEWAY_TOKEN_STORAGE_KEY);
+    if (stored) {
+      // Check if it's encrypted (has iv and data fields)
+      try {
+        const parsed = JSON.parse(stored);
+        if (parsed && typeof parsed.iv === 'string' && typeof parsed.data === 'string') {
+          // Data is encrypted - cannot decrypt synchronously
+          console.warn('[GatewayStorage] Token is encrypted - use async version');
+          return '';
+        }
+      } catch {
+        // Not JSON, so it's plaintext (legacy format)
+        return stored;
+      }
+    }
+    return '';
+  } catch {
+    return '';
+  }
+}
+ 
+/**
+ * Store the gateway token securely
+ * Uses OS keychain when available, falls back to encrypted localStorage
+ *
+ * @param token - The token to store
+ * @returns The normalized token
+ */
+export async function setStoredGatewayTokenAsync(token: string): Promise<string> {
+  const normalized = token.trim();
+ 
+  try {
+    if (normalized) {
+      await secureStorage.set(GATEWAY_TOKEN_STORAGE_KEY, normalized);
+      logKeyEvent('key_stored', 'Stored gateway token', { source: 'secure_storage' });
+    } else {
+      await secureStorage.delete(GATEWAY_TOKEN_STORAGE_KEY);
+      logKeyEvent('key_deleted', 'Deleted gateway token', { source: 'secure_storage' });
+    }
+ 
+    // Clear legacy localStorage token if it exists
+    localStorage.removeItem(GATEWAY_TOKEN_STORAGE_KEY);
+  } catch (error) {
+    console.error('[GatewayStorage] Failed to store gateway token:', error);
+    logSecurityEvent('security_violation', 'Failed to store gateway token securely', {
+      error: error instanceof Error ? error.message : String(error),
+    });
+  }
+ 
+  return normalized;
+}
+ 
+/**
+ * Synchronous version for backward compatibility
+ * @deprecated Use setStoredGatewayTokenAsync() instead
+ */
+export function setStoredGatewayToken(token: string): string {
+  const normalized = token.trim();
+ 
+  if (process.env.NODE_ENV === 'development') {
+    console.warn('[GatewayStorage] Using synchronous token storage - consider using async version');
+  }
+ 
+  try {
+    if (normalized) {
+      // Store in localStorage as fallback (not secure, but better than nothing)
+      localStorage.setItem(GATEWAY_TOKEN_STORAGE_KEY, normalized);
+    } else {
+      localStorage.removeItem(GATEWAY_TOKEN_STORAGE_KEY);
+    }
+  } catch {
+    /* ignore localStorage failures */
+  }
+ 
+  return normalized;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/gateway-types.ts.html b/desktop/coverage/src/lib/gateway-types.ts.html new file mode 100644 index 0000000..6bb3d46 --- /dev/null +++ b/desktop/coverage/src/lib/gateway-types.ts.html @@ -0,0 +1,373 @@ + + + + + + Code coverage report for src/lib/gateway-types.ts + + + + + + + + + +
+
+

All files / src/lib gateway-types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * gateway-types.ts - Gateway Protocol Types
+ *
+ * Extracted from gateway-client.ts for modularity.
+ * Contains all WebSocket protocol types, stream event types,
+ * and connection state definitions.
+ */
+ 
+// === Protocol Types ===
+ 
+export interface GatewayRequest {
+  type: 'req';
+  id: string;
+  method: string;
+  params?: Record<string, unknown>;
+}
+ 
+export interface GatewayError {
+  code?: string;
+  message?: string;
+  details?: unknown;
+}
+ 
+export interface GatewayResponse {
+  type: 'res';
+  id: string;
+  ok: boolean;
+  payload?: unknown;
+  error?: GatewayError;
+}
+ 
+export interface GatewayEvent {
+  type: 'event';
+  event: string;
+  payload?: unknown;
+  seq?: number;
+}
+ 
+export interface GatewayPong {
+  type: 'pong';
+  timestamp?: number;
+}
+ 
+export type GatewayFrame = GatewayRequest | GatewayResponse | GatewayEvent | GatewayPong;
+ 
+// === Stream Types ===
+ 
+export interface AgentStreamDelta {
+  stream: 'assistant' | 'tool' | 'lifecycle' | 'hand' | 'workflow';
+  delta?: string;
+  content?: string;
+  tool?: string;
+  toolInput?: string;
+  toolOutput?: string;
+  phase?: 'start' | 'end' | 'error';
+  runId?: string;
+  error?: string;
+  // Hand event fields
+  handName?: string;
+  handStatus?: string;
+  handResult?: unknown;
+  // Workflow event fields
+  workflowId?: string;
+  workflowStep?: string;
+  workflowStatus?: string;
+  workflowResult?: unknown;
+}
+ 
+/** OpenFang WebSocket stream event types */
+export interface OpenFangStreamEvent {
+  type: 'text_delta' | 'phase' | 'response' | 'typing' | 'tool_call' | 'tool_result' | 'hand' | 'workflow' | 'error' | 'connected' | 'agents_updated';
+  content?: string;
+  phase?: 'streaming' | 'done';
+  state?: 'start' | 'stop';
+  tool?: string;
+  input?: unknown;
+  output?: string;
+  result?: unknown;
+  hand_name?: string;
+  hand_status?: string;
+  hand_result?: unknown;
+  workflow_id?: string;
+  workflow_step?: string;
+  workflow_status?: string;
+  workflow_result?: unknown;
+  message?: string;
+  code?: string;
+  agent_id?: string;
+  agents?: Array<{ id: string; name: string; status: string }>;
+}
+ 
+// === Connection State ===
+ 
+export type ConnectionState = 'disconnected' | 'connecting' | 'handshaking' | 'connected' | 'reconnecting';
+ 
+export type EventCallback = (payload: unknown) => void;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/health-check.ts.html b/desktop/coverage/src/lib/health-check.ts.html new file mode 100644 index 0000000..9926662 --- /dev/null +++ b/desktop/coverage/src/lib/health-check.ts.html @@ -0,0 +1,496 @@ + + + + + + Code coverage report for src/lib/health-check.ts + + + + + + + + + +
+
+

All files / src/lib health-check.ts

+
+ +
+ 0% + Statements + 0/78 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Health Check Library
+ *
+ * Provides Tauri health check command wrappers and utilities
+ * for monitoring the health status of the OpenFang backend.
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+import { isTauriRuntime } from './tauri-gateway';
+ 
+// === Types ===
+ 
+export type HealthStatus = 'healthy' | 'unhealthy' | 'unknown';
+ 
+export interface HealthCheckResult {
+  status: HealthStatus;
+  message?: string;
+  timestamp: number;
+  details?: Record<string, unknown>;
+}
+ 
+export interface OpenFangHealthResponse {
+  healthy: boolean;
+  message?: string;
+  details?: Record<string, unknown>;
+}
+ 
+// === Health Check Functions ===
+ 
+/**
+ * Perform a single health check via Tauri command.
+ * Returns a structured result with status, message, and timestamp.
+ */
+export async function performHealthCheck(): Promise<HealthCheckResult> {
+  const timestamp = Date.now();
+ 
+  if (!isTauriRuntime()) {
+    return {
+      status: 'unknown',
+      message: 'Not running in Tauri environment',
+      timestamp,
+    };
+  }
+ 
+  try {
+    const response = await invoke<OpenFangHealthResponse>('openfang_health_check');
+ 
+    return {
+      status: response.healthy ? 'healthy' : 'unhealthy',
+      message: response.message,
+      timestamp,
+      details: response.details,
+    };
+  } catch (error) {
+    const errorMessage = error instanceof Error ? error.message : String(error);
+    return {
+      status: 'unhealthy',
+      message: `Health check failed: ${errorMessage}`,
+      timestamp,
+    };
+  }
+}
+ 
+/**
+ * Create a periodic health check scheduler.
+ * Returns cleanup function to stop the interval.
+ */
+export function createHealthCheckScheduler(
+  callback: (result: HealthCheckResult) => void,
+  intervalMs: number = 30000 // Default: 30 seconds
+): () => void {
+  let intervalId: ReturnType<typeof setInterval> | null = null;
+  let isChecking = false;
+ 
+  const check = async () => {
+    // Prevent overlapping checks
+    if (isChecking) return;
+    isChecking = true;
+ 
+    try {
+      const result = await performHealthCheck();
+      callback(result);
+    } catch (error) {
+      console.error('[HealthCheck] Scheduled check failed:', error);
+      callback({
+        status: 'unknown',
+        message: error instanceof Error ? error.message : 'Unknown error',
+        timestamp: Date.now(),
+      });
+    } finally {
+      isChecking = false;
+    }
+  };
+ 
+  // Perform initial check immediately
+  check();
+ 
+  // Schedule periodic checks
+  intervalId = setInterval(check, intervalMs);
+ 
+  // Return cleanup function
+  return () => {
+    if (intervalId !== null) {
+      clearInterval(intervalId);
+      intervalId = null;
+    }
+  };
+}
+ 
+// === Utility Functions ===
+ 
+/**
+ * Get a human-readable label for a health status.
+ */
+export function getHealthStatusLabel(status: HealthStatus): string {
+  switch (status) {
+    case 'healthy':
+      return '健康';
+    case 'unhealthy':
+      return '异常';
+    case 'unknown':
+    default:
+      return '未知';
+  }
+}
+ 
+/**
+ * Format a timestamp for display.
+ */
+export function formatHealthCheckTime(timestamp: number): string {
+  const date = new Date(timestamp);
+  return date.toLocaleTimeString('zh-CN', {
+    hour: '2-digit',
+    minute: '2-digit',
+    second: '2-digit',
+  });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/index.html b/desktop/coverage/src/lib/index.html new file mode 100644 index 0000000..beeda05 --- /dev/null +++ b/desktop/coverage/src/lib/index.html @@ -0,0 +1,791 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 16.84% + Statements + 1711/10159 +
+ + +
+ 74.48% + Branches + 289/388 +
+ + +
+ 32.55% + Functions + 125/384 +
+ + +
+ 16.84% + Lines + 1711/10159 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
active-learning.ts +
+
0%0/244100%1/1100%1/10%0/244
agent-swarm.ts +
+
0%0/3410%0/10%0/10%0/341
animations.ts +
+
0%0/43100%1/1100%1/10%0/43
api-fallbacks.ts +
+
5.83%8/137100%0/00%0/95.83%8/137
api-key-storage.ts +
+
0%0/2510%0/10%0/10%0/251
audit-logger.ts +
+
0%0/104100%1/1100%1/10%0/104
autonomy-manager.ts +
+
0%0/337100%1/1100%1/10%0/337
browser-client.ts +
+
0%0/2040%0/10%0/10%0/204
config-parser.ts +
+
86.84%198/22889.58%43/4883.33%10/1286.84%198/228
crypto-utils.ts +
+
82.87%150/18197.29%36/3768.42%13/1982.87%150/181
encrypted-chat-storage.ts +
+
0%0/2330%0/10%0/10%0/233
error-handling.ts +
+
0%0/2380%0/10%0/10%0/238
error-types.ts +
+
0%0/407100%1/1100%1/10%0/407
error-utils.ts +
+
0%0/38100%1/1100%1/10%0/38
gateway-api.ts +
+
17.83%66/370100%1/11.58%1/6317.83%66/370
gateway-auth.ts +
+
4.25%4/94100%0/00%0/84.25%4/94
gateway-client.ts +
+
9.84%78/79255.55%5/95.88%3/519.84%78/792
gateway-config.ts +
+
0%0/00%1/10%1/10%0/0
gateway-storage.ts +
+
20.86%24/11560%3/512.5%1/820.86%24/115
gateway-types.ts +
+
0%0/00%1/10%1/10%0/0
health-check.ts +
+
0%0/780%0/10%0/10%0/78
intelligence-backend.ts +
+
0%0/1830%0/10%0/10%0/183
intelligence-client.ts +
+
0%0/9310%0/10%0/10%0/931
json-utils.ts +
+
0%0/64100%1/1100%1/10%0/64
kernel-client.ts +
+
12.71%59/4640%0/10%0/5512.71%59/464
llm-service.ts +
+
0%0/3730%0/10%0/10%0/373
memory-extractor.ts +
+
0%0/2430%0/10%0/10%0/243
message-virtualization.ts +
+
0%0/2250%0/10%0/10%0/225
personality-presets.ts +
+
0%0/232100%1/1100%1/10%0/232
pipeline-client.ts +
+
0%0/2800%0/10%0/10%0/280
pipeline-recommender.ts +
+
0%0/1900%0/10%0/10%0/190
request-helper.ts +
+
88.95%290/32680%48/60100%23/2388.95%290/326
secure-storage.ts +
+
34.17%95/27867.85%19/2840.9%9/2234.17%95/278
security-audit.ts +
+
52.5%157/29972.97%27/3739.39%13/3352.5%157/299
security-index.ts +
+
0%0/320%0/10%0/10%0/32
security-utils.ts +
+
65.47%256/39170.58%60/8560%12/2065.47%256/391
skill-adapter.ts +
+
0%0/118100%1/1100%1/10%0/118
skill-discovery.ts +
+
0%0/2530%0/10%0/10%0/253
tauri-gateway.ts +
+
0%0/1150%0/10%0/10%0/115
team-client.ts +
+
91.91%250/27278.57%22/28100%21/2191.91%250/272
toml-utils.ts +
+
100%76/7682.35%14/17100%8/8100%76/76
use-onboarding.ts +
+
0%0/740%0/10%0/10%0/74
useProposalNotifications.ts +
+
0%0/1000%0/10%0/10%0/100
useTeamEvents.ts +
+
0%0/1350%0/10%0/10%0/135
utils.ts +
+
0%0/40%0/10%0/10%0/4
viking-client.ts +
+
0%0/660%0/10%0/10%0/66
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/intelligence-backend.ts.html b/desktop/coverage/src/lib/intelligence-backend.ts.html new file mode 100644 index 0000000..d58e6af --- /dev/null +++ b/desktop/coverage/src/lib/intelligence-backend.ts.html @@ -0,0 +1,1450 @@ + + + + + + Code coverage report for src/lib/intelligence-backend.ts + + + + + + + + + +
+
+

All files / src/lib intelligence-backend.ts

+
+ +
+ 0% + Statements + 0/183 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/183 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Layer Backend Adapter
+ *
+ * Provides TypeScript API for calling Rust intelligence commands.
+ * This replaces the localStorage-based implementations in:
+ * - agent-memory.ts (Phase 1)
+ * - heartbeat-engine.ts (Phase 2)
+ * - context-compactor.ts (Phase 2)
+ * - reflection-engine.ts (Phase 3)
+ * - agent-identity.ts (Phase 3)
+ *
+ * Usage:
+ * ```typescript
+ * import { intelligence } from './intelligence-backend';
+ *
+ * // Memory
+ * const memoryId = await intelligence.memory.store({ ... });
+ * const memories = await intelligence.memory.search({ query: '...' });
+ *
+ * // Heartbeat
+ * await intelligence.heartbeat.init('agent-1');
+ * await intelligence.heartbeat.start('agent-1');
+ *
+ * // Reflection
+ * const result = await intelligence.reflection.reflect('agent-1', memories);
+ * ```
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+ 
+// === Types ===
+ 
+export interface MemoryEntryInput {
+  agent_id: string;
+  memory_type: string;
+  content: string;
+  importance?: number;
+  source?: string;
+  tags?: string[];
+  conversation_id?: string;
+}
+ 
+export interface PersistentMemory {
+  id: string;
+  agent_id: string;
+  memory_type: string;
+  content: string;
+  importance: number;
+  source: string;
+  tags: string;
+  conversation_id: string | null;
+  created_at: string;
+  last_accessed_at: string;
+  access_count: number;
+  embedding: string | null;
+}
+ 
+export interface MemorySearchOptions {
+  agent_id?: string;
+  memory_type?: string;
+  tags?: string[];
+  query?: string;
+  min_importance?: number;
+  limit?: number;
+  offset?: number;
+}
+ 
+export interface MemoryStats {
+  total_entries: number;
+  by_type: Record<string, number>;
+  by_agent: Record<string, number>;
+  oldest_entry: string | null;
+  newest_entry: string | null;
+  storage_size_bytes: number;
+}
+ 
+// Heartbeat types
+export interface HeartbeatConfig {
+  enabled: boolean;
+  interval_minutes: number;
+  quiet_hours_start: string | null;
+  quiet_hours_end: string | null;
+  notify_channel: 'ui' | 'desktop' | 'all';
+  proactivity_level: 'silent' | 'light' | 'standard' | 'autonomous';
+  max_alerts_per_tick: number;
+}
+ 
+export interface HeartbeatAlert {
+  title: string;
+  content: string;
+  urgency: 'low' | 'medium' | 'high';
+  source: string;
+  timestamp: string;
+}
+ 
+export interface HeartbeatResult {
+  status: 'ok' | 'alert';
+  alerts: HeartbeatAlert[];
+  checked_items: number;
+  timestamp: string;
+}
+ 
+// Compactor types
+export interface CompactableMessage {
+  role: string;
+  content: string;
+  id?: string;
+  timestamp?: string;
+}
+ 
+export interface CompactionResult {
+  compacted_messages: CompactableMessage[];
+  summary: string;
+  original_count: number;
+  retained_count: number;
+  flushed_memories: number;
+  tokens_before_compaction: number;
+  tokens_after_compaction: number;
+}
+ 
+export interface CompactionCheck {
+  should_compact: boolean;
+  current_tokens: number;
+  threshold: number;
+  urgency: 'none' | 'soft' | 'hard';
+}
+ 
+// Reflection types
+export interface MemoryEntryForAnalysis {
+  memory_type: string;
+  content: string;
+  importance: number;
+  access_count: number;
+  tags: string[];
+}
+ 
+export interface PatternObservation {
+  observation: string;
+  frequency: number;
+  sentiment: 'positive' | 'negative' | 'neutral';
+  evidence: string[];
+}
+ 
+export interface ImprovementSuggestion {
+  area: string;
+  suggestion: string;
+  priority: 'high' | 'medium' | 'low';
+}
+ 
+// Reflection identity proposal (from reflection engine, not yet persisted)
+export interface ReflectionIdentityProposal {
+  agent_id: string;
+  field: string;
+  current_value: string;
+  proposed_value: string;
+  reason: string;
+}
+ 
+export interface ReflectionResult {
+  patterns: PatternObservation[];
+  improvements: ImprovementSuggestion[];
+  identity_proposals: ReflectionIdentityProposal[];
+  new_memories: number;
+  timestamp: string;
+}
+ 
+export interface ReflectionState {
+  conversations_since_reflection: number;
+  last_reflection_time: string | null;
+  last_reflection_agent_id: string | null;
+}
+ 
+// Identity types
+export interface IdentityFiles {
+  soul: string;
+  instructions: string;
+  user_profile: string;
+  heartbeat?: string;
+}
+ 
+export interface IdentityChangeProposal {
+  id: string;
+  agent_id: string;
+  file: 'soul' | 'instructions';
+  reason: string;
+  current_content: string;
+  suggested_content: string;
+  status: 'pending' | 'approved' | 'rejected';
+  created_at: string;
+}
+ 
+export interface IdentitySnapshot {
+  id: string;
+  agent_id: string;
+  files: IdentityFiles;
+  timestamp: string;
+  reason: string;
+}
+ 
+// === Memory API ===
+ 
+export const memory = {
+  async init(): Promise<void> {
+    await invoke('memory_init');
+  },
+ 
+  async store(entry: MemoryEntryInput): Promise<string> {
+    return invoke('memory_store', { entry });
+  },
+ 
+  async get(id: string): Promise<PersistentMemory | null> {
+    return invoke('memory_get', { id });
+  },
+ 
+  async search(options: MemorySearchOptions): Promise<PersistentMemory[]> {
+    return invoke('memory_search', { options });
+  },
+ 
+  async delete(id: string): Promise<void> {
+    await invoke('memory_delete', { id });
+  },
+ 
+  async deleteAll(agentId: string): Promise<number> {
+    return invoke('memory_delete_all', { agentId });
+  },
+ 
+  async stats(): Promise<MemoryStats> {
+    return invoke('memory_stats');
+  },
+ 
+  async export(): Promise<PersistentMemory[]> {
+    return invoke('memory_export');
+  },
+ 
+  async import(memories: PersistentMemory[]): Promise<number> {
+    return invoke('memory_import', { memories });
+  },
+ 
+  async dbPath(): Promise<string> {
+    return invoke('memory_db_path');
+  },
+};
+ 
+// === Heartbeat API ===
+ 
+export const heartbeat = {
+  async init(agentId: string, config?: HeartbeatConfig): Promise<void> {
+    await invoke('heartbeat_init', { agentId, config });
+  },
+ 
+  async start(agentId: string): Promise<void> {
+    await invoke('heartbeat_start', { agentId });
+  },
+ 
+  async stop(agentId: string): Promise<void> {
+    await invoke('heartbeat_stop', { agentId });
+  },
+ 
+  async tick(agentId: string): Promise<HeartbeatResult> {
+    return invoke('heartbeat_tick', { agentId });
+  },
+ 
+  async getConfig(agentId: string): Promise<HeartbeatConfig> {
+    return invoke('heartbeat_get_config', { agentId });
+  },
+ 
+  async updateConfig(agentId: string, config: HeartbeatConfig): Promise<void> {
+    await invoke('heartbeat_update_config', { agentId, config });
+  },
+ 
+  async getHistory(agentId: string, limit?: number): Promise<HeartbeatResult[]> {
+    return invoke('heartbeat_get_history', { agentId, limit });
+  },
+};
+ 
+// === Compactor API ===
+ 
+export const compactor = {
+  estimateTokens(text: string): Promise<number> {
+    return invoke('compactor_estimate_tokens', { text });
+  },
+ 
+  estimateMessagesTokens(messages: CompactableMessage[]): Promise<number> {
+    return invoke('compactor_estimate_messages_tokens', { messages });
+  },
+ 
+  checkThreshold(
+    messages: CompactableMessage[],
+    config?: CompactionConfig
+  ): Promise<CompactionCheck> {
+    return invoke('compactor_check_threshold', { messages, config });
+  },
+ 
+  compact(
+    messages: CompactableMessage[],
+    agentId: string,
+    conversationId?: string,
+    config?: CompactionConfig
+  ): Promise<CompactionResult> {
+    return invoke('compactor_compact', {
+      messages,
+      agentId,
+      conversationId,
+      config,
+    });
+  },
+};
+ 
+export interface CompactionConfig {
+  soft_threshold_tokens?: number;
+  hard_threshold_tokens?: number;
+  reserve_tokens?: number;
+  memory_flush_enabled?: boolean;
+  keep_recent_messages?: number;
+  summary_max_tokens?: number;
+  use_llm?: boolean;
+  llm_fallback_to_rules?: boolean;
+}
+ 
+// === Reflection API ===
+ 
+export const reflection = {
+  async init(config?: ReflectionConfig): Promise<void> {
+    await invoke('reflection_init', { config });
+  },
+ 
+  async recordConversation(): Promise<void> {
+    await invoke('reflection_record_conversation');
+  },
+ 
+  async shouldReflect(): Promise<boolean> {
+    return invoke('reflection_should_reflect');
+  },
+ 
+  async reflect(
+    agentId: string,
+    memories: MemoryEntryForAnalysis[]
+  ): Promise<ReflectionResult> {
+    return invoke('reflection_reflect', { agentId, memories });
+  },
+ 
+  async getHistory(limit?: number): Promise<ReflectionResult[]> {
+    return invoke('reflection_get_history', { limit });
+  },
+ 
+  async getState(): Promise<ReflectionState> {
+    return invoke('reflection_get_state');
+  },
+};
+ 
+export interface ReflectionConfig {
+  trigger_after_conversations?: number;
+  trigger_after_hours?: number;
+  allow_soul_modification?: boolean;
+  require_approval?: boolean;
+  use_llm?: boolean;
+  llm_fallback_to_rules?: boolean;
+}
+ 
+// === Identity API ===
+ 
+export const identity = {
+  async get(agentId: string): Promise<IdentityFiles> {
+    return invoke('identity_get', { agentId });
+  },
+ 
+  async getFile(agentId: string, file: string): Promise<string> {
+    return invoke('identity_get_file', { agentId, file });
+  },
+ 
+  async buildPrompt(
+    agentId: string,
+    memoryContext?: string
+  ): Promise<string> {
+    return invoke('identity_build_prompt', { agentId, memoryContext });
+  },
+ 
+  async updateUserProfile(agentId: string, content: string): Promise<void> {
+    await invoke('identity_update_user_profile', { agentId, content });
+  },
+ 
+  async appendUserProfile(agentId: string, addition: string): Promise<void> {
+    await invoke('identity_append_user_profile', { agentId, addition });
+  },
+ 
+  async proposeChange(
+    agentId: string,
+    file: 'soul' | 'instructions',
+    suggestedContent: string,
+    reason: string
+  ): Promise<IdentityChangeProposal> {
+    return invoke('identity_propose_change', {
+      agentId,
+      file,
+      suggestedContent,
+      reason,
+    });
+  },
+ 
+  async approveProposal(proposalId: string): Promise<IdentityFiles> {
+    return invoke('identity_approve_proposal', { proposalId });
+  },
+ 
+  async rejectProposal(proposalId: string): Promise<void> {
+    await invoke('identity_reject_proposal', { proposalId });
+  },
+ 
+  async getPendingProposals(
+    agentId?: string
+  ): Promise<IdentityChangeProposal[]> {
+    return invoke('identity_get_pending_proposals', { agentId });
+  },
+ 
+  async updateFile(
+    agentId: string,
+    file: string,
+    content: string
+  ): Promise<void> {
+    await invoke('identity_update_file', { agentId, file, content });
+  },
+ 
+  async getSnapshots(
+    agentId: string,
+    limit?: number
+  ): Promise<IdentitySnapshot[]> {
+    return invoke('identity_get_snapshots', { agentId, limit });
+  },
+ 
+  async restoreSnapshot(
+    agentId: string,
+    snapshotId: string
+  ): Promise<void> {
+    await invoke('identity_restore_snapshot', { agentId, snapshotId });
+  },
+ 
+  async listAgents(): Promise<string[]> {
+    return invoke('identity_list_agents');
+  },
+ 
+  async deleteAgent(agentId: string): Promise<void> {
+    await invoke('identity_delete_agent', { agentId });
+  },
+};
+ 
+// === Unified Export ===
+ 
+export const intelligence = {
+  memory,
+  heartbeat,
+  compactor,
+  reflection,
+  identity,
+};
+ 
+export default intelligence;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/intelligence-client.ts.html b/desktop/coverage/src/lib/intelligence-client.ts.html new file mode 100644 index 0000000..cb9c7c4 --- /dev/null +++ b/desktop/coverage/src/lib/intelligence-client.ts.html @@ -0,0 +1,4219 @@ + + + + + + Code coverage report for src/lib/intelligence-client.ts + + + + + + + + + +
+
+

All files / src/lib intelligence-client.ts

+
+ +
+ 0% + Statements + 0/931 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/931 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Intelligence Layer Unified Client
+ *
+ * Provides a unified API for intelligence operations that:
+ * - Uses Rust backend (via Tauri commands) when running in Tauri environment
+ * - Falls back to localStorage-based implementation in browser environment
+ *
+ * This replaces direct usage of:
+ * - agent-memory.ts
+ * - heartbeat-engine.ts
+ * - context-compactor.ts
+ * - reflection-engine.ts
+ * - agent-identity.ts
+ *
+ * Usage:
+ * ```typescript
+ * import { intelligenceClient, toFrontendMemory, toBackendMemoryInput } from './intelligence-client';
+ *
+ * // Store memory
+ * const id = await intelligenceClient.memory.store({
+ *   agent_id: 'agent-1',
+ *   memory_type: 'fact',
+ *   content: 'User prefers concise responses',
+ *   importance: 7,
+ * });
+ *
+ * // Search memories
+ * const memories = await intelligenceClient.memory.search({
+ *   agent_id: 'agent-1',
+ *   query: 'user preference',
+ *   limit: 10,
+ * });
+ *
+ * // Convert to frontend format if needed
+ * const frontendMemories = memories.map(toFrontendMemory);
+ * ```
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+ 
+import {
+  intelligence,
+  type MemoryEntryInput,
+  type PersistentMemory,
+  type MemorySearchOptions as BackendSearchOptions,
+  type MemoryStats as BackendMemoryStats,
+  type HeartbeatConfig,
+  type HeartbeatResult,
+  type CompactableMessage,
+  type CompactionResult,
+  type CompactionCheck,
+  type CompactionConfig,
+  type MemoryEntryForAnalysis,
+  type PatternObservation,
+  type ImprovementSuggestion,
+  type ReflectionIdentityProposal,
+  type ReflectionResult,
+  type ReflectionState,
+  type ReflectionConfig,
+  type IdentityFiles,
+  type IdentityChangeProposal,
+  type IdentitySnapshot,
+} from './intelligence-backend';
+ 
+// === Environment Detection ===
+ 
+/**
+ * Check if running in Tauri environment
+ */
+export function isTauriEnv(): boolean {
+  return typeof window !== 'undefined' && '__TAURI__' in window;
+}
+ 
+// === Frontend Types (for backward compatibility) ===
+ 
+export type MemoryType = 'fact' | 'preference' | 'lesson' | 'context' | 'task';
+export type MemorySource = 'auto' | 'user' | 'reflection' | 'llm-reflection';
+ 
+export interface MemoryEntry {
+  id: string;
+  agentId: string;
+  content: string;
+  type: MemoryType;
+  importance: number;
+  source: MemorySource;
+  tags: string[];
+  createdAt: string;
+  lastAccessedAt: string;
+  accessCount: number;
+  conversationId?: string;
+}
+ 
+export interface MemorySearchOptions {
+  agentId?: string;
+  type?: MemoryType;
+  types?: MemoryType[];
+  tags?: string[];
+  query?: string;
+  limit?: number;
+  minImportance?: number;
+}
+ 
+export interface MemoryStats {
+  totalEntries: number;
+  byType: Record<string, number>;
+  byAgent: Record<string, number>;
+  oldestEntry: string | null;
+  newestEntry: string | null;
+  storageSizeBytes: number;
+}
+ 
+// === Re-export types from intelligence-backend ===
+ 
+export type {
+  HeartbeatConfig,
+  HeartbeatResult,
+  HeartbeatAlert,
+  CompactableMessage,
+  CompactionResult,
+  CompactionCheck,
+  CompactionConfig,
+  PatternObservation,
+  ImprovementSuggestion,
+  ReflectionResult,
+  ReflectionState,
+  ReflectionConfig,
+  ReflectionIdentityProposal,
+  IdentityFiles,
+  IdentityChangeProposal,
+  IdentitySnapshot,
+  MemoryEntryForAnalysis,
+} from './intelligence-backend';
+ 
+// === Mesh Types ===
+ 
+export interface BehaviorPattern {
+  id: string;
+  pattern_type: PatternTypeVariant;
+  frequency: number;
+  last_occurrence: string;
+  first_occurrence: string;
+  confidence: number;
+  context: PatternContext;
+}
+ 
+export function getPatternTypeString(patternType: PatternTypeVariant): string {
+  if (typeof patternType === 'string') {
+    return patternType;
+  }
+  return patternType.type;
+}
+ 
+export type PatternTypeVariant =
+  | { type: 'SkillCombination'; skill_ids: string[] }
+  | { type: 'TemporalTrigger'; hand_id: string; time_pattern: string }
+  | { type: 'TaskPipelineMapping'; task_type: string; pipeline_id: string }
+  | { type: 'InputPattern'; keywords: string[]; intent: string };
+ 
+export interface PatternContext {
+  skill_ids?: string[];
+  recent_topics?: string[];
+  intent?: string;
+  time_of_day?: number;
+  day_of_week?: number;
+}
+ 
+export interface WorkflowRecommendation {
+  id: string;
+  pipeline_id: string;
+  confidence: number;
+  reason: string;
+  suggested_inputs: Record<string, unknown>;
+  patterns_matched: string[];
+  timestamp: string;
+}
+ 
+export interface MeshConfig {
+  enabled: boolean;
+  min_confidence: number;
+  max_recommendations: number;
+  analysis_window_hours: number;
+}
+ 
+export interface MeshAnalysisResult {
+  recommendations: WorkflowRecommendation[];
+  patterns_detected: number;
+  timestamp: string;
+}
+ 
+export type ActivityType =
+  | { type: 'skill_used'; skill_ids: string[] }
+  | { type: 'pipeline_executed'; task_type: string; pipeline_id: string }
+  | { type: 'input_received'; keywords: string[]; intent: string };
+ 
+// === Persona Evolver Types ===
+ 
+export type EvolutionChangeType =
+  | 'instruction_addition'
+  | 'instruction_refinement'
+  | 'trait_addition'
+  | 'style_adjustment'
+  | 'domain_expansion';
+ 
+export type InsightCategory =
+  | 'communication_style'
+  | 'technical_expertise'
+  | 'task_efficiency'
+  | 'user_preference'
+  | 'knowledge_gap';
+ 
+export type IdentityFileType = 'soul' | 'instructions';
+export type ProposalStatus = 'pending' | 'approved' | 'rejected';
+ 
+export interface EvolutionProposal {
+  id: string;
+  agent_id: string;
+  target_file: IdentityFileType;
+  change_type: EvolutionChangeType;
+  reason: string;
+  current_content: string;
+  proposed_content: string;
+  confidence: number;
+  evidence: string[];
+  status: ProposalStatus;
+  created_at: string;
+}
+ 
+export interface ProfileUpdate {
+  section: string;
+  previous: string;
+  updated: string;
+  source: string;
+}
+ 
+export interface EvolutionInsight {
+  category: InsightCategory;
+  observation: string;
+  recommendation: string;
+  confidence: number;
+}
+ 
+export interface EvolutionResult {
+  agent_id: string;
+  timestamp: string;
+  profile_updates: ProfileUpdate[];
+  proposals: EvolutionProposal[];
+  insights: EvolutionInsight[];
+  evolved: boolean;
+}
+ 
+export interface PersonaEvolverConfig {
+  auto_profile_update: boolean;
+  min_preferences_for_update: number;
+  min_conversations_for_evolution: number;
+  enable_instruction_refinement: boolean;
+  enable_soul_evolution: boolean;
+  max_proposals_per_cycle: number;
+}
+ 
+export interface PersonaEvolverState {
+  last_evolution: string | null;
+  total_evolutions: number;
+  pending_proposals: number;
+  profile_enrichment_score: number;
+}
+ 
+// === Type Conversion Utilities ===
+ 
+/**
+ * Convert backend PersistentMemory to frontend MemoryEntry format
+ */
+export function toFrontendMemory(backend: PersistentMemory): MemoryEntry {
+  return {
+    id: backend.id,
+    agentId: backend.agent_id,
+    content: backend.content,
+    type: backend.memory_type as MemoryType,
+    importance: backend.importance,
+    source: backend.source as MemorySource,
+    tags: parseTags(backend.tags),
+    createdAt: backend.created_at,
+    lastAccessedAt: backend.last_accessed_at,
+    accessCount: backend.access_count,
+    conversationId: backend.conversation_id ?? undefined,
+  };
+}
+ 
+/**
+ * Convert frontend MemoryEntry to backend MemoryEntryInput format
+ */
+export function toBackendMemoryInput(entry: Omit<MemoryEntry, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount'>): MemoryEntryInput {
+  return {
+    agent_id: entry.agentId,
+    memory_type: entry.type,
+    content: entry.content,
+    importance: entry.importance,
+    source: entry.source,
+    tags: entry.tags,
+    conversation_id: entry.conversationId,
+  };
+}
+ 
+/**
+ * Convert frontend search options to backend format
+ */
+export function toBackendSearchOptions(options: MemorySearchOptions): BackendSearchOptions {
+  return {
+    agent_id: options.agentId,
+    memory_type: options.type,
+    tags: options.tags,
+    query: options.query,
+    limit: options.limit,
+    min_importance: options.minImportance,
+  };
+}
+ 
+/**
+ * Convert backend stats to frontend format
+ */
+export function toFrontendStats(backend: BackendMemoryStats): MemoryStats {
+  return {
+    totalEntries: backend.total_entries,
+    byType: backend.by_type,
+    byAgent: backend.by_agent,
+    oldestEntry: backend.oldest_entry,
+    newestEntry: backend.newest_entry,
+    storageSizeBytes: backend.storage_size_bytes ?? 0,
+  };
+}
+ 
+/**
+ * Parse tags from backend (JSON string or array)
+ */
+function parseTags(tags: string | string[]): string[] {
+  if (Array.isArray(tags)) return tags;
+  if (!tags) return [];
+  try {
+    return JSON.parse(tags);
+  } catch {
+    return [];
+  }
+}
+ 
+// === LocalStorage Fallback Implementation ===
+ 
+const FALLBACK_STORAGE_KEY = 'zclaw-intelligence-fallback';
+ 
+interface FallbackMemoryStore {
+  memories: MemoryEntry[];
+}
+ 
+function getFallbackStore(): FallbackMemoryStore {
+  try {
+    const stored = localStorage.getItem(FALLBACK_STORAGE_KEY);
+    if (stored) {
+      return JSON.parse(stored);
+    }
+  } catch {
+    // ignore
+  }
+  return { memories: [] };
+}
+ 
+function saveFallbackStore(store: FallbackMemoryStore): void {
+  try {
+    localStorage.setItem(FALLBACK_STORAGE_KEY, JSON.stringify(store));
+  } catch {
+    console.warn('[IntelligenceClient] Failed to save to localStorage');
+  }
+}
+ 
+// Fallback Memory API
+const fallbackMemory = {
+  async init(): Promise<void> {
+    // No-op for localStorage
+  },
+ 
+  async store(entry: MemoryEntryInput): Promise<string> {
+    const store = getFallbackStore();
+    const id = `mem_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
+    const now = new Date().toISOString();
+ 
+    const memory: MemoryEntry = {
+      id,
+      agentId: entry.agent_id,
+      content: entry.content,
+      type: entry.memory_type as MemoryType,
+      importance: entry.importance ?? 5,
+      source: (entry.source as MemorySource) ?? 'auto',
+      tags: entry.tags ?? [],
+      createdAt: now,
+      lastAccessedAt: now,
+      accessCount: 0,
+      conversationId: entry.conversation_id,
+    };
+ 
+    store.memories.push(memory);
+    saveFallbackStore(store);
+    return id;
+  },
+ 
+  async get(id: string): Promise<MemoryEntry | null> {
+    const store = getFallbackStore();
+    return store.memories.find(m => m.id === id) ?? null;
+  },
+ 
+  async search(options: MemorySearchOptions): Promise<MemoryEntry[]> {
+    const store = getFallbackStore();
+    let results = store.memories;
+ 
+    if (options.agentId) {
+      results = results.filter(m => m.agentId === options.agentId);
+    }
+    if (options.type) {
+      results = results.filter(m => m.type === options.type);
+    }
+    if (options.minImportance !== undefined) {
+      results = results.filter(m => m.importance >= options.minImportance!);
+    }
+    if (options.query) {
+      const queryLower = options.query.toLowerCase();
+      results = results.filter(m =>
+        m.content.toLowerCase().includes(queryLower) ||
+        m.tags.some(t => t.toLowerCase().includes(queryLower))
+      );
+    }
+    if (options.limit) {
+      results = results.slice(0, options.limit);
+    }
+ 
+    return results;
+  },
+ 
+  async delete(id: string): Promise<void> {
+    const store = getFallbackStore();
+    store.memories = store.memories.filter(m => m.id !== id);
+    saveFallbackStore(store);
+  },
+ 
+  async deleteAll(agentId: string): Promise<number> {
+    const store = getFallbackStore();
+    const before = store.memories.length;
+    store.memories = store.memories.filter(m => m.agentId !== agentId);
+    saveFallbackStore(store);
+    return before - store.memories.length;
+  },
+ 
+  async stats(): Promise<MemoryStats> {
+    const store = getFallbackStore();
+    const byType: Record<string, number> = {};
+    const byAgent: Record<string, number> = {};
+ 
+    for (const m of store.memories) {
+      byType[m.type] = (byType[m.type] ?? 0) + 1;
+      byAgent[m.agentId] = (byAgent[m.agentId] ?? 0) + 1;
+    }
+ 
+    const sorted = [...store.memories].sort((a, b) =>
+      new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()
+    );
+ 
+    // Estimate storage size from serialized data
+    let storageSizeBytes = 0;
+    try {
+      const serialized = JSON.stringify(store.memories);
+      storageSizeBytes = new Blob([serialized]).size;
+    } catch {
+      // Ignore serialization errors
+    }
+ 
+    return {
+      totalEntries: store.memories.length,
+      byType,
+      byAgent,
+      oldestEntry: sorted[0]?.createdAt ?? null,
+      newestEntry: sorted[sorted.length - 1]?.createdAt ?? null,
+      storageSizeBytes,
+    };
+  },
+ 
+  async export(): Promise<MemoryEntry[]> {
+    const store = getFallbackStore();
+    return store.memories;
+  },
+ 
+  async import(memories: MemoryEntry[]): Promise<number> {
+    const store = getFallbackStore();
+    store.memories.push(...memories);
+    saveFallbackStore(store);
+    return memories.length;
+  },
+ 
+  async dbPath(): Promise<string> {
+    return 'localStorage://zclaw-intelligence-fallback';
+  },
+};
+ 
+// Fallback Compactor API
+const fallbackCompactor = {
+  async estimateTokens(text: string): Promise<number> {
+    // Simple heuristic: ~4 chars per token for English, ~1.5 for CJK
+    const cjkChars = (text.match(/[\u4e00-\u9fff\u3040-\u30ff]/g) ?? []).length;
+    const otherChars = text.length - cjkChars;
+    return Math.ceil(cjkChars * 1.5 + otherChars / 4);
+  },
+ 
+  async estimateMessagesTokens(messages: CompactableMessage[]): Promise<number> {
+    let total = 0;
+    for (const m of messages) {
+      total += await fallbackCompactor.estimateTokens(m.content);
+    }
+    return total;
+  },
+ 
+  async checkThreshold(
+    messages: CompactableMessage[],
+    config?: CompactionConfig
+  ): Promise<CompactionCheck> {
+    const threshold = config?.soft_threshold_tokens ?? 15000;
+    const currentTokens = await fallbackCompactor.estimateMessagesTokens(messages);
+ 
+    return {
+      should_compact: currentTokens >= threshold,
+      current_tokens: currentTokens,
+      threshold,
+      urgency: currentTokens >= (config?.hard_threshold_tokens ?? 20000) ? 'hard' :
+               currentTokens >= threshold ? 'soft' : 'none',
+    };
+  },
+ 
+  async compact(
+    messages: CompactableMessage[],
+    _agentId: string,
+    _conversationId?: string,
+    config?: CompactionConfig
+  ): Promise<CompactionResult> {
+    // Simple rule-based compaction: keep last N messages
+    const keepRecent = config?.keep_recent_messages ?? 10;
+    const retained = messages.slice(-keepRecent);
+ 
+    return {
+      compacted_messages: retained,
+      summary: `[Compacted ${messages.length - retained.length} earlier messages]`,
+      original_count: messages.length,
+      retained_count: retained.length,
+      flushed_memories: 0,
+      tokens_before_compaction: await fallbackCompactor.estimateMessagesTokens(messages),
+      tokens_after_compaction: await fallbackCompactor.estimateMessagesTokens(retained),
+    };
+  },
+};
+ 
+// Fallback Reflection API
+const fallbackReflection = {
+  _conversationCount: 0,
+  _lastReflection: null as string | null,
+  _history: [] as ReflectionResult[],
+ 
+  async init(_config?: ReflectionConfig): Promise<void> {
+    // No-op
+  },
+ 
+  async recordConversation(): Promise<void> {
+    fallbackReflection._conversationCount++;
+  },
+ 
+  async shouldReflect(): Promise<boolean> {
+    return fallbackReflection._conversationCount >= 5;
+  },
+ 
+  async reflect(agentId: string, memories: MemoryEntryForAnalysis[]): Promise<ReflectionResult> {
+    fallbackReflection._conversationCount = 0;
+    fallbackReflection._lastReflection = new Date().toISOString();
+ 
+    // Analyze patterns (simple rule-based implementation)
+    const patterns: PatternObservation[] = [];
+    const improvements: ImprovementSuggestion[] = [];
+    const identityProposals: ReflectionIdentityProposal[] = [];
+ 
+    // Count memory types
+    const typeCounts: Record<string, number> = {};
+    for (const m of memories) {
+      typeCounts[m.memory_type] = (typeCounts[m.memory_type] || 0) + 1;
+    }
+ 
+    // Pattern: Too many tasks
+    const taskCount = typeCounts['task'] || 0;
+    if (taskCount >= 5) {
+      const taskMemories = memories.filter(m => m.memory_type === 'task').slice(0, 3);
+      patterns.push({
+        observation: `积累了 ${taskCount} 个待办任务,可能存在任务管理不善`,
+        frequency: taskCount,
+        sentiment: 'negative',
+        evidence: taskMemories.map(m => m.content),
+      });
+      improvements.push({
+        area: '任务管理',
+        suggestion: '清理已完成的任务记忆,对长期未处理的任务降低重要性',
+        priority: 'high',
+      });
+    }
+ 
+    // Pattern: Strong preference accumulation
+    const prefCount = typeCounts['preference'] || 0;
+    if (prefCount >= 5) {
+      const prefMemories = memories.filter(m => m.memory_type === 'preference').slice(0, 3);
+      patterns.push({
+        observation: `已记录 ${prefCount} 个用户偏好,对用户习惯有较好理解`,
+        frequency: prefCount,
+        sentiment: 'positive',
+        evidence: prefMemories.map(m => m.content),
+      });
+    }
+ 
+    // Pattern: Lessons learned
+    const lessonCount = typeCounts['lesson'] || 0;
+    if (lessonCount >= 5) {
+      patterns.push({
+        observation: `积累了 ${lessonCount} 条经验教训,知识库在成长`,
+        frequency: lessonCount,
+        sentiment: 'positive',
+        evidence: memories.filter(m => m.memory_type === 'lesson').slice(0, 3).map(m => m.content),
+      });
+    }
+ 
+    // Pattern: High-access important memories
+    const highAccessMemories = memories.filter(m => m.access_count >= 5 && m.importance >= 7);
+    if (highAccessMemories.length >= 3) {
+      patterns.push({
+        observation: `有 ${highAccessMemories.length} 条高频访问的重要记忆,核心知识正在形成`,
+        frequency: highAccessMemories.length,
+        sentiment: 'positive',
+        evidence: highAccessMemories.slice(0, 3).map(m => m.content),
+      });
+    }
+ 
+    // Pattern: Low importance memories accumulating
+    const lowImportanceCount = memories.filter(m => m.importance <= 3).length;
+    if (lowImportanceCount > 20) {
+      patterns.push({
+        observation: `有 ${lowImportanceCount} 条低重要性记忆,建议清理`,
+        frequency: lowImportanceCount,
+        sentiment: 'neutral',
+        evidence: [],
+      });
+      improvements.push({
+        area: '记忆管理',
+        suggestion: '执行记忆清理,移除30天以上未访问且重要性低于3的记忆',
+        priority: 'medium',
+      });
+    }
+ 
+    // Generate identity proposal if negative patterns exist
+    const negativePatterns = patterns.filter(p => p.sentiment === 'negative');
+    if (negativePatterns.length >= 2) {
+      const additions = negativePatterns.map(p => `- 注意: ${p.observation}`).join('\n');
+      identityProposals.push({
+        agent_id: agentId,
+        field: 'instructions',
+        current_value: '...',
+        proposed_value: `\n\n## 自我反思改进\n${additions}`,
+        reason: `基于 ${negativePatterns.length} 个负面模式观察,建议在指令中增加自我改进提醒`,
+      });
+    }
+ 
+    // Suggestion: User profile enrichment
+    if (prefCount < 3) {
+      improvements.push({
+        area: '用户理解',
+        suggestion: '主动在对话中了解用户偏好(沟通风格、技术栈、工作习惯),丰富用户画像',
+        priority: 'medium',
+      });
+    }
+ 
+    const result: ReflectionResult = {
+      patterns,
+      improvements,
+      identity_proposals: identityProposals,
+      new_memories: patterns.filter(p => p.frequency >= 3).length + improvements.filter(i => i.priority === 'high').length,
+      timestamp: new Date().toISOString(),
+    };
+ 
+    // Store in history
+    fallbackReflection._history.push(result);
+    if (fallbackReflection._history.length > 20) {
+      fallbackReflection._history = fallbackReflection._history.slice(-10);
+    }
+ 
+    return result;
+  },
+ 
+  async getHistory(limit?: number): Promise<ReflectionResult[]> {
+    const l = limit ?? 10;
+    return fallbackReflection._history.slice(-l).reverse();
+  },
+ 
+  async getState(): Promise<ReflectionState> {
+    return {
+      conversations_since_reflection: fallbackReflection._conversationCount,
+      last_reflection_time: fallbackReflection._lastReflection,
+      last_reflection_agent_id: null,
+    };
+  },
+};
+ 
+// Fallback Identity API with localStorage persistence
+const IDENTITY_STORAGE_KEY = 'zclaw-fallback-identities';
+const PROPOSALS_STORAGE_KEY = 'zclaw-fallback-proposals';
+const SNAPSHOTS_STORAGE_KEY = 'zclaw-fallback-snapshots';
+ 
+function loadIdentitiesFromStorage(): Map<string, IdentityFiles> {
+  try {
+    const stored = localStorage.getItem(IDENTITY_STORAGE_KEY);
+    if (stored) {
+      const parsed = JSON.parse(stored) as Record<string, IdentityFiles>;
+      return new Map(Object.entries(parsed));
+    }
+  } catch {
+    console.warn('[IntelligenceClient] Failed to load identities from localStorage');
+  }
+  return new Map();
+}
+ 
+function saveIdentitiesToStorage(identities: Map<string, IdentityFiles>): void {
+  try {
+    const obj = Object.fromEntries(identities);
+    localStorage.setItem(IDENTITY_STORAGE_KEY, JSON.stringify(obj));
+  } catch {
+    console.warn('[IntelligenceClient] Failed to save identities to localStorage');
+  }
+}
+ 
+function loadProposalsFromStorage(): IdentityChangeProposal[] {
+  try {
+    const stored = localStorage.getItem(PROPOSALS_STORAGE_KEY);
+    if (stored) {
+      return JSON.parse(stored) as IdentityChangeProposal[];
+    }
+  } catch {
+    console.warn('[IntelligenceClient] Failed to load proposals from localStorage');
+  }
+  return [];
+}
+ 
+function saveProposalsToStorage(proposals: IdentityChangeProposal[]): void {
+  try {
+    localStorage.setItem(PROPOSALS_STORAGE_KEY, JSON.stringify(proposals));
+  } catch {
+    console.warn('[IntelligenceClient] Failed to save proposals to localStorage');
+  }
+}
+ 
+function loadSnapshotsFromStorage(): IdentitySnapshot[] {
+  try {
+    const stored = localStorage.getItem(SNAPSHOTS_STORAGE_KEY);
+    if (stored) {
+      return JSON.parse(stored) as IdentitySnapshot[];
+    }
+  } catch {
+    console.warn('[IntelligenceClient] Failed to load snapshots from localStorage');
+  }
+  return [];
+}
+ 
+function saveSnapshotsToStorage(snapshots: IdentitySnapshot[]): void {
+  try {
+    localStorage.setItem(SNAPSHOTS_STORAGE_KEY, JSON.stringify(snapshots));
+  } catch {
+    console.warn('[IntelligenceClient] Failed to save snapshots to localStorage');
+  }
+}
+ 
+const fallbackIdentities = loadIdentitiesFromStorage();
+let fallbackProposals = loadProposalsFromStorage();
+let fallbackSnapshots = loadSnapshotsFromStorage();
+ 
+const fallbackIdentity = {
+  async get(agentId: string): Promise<IdentityFiles> {
+    if (!fallbackIdentities.has(agentId)) {
+      const defaults: IdentityFiles = {
+        soul: '# Agent Soul\n\nA helpful AI assistant.',
+        instructions: '# Instructions\n\nBe helpful and concise.',
+        user_profile: '# User Profile\n\nNo profile yet.',
+      };
+      fallbackIdentities.set(agentId, defaults);
+      saveIdentitiesToStorage(fallbackIdentities);
+    }
+    return fallbackIdentities.get(agentId)!;
+  },
+ 
+  async getFile(agentId: string, file: string): Promise<string> {
+    const files = await fallbackIdentity.get(agentId);
+    return files[file as keyof IdentityFiles] ?? '';
+  },
+ 
+  async buildPrompt(agentId: string, memoryContext?: string): Promise<string> {
+    const files = await fallbackIdentity.get(agentId);
+    let prompt = `${files.soul}\n\n## Instructions\n${files.instructions}\n\n## User Profile\n${files.user_profile}`;
+    if (memoryContext) {
+      prompt += `\n\n## Memory Context\n${memoryContext}`;
+    }
+    return prompt;
+  },
+ 
+  async updateUserProfile(agentId: string, content: string): Promise<void> {
+    const files = await fallbackIdentity.get(agentId);
+    files.user_profile = content;
+    fallbackIdentities.set(agentId, files);
+    saveIdentitiesToStorage(fallbackIdentities);
+  },
+ 
+  async appendUserProfile(agentId: string, addition: string): Promise<void> {
+    const files = await fallbackIdentity.get(agentId);
+    files.user_profile += `\n\n${addition}`;
+    fallbackIdentities.set(agentId, files);
+    saveIdentitiesToStorage(fallbackIdentities);
+  },
+ 
+  async proposeChange(
+    agentId: string,
+    file: 'soul' | 'instructions',
+    suggestedContent: string,
+    reason: string
+  ): Promise<IdentityChangeProposal> {
+    const files = await fallbackIdentity.get(agentId);
+    const proposal: IdentityChangeProposal = {
+      id: `prop_${Date.now()}`,
+      agent_id: agentId,
+      file,
+      reason,
+      current_content: files[file] ?? '',
+      suggested_content: suggestedContent,
+      status: 'pending',
+      created_at: new Date().toISOString(),
+    };
+    fallbackProposals.push(proposal);
+    saveProposalsToStorage(fallbackProposals);
+    return proposal;
+  },
+ 
+  async approveProposal(proposalId: string): Promise<IdentityFiles> {
+    const proposal = fallbackProposals.find(p => p.id === proposalId);
+    if (!proposal) throw new Error('Proposal not found');
+ 
+    const files = await fallbackIdentity.get(proposal.agent_id);
+ 
+    // Create snapshot before applying change
+    const snapshot: IdentitySnapshot = {
+      id: `snap_${Date.now()}`,
+      agent_id: proposal.agent_id,
+      files: { ...files },
+      timestamp: new Date().toISOString(),
+      reason: `Before applying: ${proposal.reason}`,
+    };
+    fallbackSnapshots.unshift(snapshot);
+    // Keep only last 20 snapshots per agent
+    const agentSnapshots = fallbackSnapshots.filter(s => s.agent_id === proposal.agent_id);
+    if (agentSnapshots.length > 20) {
+      const toRemove = agentSnapshots.slice(20);
+      fallbackSnapshots = fallbackSnapshots.filter(s => !toRemove.includes(s));
+    }
+    saveSnapshotsToStorage(fallbackSnapshots);
+ 
+    proposal.status = 'approved';
+    files[proposal.file] = proposal.suggested_content;
+    fallbackIdentities.set(proposal.agent_id, files);
+    saveIdentitiesToStorage(fallbackIdentities);
+    saveProposalsToStorage(fallbackProposals);
+    return files;
+  },
+ 
+  async rejectProposal(proposalId: string): Promise<void> {
+    const proposal = fallbackProposals.find(p => p.id === proposalId);
+    if (proposal) {
+      proposal.status = 'rejected';
+      saveProposalsToStorage(fallbackProposals);
+    }
+  },
+ 
+  async getPendingProposals(agentId?: string): Promise<IdentityChangeProposal[]> {
+    return fallbackProposals.filter(p =>
+      p.status === 'pending' && (!agentId || p.agent_id === agentId)
+    );
+  },
+ 
+  async updateFile(agentId: string, file: string, content: string): Promise<void> {
+    const files = await fallbackIdentity.get(agentId);
+    if (file in files) {
+      // IdentityFiles has known properties, update safely
+      const key = file as keyof IdentityFiles;
+      if (key in files) {
+        files[key] = content;
+        fallbackIdentities.set(agentId, files);
+        saveIdentitiesToStorage(fallbackIdentities);
+      }
+    }
+  },
+ 
+  async getSnapshots(agentId: string, limit?: number): Promise<IdentitySnapshot[]> {
+    const agentSnapshots = fallbackSnapshots.filter(s => s.agent_id === agentId);
+    return agentSnapshots.slice(0, limit ?? 10);
+  },
+ 
+  async restoreSnapshot(agentId: string, snapshotId: string): Promise<void> {
+    const snapshot = fallbackSnapshots.find(s => s.id === snapshotId && s.agent_id === agentId);
+    if (!snapshot) throw new Error('Snapshot not found');
+ 
+    // Create a snapshot of current state before restore
+    const currentFiles = await fallbackIdentity.get(agentId);
+    const beforeRestoreSnapshot: IdentitySnapshot = {
+      id: `snap_${Date.now()}`,
+      agent_id: agentId,
+      files: { ...currentFiles },
+      timestamp: new Date().toISOString(),
+      reason: 'Auto-backup before restore',
+    };
+    fallbackSnapshots.unshift(beforeRestoreSnapshot);
+    saveSnapshotsToStorage(fallbackSnapshots);
+ 
+    // Restore the snapshot
+    fallbackIdentities.set(agentId, { ...snapshot.files });
+    saveIdentitiesToStorage(fallbackIdentities);
+  },
+ 
+  async listAgents(): Promise<string[]> {
+    return Array.from(fallbackIdentities.keys());
+  },
+ 
+  async deleteAgent(agentId: string): Promise<void> {
+    fallbackIdentities.delete(agentId);
+  },
+};
+ 
+// Fallback Heartbeat API
+const fallbackHeartbeat = {
+  _configs: new Map<string, HeartbeatConfig>(),
+ 
+  async init(agentId: string, config?: HeartbeatConfig): Promise<void> {
+    if (config) {
+      fallbackHeartbeat._configs.set(agentId, config);
+    }
+  },
+ 
+  async start(_agentId: string): Promise<void> {
+    // No-op for fallback (no background tasks in browser)
+  },
+ 
+  async stop(_agentId: string): Promise<void> {
+    // No-op
+  },
+ 
+  async tick(_agentId: string): Promise<HeartbeatResult> {
+    return {
+      status: 'ok',
+      alerts: [],
+      checked_items: 0,
+      timestamp: new Date().toISOString(),
+    };
+  },
+ 
+  async getConfig(agentId: string): Promise<HeartbeatConfig> {
+    return fallbackHeartbeat._configs.get(agentId) ?? {
+      enabled: false,
+      interval_minutes: 30,
+      quiet_hours_start: null,
+      quiet_hours_end: null,
+      notify_channel: 'ui',
+      proactivity_level: 'standard',
+      max_alerts_per_tick: 5,
+    };
+  },
+ 
+  async updateConfig(agentId: string, config: HeartbeatConfig): Promise<void> {
+    fallbackHeartbeat._configs.set(agentId, config);
+  },
+ 
+  async getHistory(_agentId: string, _limit?: number): Promise<HeartbeatResult[]> {
+    return [];
+  },
+};
+ 
+// === Unified Client Export ===
+ 
+/**
+ * Unified intelligence client that automatically selects backend or fallback
+ */
+export const intelligenceClient = {
+  memory: {
+    init: async (): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.memory.init();
+      } else {
+        await fallbackMemory.init();
+      }
+    },
+ 
+    store: async (entry: MemoryEntryInput): Promise<string> => {
+      if (isTauriEnv()) {
+        return intelligence.memory.store(entry);
+      }
+      return fallbackMemory.store(entry);
+    },
+ 
+    get: async (id: string): Promise<MemoryEntry | null> => {
+      if (isTauriEnv()) {
+        const result = await intelligence.memory.get(id);
+        return result ? toFrontendMemory(result) : null;
+      }
+      return fallbackMemory.get(id);
+    },
+ 
+    search: async (options: MemorySearchOptions): Promise<MemoryEntry[]> => {
+      if (isTauriEnv()) {
+        const results = await intelligence.memory.search(toBackendSearchOptions(options));
+        return results.map(toFrontendMemory);
+      }
+      return fallbackMemory.search(options);
+    },
+ 
+    delete: async (id: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.memory.delete(id);
+      } else {
+        await fallbackMemory.delete(id);
+      }
+    },
+ 
+    deleteAll: async (agentId: string): Promise<number> => {
+      if (isTauriEnv()) {
+        return intelligence.memory.deleteAll(agentId);
+      }
+      return fallbackMemory.deleteAll(agentId);
+    },
+ 
+    stats: async (): Promise<MemoryStats> => {
+      if (isTauriEnv()) {
+        const stats = await intelligence.memory.stats();
+        return toFrontendStats(stats);
+      }
+      return fallbackMemory.stats();
+    },
+ 
+    export: async (): Promise<MemoryEntry[]> => {
+      if (isTauriEnv()) {
+        const results = await intelligence.memory.export();
+        return results.map(toFrontendMemory);
+      }
+      return fallbackMemory.export();
+    },
+ 
+    import: async (memories: MemoryEntry[]): Promise<number> => {
+      if (isTauriEnv()) {
+        // Convert to backend format
+        const backendMemories = memories.map(m => ({
+          ...m,
+          agent_id: m.agentId,
+          memory_type: m.type,
+          last_accessed_at: m.lastAccessedAt,
+          created_at: m.createdAt,
+          access_count: m.accessCount,
+          conversation_id: m.conversationId ?? null,
+          tags: JSON.stringify(m.tags),
+          embedding: null,
+        }));
+        return intelligence.memory.import(backendMemories as PersistentMemory[]);
+      }
+      return fallbackMemory.import(memories);
+    },
+ 
+    dbPath: async (): Promise<string> => {
+      if (isTauriEnv()) {
+        return intelligence.memory.dbPath();
+      }
+      return fallbackMemory.dbPath();
+    },
+  },
+ 
+  heartbeat: {
+    init: async (agentId: string, config?: HeartbeatConfig): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.heartbeat.init(agentId, config);
+      } else {
+        await fallbackHeartbeat.init(agentId, config);
+      }
+    },
+ 
+    start: async (agentId: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.heartbeat.start(agentId);
+      } else {
+        await fallbackHeartbeat.start(agentId);
+      }
+    },
+ 
+    stop: async (agentId: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.heartbeat.stop(agentId);
+      } else {
+        await fallbackHeartbeat.stop(agentId);
+      }
+    },
+ 
+    tick: async (agentId: string): Promise<HeartbeatResult> => {
+      if (isTauriEnv()) {
+        return intelligence.heartbeat.tick(agentId);
+      }
+      return fallbackHeartbeat.tick(agentId);
+    },
+ 
+    getConfig: async (agentId: string): Promise<HeartbeatConfig> => {
+      if (isTauriEnv()) {
+        return intelligence.heartbeat.getConfig(agentId);
+      }
+      return fallbackHeartbeat.getConfig(agentId);
+    },
+ 
+    updateConfig: async (agentId: string, config: HeartbeatConfig): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.heartbeat.updateConfig(agentId, config);
+      } else {
+        await fallbackHeartbeat.updateConfig(agentId, config);
+      }
+    },
+ 
+    getHistory: async (agentId: string, limit?: number): Promise<HeartbeatResult[]> => {
+      if (isTauriEnv()) {
+        return intelligence.heartbeat.getHistory(agentId, limit);
+      }
+      return fallbackHeartbeat.getHistory(agentId, limit);
+    },
+ 
+    updateMemoryStats: async (
+      agentId: string,
+      taskCount: number,
+      totalEntries: number,
+      storageSizeBytes: number
+    ): Promise<void> => {
+      if (isTauriEnv()) {
+        await invoke('heartbeat_update_memory_stats', {
+          agent_id: agentId,
+          task_count: taskCount,
+          total_entries: totalEntries,
+          storage_size_bytes: storageSizeBytes,
+        });
+      }
+      // Fallback: store in localStorage for non-Tauri environment
+      const cache = {
+        taskCount,
+        totalEntries,
+        storageSizeBytes,
+        lastUpdated: new Date().toISOString(),
+      };
+      localStorage.setItem(`zclaw-memory-stats-${agentId}`, JSON.stringify(cache));
+    },
+ 
+    recordCorrection: async (agentId: string, correctionType: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await invoke('heartbeat_record_correction', {
+          agent_id: agentId,
+          correction_type: correctionType,
+        });
+      }
+      // Fallback: store in localStorage for non-Tauri environment
+      const key = `zclaw-corrections-${agentId}`;
+      const stored = localStorage.getItem(key);
+      const counters = stored ? JSON.parse(stored) : {};
+      counters[correctionType] = (counters[correctionType] || 0) + 1;
+      localStorage.setItem(key, JSON.stringify(counters));
+    },
+ 
+    recordInteraction: async (agentId: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await invoke('heartbeat_record_interaction', {
+          agent_id: agentId,
+        });
+      }
+      // Fallback: store in localStorage for non-Tauri environment
+      localStorage.setItem(`zclaw-last-interaction-${agentId}`, new Date().toISOString());
+    },
+  },
+ 
+  compactor: {
+    estimateTokens: async (text: string): Promise<number> => {
+      if (isTauriEnv()) {
+        return intelligence.compactor.estimateTokens(text);
+      }
+      return fallbackCompactor.estimateTokens(text);
+    },
+ 
+    estimateMessagesTokens: async (messages: CompactableMessage[]): Promise<number> => {
+      if (isTauriEnv()) {
+        return intelligence.compactor.estimateMessagesTokens(messages);
+      }
+      return fallbackCompactor.estimateMessagesTokens(messages);
+    },
+ 
+    checkThreshold: async (
+      messages: CompactableMessage[],
+      config?: CompactionConfig
+    ): Promise<CompactionCheck> => {
+      if (isTauriEnv()) {
+        return intelligence.compactor.checkThreshold(messages, config);
+      }
+      return fallbackCompactor.checkThreshold(messages, config);
+    },
+ 
+    compact: async (
+      messages: CompactableMessage[],
+      agentId: string,
+      conversationId?: string,
+      config?: CompactionConfig
+    ): Promise<CompactionResult> => {
+      if (isTauriEnv()) {
+        return intelligence.compactor.compact(messages, agentId, conversationId, config);
+      }
+      return fallbackCompactor.compact(messages, agentId, conversationId, config);
+    },
+  },
+ 
+  reflection: {
+    init: async (config?: ReflectionConfig): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.reflection.init(config);
+      } else {
+        await fallbackReflection.init(config);
+      }
+    },
+ 
+    recordConversation: async (): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.reflection.recordConversation();
+      } else {
+        await fallbackReflection.recordConversation();
+      }
+    },
+ 
+    shouldReflect: async (): Promise<boolean> => {
+      if (isTauriEnv()) {
+        return intelligence.reflection.shouldReflect();
+      }
+      return fallbackReflection.shouldReflect();
+    },
+ 
+    reflect: async (agentId: string, memories: MemoryEntryForAnalysis[]): Promise<ReflectionResult> => {
+      if (isTauriEnv()) {
+        return intelligence.reflection.reflect(agentId, memories);
+      }
+      return fallbackReflection.reflect(agentId, memories);
+    },
+ 
+    getHistory: async (limit?: number): Promise<ReflectionResult[]> => {
+      if (isTauriEnv()) {
+        return intelligence.reflection.getHistory(limit);
+      }
+      return fallbackReflection.getHistory(limit);
+    },
+ 
+    getState: async (): Promise<ReflectionState> => {
+      if (isTauriEnv()) {
+        return intelligence.reflection.getState();
+      }
+      return fallbackReflection.getState();
+    },
+  },
+ 
+  identity: {
+    get: async (agentId: string): Promise<IdentityFiles> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.get(agentId);
+      }
+      return fallbackIdentity.get(agentId);
+    },
+ 
+    getFile: async (agentId: string, file: string): Promise<string> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.getFile(agentId, file);
+      }
+      return fallbackIdentity.getFile(agentId, file);
+    },
+ 
+    buildPrompt: async (agentId: string, memoryContext?: string): Promise<string> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.buildPrompt(agentId, memoryContext);
+      }
+      return fallbackIdentity.buildPrompt(agentId, memoryContext);
+    },
+ 
+    updateUserProfile: async (agentId: string, content: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.identity.updateUserProfile(agentId, content);
+      } else {
+        await fallbackIdentity.updateUserProfile(agentId, content);
+      }
+    },
+ 
+    appendUserProfile: async (agentId: string, addition: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.identity.appendUserProfile(agentId, addition);
+      } else {
+        await fallbackIdentity.appendUserProfile(agentId, addition);
+      }
+    },
+ 
+    proposeChange: async (
+      agentId: string,
+      file: 'soul' | 'instructions',
+      suggestedContent: string,
+      reason: string
+    ): Promise<IdentityChangeProposal> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.proposeChange(agentId, file, suggestedContent, reason);
+      }
+      return fallbackIdentity.proposeChange(agentId, file, suggestedContent, reason);
+    },
+ 
+    approveProposal: async (proposalId: string): Promise<IdentityFiles> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.approveProposal(proposalId);
+      }
+      return fallbackIdentity.approveProposal(proposalId);
+    },
+ 
+    rejectProposal: async (proposalId: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.identity.rejectProposal(proposalId);
+      } else {
+        await fallbackIdentity.rejectProposal(proposalId);
+      }
+    },
+ 
+    getPendingProposals: async (agentId?: string): Promise<IdentityChangeProposal[]> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.getPendingProposals(agentId);
+      }
+      return fallbackIdentity.getPendingProposals(agentId);
+    },
+ 
+    updateFile: async (agentId: string, file: string, content: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.identity.updateFile(agentId, file, content);
+      } else {
+        await fallbackIdentity.updateFile(agentId, file, content);
+      }
+    },
+ 
+    getSnapshots: async (agentId: string, limit?: number): Promise<IdentitySnapshot[]> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.getSnapshots(agentId, limit);
+      }
+      return fallbackIdentity.getSnapshots(agentId, limit);
+    },
+ 
+    restoreSnapshot: async (agentId: string, snapshotId: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.identity.restoreSnapshot(agentId, snapshotId);
+      } else {
+        await fallbackIdentity.restoreSnapshot(agentId, snapshotId);
+      }
+    },
+ 
+    listAgents: async (): Promise<string[]> => {
+      if (isTauriEnv()) {
+        return intelligence.identity.listAgents();
+      }
+      return fallbackIdentity.listAgents();
+    },
+ 
+    deleteAgent: async (agentId: string): Promise<void> => {
+      if (isTauriEnv()) {
+        await intelligence.identity.deleteAgent(agentId);
+      } else {
+        await fallbackIdentity.deleteAgent(agentId);
+      }
+    },
+  },
+};
+ 
+export default intelligenceClient;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/json-utils.ts.html b/desktop/coverage/src/lib/json-utils.ts.html new file mode 100644 index 0000000..b0de2a5 --- /dev/null +++ b/desktop/coverage/src/lib/json-utils.ts.html @@ -0,0 +1,604 @@ + + + + + + Code coverage report for src/lib/json-utils.ts + + + + + + + + + +
+
+

All files / src/lib json-utils.ts

+
+ +
+ 0% + Statements + 0/64 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/64 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Safe JSON Parsing Utilities
+ *
+ * Provides try-catch protected JSON parsing with optional default values
+ * and context-aware error messages.
+ *
+ * Usage:
+ * - safeJsonParse: Returns result object with success/failure status
+ * - parseJsonOrDefault: Returns parsed value or default on failure
+ * - parseJsonOrThrow: Returns parsed value or throws friendly error
+ */
+ 
+export interface SafeJsonParseResult<T> {
+  success: boolean;
+  data?: T;
+  error?: string;
+}
+ 
+/**
+ * Safely parse a JSON string with error handling
+ *
+ * @param text - The JSON string to parse
+ * @param defaultValue - Optional default value to return on parse failure
+ * @returns Result object with success status, data, and optional error message
+ *
+ * @example
+ * const result = safeJsonParse<UserData>(jsonString);
+ * if (result.success) {
+ *   console.log(result.data);
+ * } else {
+ *   console.error(result.error);
+ * }
+ */
+export function safeJsonParse<T>(text: string, defaultValue?: T): SafeJsonParseResult<T> {
+  try {
+    const data = JSON.parse(text) as T;
+    return { success: true, data };
+  } catch (error) {
+    const errorMessage = error instanceof Error ? error.message : 'Unknown JSON parse error';
+    // Log truncated input for debugging
+    const truncatedInput = text.length > 100 ? `${text.substring(0, 100)}...` : text;
+    console.warn('[json-utils] Parse failed:', errorMessage, 'Input:', truncatedInput);
+    return {
+      success: false,
+      error: errorMessage,
+      data: defaultValue,
+    };
+  }
+}
+ 
+/**
+ * Safely parse JSON and return default value on failure
+ *
+ * Use this when you have a sensible default and don't need to know
+ * about parse failures.
+ *
+ * @param text - The JSON string to parse
+ * @param defaultValue - The value to return if parsing fails
+ * @returns The parsed data or the default value
+ *
+ * @example
+ * const config = parseJsonOrDefault(rawConfig, defaultConfig);
+ */
+export function parseJsonOrDefault<T>(text: string, defaultValue: T): T {
+  const result = safeJsonParse<T>(text, defaultValue);
+  return result.data!;
+}
+ 
+/**
+ * Safely parse JSON or throw a friendly error with context
+ *
+ * Use this when JSON parsing is required and failures should halt execution
+ * with a clear error message.
+ *
+ * @param text - The JSON string to parse
+ * @param context - Optional context for the error message (e.g., "loading config")
+ * @returns The parsed data
+ * @throws Error with context-aware message if parsing fails
+ *
+ * @example
+ * try {
+ *   const data = parseJsonOrThrow<UserConfig>(rawJson, 'parsing user config');
+ * } catch (error) {
+ *   showToast(error.message); // "JSON parse failed (parsing user config): Unexpected token..."
+ * }
+ */
+export function parseJsonOrThrow<T>(text: string, context?: string): T {
+  const result = safeJsonParse<T>(text);
+  if (!result.success) {
+    throw new Error(`JSON parse failed${context ? ` (${context})` : ''}: ${result.error}`);
+  }
+  return result.data!;
+}
+ 
+/**
+ * Type guard to check if a value is a valid JSON-compatible object
+ *
+ * @param value - The value to check
+ * @returns True if the value can be safely serialized to JSON
+ */
+export function isJsonSerializable(value: unknown): boolean {
+  try {
+    JSON.stringify(value);
+    return true;
+  } catch {
+    return false;
+  }
+}
+ 
+/**
+ * Safely stringify a value to JSON
+ *
+ * @param value - The value to stringify
+ * @param fallback - Fallback string if stringification fails
+ * @returns JSON string or fallback
+ */
+export function safeJsonStringify(value: unknown, fallback = '{}'): string {
+  try {
+    return JSON.stringify(value);
+  } catch (error) {
+    const errorMessage = error instanceof Error ? error.message : 'Unknown stringify error';
+    console.warn('[json-utils] Stringify failed:', errorMessage);
+    return fallback;
+  }
+}
+ 
+/**
+ * Safely stringify with pretty formatting
+ *
+ * @param value - The value to stringify
+ * @param indent - Number of spaces for indentation (default: 2)
+ * @param fallback - Fallback string if stringification fails
+ * @returns Formatted JSON string or fallback
+ */
+export function safeJsonStringifyPretty(value: unknown, indent = 2, fallback = '{}'): string {
+  try {
+    return JSON.stringify(value, null, indent);
+  } catch (error) {
+    const errorMessage = error instanceof Error ? error.message : 'Unknown stringify error';
+    console.warn('[json-utils] Pretty stringify failed:', errorMessage);
+    return fallback;
+  }
+}
+ 
+/**
+ * Deep clone an object using JSON serialization
+ *
+ * Note: This only works for JSON-serializable data (no functions, undefined, symbols, etc.)
+ *
+ * @param value - The value to clone
+ * @returns A deep clone of the value
+ * @throws Error if the value cannot be serialized
+ */
+export function deepClone<T>(value: T): T {
+  return JSON.parse(JSON.stringify(value)) as T;
+}
+ 
+/**
+ * Safely deep clone an object with fallback
+ *
+ * @param value - The value to clone
+ * @param fallback - Fallback value if cloning fails
+ * @returns A deep clone of the value or the fallback
+ */
+export function safeDeepClone<T>(value: T, fallback: T): T {
+  try {
+    return JSON.parse(JSON.stringify(value)) as T;
+  } catch (error) {
+    const errorMessage = error instanceof Error ? error.message : 'Unknown clone error';
+    console.warn('[json-utils] Deep clone failed:', errorMessage);
+    return fallback;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/kernel-client.ts.html b/desktop/coverage/src/lib/kernel-client.ts.html new file mode 100644 index 0000000..1bb5805 --- /dev/null +++ b/desktop/coverage/src/lib/kernel-client.ts.html @@ -0,0 +1,3328 @@ + + + + + + Code coverage report for src/lib/kernel-client.ts + + + + + + + + + +
+
+

All files / src/lib kernel-client.ts

+
+ +
+ 12.71% + Statements + 59/464 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/55 +
+ + +
+ 12.71% + Lines + 59/464 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +10821x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  + 
/**
+ * ZCLAW Kernel Client (Tauri Internal)
+ *
+ * Client for communicating with the internal ZCLAW Kernel via Tauri commands.
+ * This replaces the external OpenFang Gateway WebSocket connection.
+ *
+ * Phase 5 of Intelligence Layer Migration.
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+import { listen, type UnlistenFn } from '@tauri-apps/api/event';
+ 
+// Re-export UnlistenFn for external use
+export type { UnlistenFn };
+ 
+// === Types ===
+ 
+export type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
+ 
+export interface KernelStatus {
+  initialized: boolean;
+  agentCount: number;
+  databaseUrl: string | null;
+  defaultProvider: string | null;
+  defaultModel: string | null;
+}
+ 
+export interface AgentInfo {
+  id: string;
+  name: string;
+  description?: string;
+  state: string;
+  model?: string;
+  provider?: string;
+}
+ 
+export interface CreateAgentRequest {
+  name: string;
+  description?: string;
+  systemPrompt?: string;
+  provider?: string;
+  model?: string;
+  maxTokens?: number;
+  temperature?: number;
+}
+ 
+export interface CreateAgentResponse {
+  id: string;
+  name: string;
+  state: string;
+}
+ 
+export interface ChatResponse {
+  content: string;
+  inputTokens: number;
+  outputTokens: number;
+}
+ 
+export interface EventCallback {
+  (payload: unknown): void;
+}
+ 
+export interface StreamCallbacks {
+  onDelta: (delta: string) => void;
+  onTool?: (tool: string, input: string, output: string) => void;
+  onHand?: (name: string, status: string, result?: unknown) => void;
+  onComplete: (inputTokens?: number, outputTokens?: number) => void;
+  onError: (error: string) => void;
+}
+ 
+// === Streaming Types (match Rust StreamChatEvent) ===
+ 
+export interface StreamEventDelta {
+  type: 'delta';
+  delta: string;
+}
+ 
+export interface StreamEventToolStart {
+  type: 'tool_start';
+  name: string;
+  input: unknown;
+}
+ 
+export interface StreamEventToolEnd {
+  type: 'tool_end';
+  name: string;
+  output: unknown;
+}
+ 
+export interface StreamEventIterationStart {
+  type: 'iteration_start';
+  iteration: number;
+  maxIterations: number;
+}
+ 
+export interface StreamEventComplete {
+  type: 'complete';
+  inputTokens: number;
+  outputTokens: number;
+}
+ 
+export interface StreamEventError {
+  type: 'error';
+  message: string;
+}
+ 
+export type StreamChatEvent =
+  | StreamEventDelta
+  | StreamEventToolStart
+  | StreamEventToolEnd
+  | StreamEventIterationStart
+  | StreamEventComplete
+  | StreamEventError;
+ 
+export interface StreamChunkPayload {
+  sessionId: string;
+  event: StreamChatEvent;
+}
+ 
+export interface KernelConfig {
+  provider?: string;
+  model?: string;
+  apiKey?: string;
+  baseUrl?: string;
+  apiProtocol?: string;  // openai, anthropic, custom
+}
+ 
+/**
+ * Check if running in Tauri environment
+ * NOTE: This checks synchronously. For more reliable detection,
+ * use probeTauriAvailability() which actually tries to call a Tauri command.
+ */
+export function isTauriRuntime(): boolean {
+  const result = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;
+  console.log('[kernel-client] isTauriRuntime() check:', result, 'window exists:', typeof window !== 'undefined', '__TAURI_INTERNALS__ exists:', typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window);
+  return result;
+}
+ 
+/**
+ * Probe if Tauri is actually available by trying to invoke a command.
+ * This is more reliable than checking __TAURI_INTERNALS__ which may not be set
+ * immediately when the page loads.
+ */
+let _tauriAvailable: boolean | null = null;
+ 
+export async function probeTauriAvailability(): Promise<boolean> {
+  if (_tauriAvailable !== null) {
+    return _tauriAvailable;
+  }
+ 
+  // First check if window.__TAURI_INTERNALS__ exists
+  if (typeof window === 'undefined' || !('__TAURI_INTERNALS__' in window)) {
+    console.log('[kernel-client] probeTauriAvailability: __TAURI_INTERNALS__ not found');
+    _tauriAvailable = false;
+    return false;
+  }
+ 
+  // Try to actually invoke a simple command to verify Tauri is working
+  try {
+    // Use a minimal invoke to test - we just check if invoke works
+    await invoke('plugin:tinker|ping');
+    console.log('[kernel-client] probeTauriAvailability: Tauri plugin ping succeeded');
+    _tauriAvailable = true;
+    return true;
+  } catch {
+    // Try without plugin prefix - some Tauri versions don't use it
+    try {
+      // Just checking if invoke function exists is enough
+      console.log('[kernel-client] probeTauriAvailability: Tauri invoke available');
+      _tauriAvailable = true;
+      return true;
+    } catch {
+      console.log('[kernel-client] probeTauriAvailability: Tauri invoke failed');
+      _tauriAvailable = false;
+      return false;
+    }
+  }
+}
+ 
+/**
+ * ZCLAW Kernel Client
+ *
+ * Provides a GatewayClient-compatible interface that uses Tauri commands
+ * to communicate with the internal ZCLAW Kernel instead of external WebSocket.
+ */
+export class KernelClient {
+  private state: ConnectionState = 'disconnected';
+  private eventListeners = new Map<string, Set<EventCallback>>();
+  private kernelStatus: KernelStatus | null = null;
+  private defaultAgentId: string = '';
+  private config: KernelConfig = {};
+ 
+  // State change callbacks
+  onStateChange?: (state: ConnectionState) => void;
+  onLog?: (level: string, message: string) => void;
+ 
+  constructor(opts?: {
+    url?: string;
+    token?: string;
+    autoReconnect?: boolean;
+    reconnectInterval?: number;
+    requestTimeout?: number;
+    kernelConfig?: KernelConfig;
+  }) {
+    // Store kernel config if provided
+    if (opts?.kernelConfig) {
+      this.config = opts.kernelConfig;
+    }
+  }
+ 
+  updateOptions(opts?: {
+    url?: string;
+    token?: string;
+    autoReconnect?: boolean;
+    reconnectInterval?: number;
+    requestTimeout?: number;
+    kernelConfig?: KernelConfig;
+  }): void {
+    if (opts?.kernelConfig) {
+      this.config = opts.kernelConfig;
+    }
+  }
+ 
+  /**
+   * Set kernel configuration (must be called before connect)
+   */
+  setConfig(config: KernelConfig): void {
+    this.config = config;
+  }
+ 
+  getState(): ConnectionState {
+    return this.state;
+  }
+ 
+  /**
+   * Initialize and connect to the internal Kernel
+   */
+  async connect(): Promise<void> {
+    // Always try to (re)initialize - backend will handle config changes
+    // by rebooting the kernel if needed
+    this.setState('connecting');
+ 
+    try {
+      // Validate that we have required config
+      if (!this.config.provider || !this.config.model || !this.config.apiKey) {
+        throw new Error('请先在"模型与 API"设置页面配置模型');
+      }
+ 
+      // Initialize the kernel via Tauri command with config
+      const configRequest = {
+        provider: this.config.provider,
+        model: this.config.model,
+        apiKey: this.config.apiKey,
+        baseUrl: this.config.baseUrl || null,
+        apiProtocol: this.config.apiProtocol || 'openai',
+      };
+ 
+      console.log('[KernelClient] Initializing with config:', {
+        provider: configRequest.provider,
+        model: configRequest.model,
+        hasApiKey: !!configRequest.apiKey,
+        baseUrl: configRequest.baseUrl,
+        apiProtocol: configRequest.apiProtocol,
+      });
+ 
+      const status = await invoke<KernelStatus>('kernel_init', {
+        configRequest,
+      });
+      this.kernelStatus = status;
+ 
+      // Get or create default agent using the configured model
+      const agents = await this.listAgents();
+      if (agents.length > 0) {
+        this.defaultAgentId = agents[0].id;
+      } else {
+        // Create a default agent with the user's configured model
+        // For Coding Plan providers, add a coding-focused system prompt
+        const isCodingPlan = this.config.provider?.includes('coding') ||
+          this.config.baseUrl?.includes('coding.dashscope');
+ 
+        const systemPrompt = isCodingPlan
+          ? '你是一个专业的编程助手。你可以帮助用户解决编程问题、写代码、调试、解释技术概念等。请用中文回答问题。'
+          : '你是 ZCLAW 智能助手,可以帮助用户解决各种问题。请用中文回答。';
+ 
+        const agent = await this.createAgent({
+          name: 'Default Agent',
+          description: 'ZCLAW default assistant',
+          systemPrompt,
+          provider: this.config.provider,
+          model: this.config.model,
+        });
+        this.defaultAgentId = agent.id;
+      }
+ 
+      this.setState('connected');
+      this.emitEvent('connected', { version: '0.2.0-internal' });
+      this.log('info', 'Connected to internal ZCLAW Kernel');
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      this.setState('disconnected');
+      this.log('error', `Failed to initialize kernel: ${errorMessage}`);
+      throw new Error(`Failed to initialize kernel: ${errorMessage}`);
+    }
+  }
+ 
+  /**
+   * Connect using REST API (compatibility with GatewayClient)
+   */
+  async connectRest(): Promise<void> {
+    return this.connect();
+  }
+ 
+  /**
+   * Disconnect from kernel (no-op for internal kernel)
+   */
+  disconnect(): void {
+    this.setState('disconnected');
+    this.kernelStatus = null;
+    this.log('info', 'Disconnected from internal kernel');
+  }
+ 
+  // === Agent Management ===
+ 
+  /**
+   * List all agents
+   */
+  async listAgents(): Promise<AgentInfo[]> {
+    return invoke<AgentInfo[]>('agent_list');
+  }
+ 
+  /**
+   * Get agent by ID
+   */
+  async getAgent(agentId: string): Promise<AgentInfo | null> {
+    return invoke<AgentInfo | null>('agent_get', { agentId });
+  }
+ 
+  /**
+   * Create a new agent
+   */
+  async createAgent(request: CreateAgentRequest): Promise<CreateAgentResponse> {
+    return invoke<CreateAgentResponse>('agent_create', {
+      request: {
+        name: request.name,
+        description: request.description,
+        systemPrompt: request.systemPrompt,
+        provider: request.provider || 'anthropic',
+        model: request.model || 'claude-sonnet-4-20250514',
+        maxTokens: request.maxTokens || 4096,
+        temperature: request.temperature || 0.7,
+      },
+    });
+  }
+ 
+  /**
+   * Delete an agent
+   */
+  async deleteAgent(agentId: string): Promise<void> {
+    return invoke('agent_delete', { agentId });
+  }
+ 
+  // === Chat ===
+ 
+  /**
+   * Send a message and get a response
+   */
+  async chat(
+    message: string,
+    opts?: {
+      sessionKey?: string;
+      agentId?: string;
+    }
+  ): Promise<{ runId: string; sessionId?: string; response?: string }> {
+    const agentId = opts?.agentId || this.defaultAgentId;
+ 
+    if (!agentId) {
+      throw new Error('No agent available');
+    }
+ 
+    const response = await invoke<ChatResponse>('agent_chat', {
+      request: {
+        agentId,
+        message,
+      },
+    });
+ 
+    return {
+      runId: `run_${Date.now()}`,
+      sessionId: opts?.sessionKey,
+      response: response.content,
+    };
+  }
+ 
+  /**
+   * Send a message with streaming response via Tauri events
+   */
+  async chatStream(
+    message: string,
+    callbacks: StreamCallbacks,
+    opts?: {
+      sessionKey?: string;
+      agentId?: string;
+    }
+  ): Promise<{ runId: string }> {
+    const runId = `run_${Date.now()}`;
+    const sessionId = opts?.sessionKey || runId;
+    const agentId = opts?.agentId || this.defaultAgentId;
+ 
+    if (!agentId) {
+      callbacks.onError('No agent available');
+      return { runId };
+    }
+ 
+    let unlisten: UnlistenFn | null = null;
+ 
+    try {
+      // Set up event listener for stream chunks
+      unlisten = await listen<StreamChunkPayload>('stream:chunk', (event) => {
+        const payload = event.payload;
+ 
+        // Only process events for this session
+        if (payload.sessionId !== sessionId) {
+          return;
+        }
+ 
+        const streamEvent = payload.event;
+ 
+        switch (streamEvent.type) {
+          case 'delta':
+            callbacks.onDelta(streamEvent.delta);
+            break;
+ 
+          case 'tool_start':
+            console.log('[KernelClient] Tool started:', streamEvent.name, streamEvent.input);
+            if (callbacks.onTool) {
+              callbacks.onTool(
+                streamEvent.name,
+                JSON.stringify(streamEvent.input),
+                ''
+              );
+            }
+            break;
+ 
+          case 'tool_end':
+            console.log('[KernelClient] Tool ended:', streamEvent.name, streamEvent.output);
+            if (callbacks.onTool) {
+              callbacks.onTool(
+                streamEvent.name,
+                '',
+                JSON.stringify(streamEvent.output)
+              );
+            }
+            break;
+ 
+          case 'iteration_start':
+            console.log('[KernelClient] Iteration started:', streamEvent.iteration, '/', streamEvent.maxIterations);
+            // Don't need to notify user about iterations
+            break;
+ 
+          case 'complete':
+            console.log('[KernelClient] Stream complete:', streamEvent.inputTokens, streamEvent.outputTokens);
+            callbacks.onComplete(streamEvent.inputTokens, streamEvent.outputTokens);
+            // Clean up listener
+            if (unlisten) {
+              unlisten();
+              unlisten = null;
+            }
+            break;
+ 
+          case 'error':
+            console.error('[KernelClient] Stream error:', streamEvent.message);
+            callbacks.onError(streamEvent.message);
+            // Clean up listener
+            if (unlisten) {
+              unlisten();
+              unlisten = null;
+            }
+            break;
+        }
+      });
+ 
+      // Invoke the streaming command
+      await invoke('agent_chat_stream', {
+        request: {
+          agentId,
+          sessionId,
+          message,
+        },
+      });
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      callbacks.onError(errorMessage);
+ 
+      // Clean up listener on error
+      if (unlisten) {
+        unlisten();
+      }
+    }
+ 
+    return { runId };
+  }
+ 
+  /**
+   * Cancel a stream (no-op for internal kernel)
+   */
+  cancelStream(_runId: string): void {
+    // No-op: internal kernel doesn't support stream cancellation
+  }
+ 
+  // === Default Agent ===
+ 
+  /**
+   * Fetch default agent ID (returns current default)
+   */
+  async fetchDefaultAgentId(): Promise<string | null> {
+    return this.defaultAgentId;
+  }
+ 
+  /**
+   * Set default agent ID
+   */
+  setDefaultAgentId(agentId: string): void {
+    this.defaultAgentId = agentId;
+  }
+ 
+  /**
+   * Get default agent ID
+   */
+  getDefaultAgentId(): string {
+    return this.defaultAgentId;
+  }
+ 
+  // === GatewayClient Compatibility ===
+ 
+  /**
+   * Health check
+   */
+  async health(): Promise<{ status: string; version?: string }> {
+    if (this.kernelStatus?.initialized) {
+      return { status: 'ok', version: '0.2.0-internal' };
+    }
+    return { status: 'not_initialized' };
+  }
+ 
+  /**
+   * Get status
+   */
+  async status(): Promise<Record<string, unknown>> {
+    const status = await invoke<KernelStatus>('kernel_status');
+    return {
+      initialized: status.initialized,
+      agentCount: status.agentCount,
+      defaultProvider: status.defaultProvider,
+      defaultModel: status.defaultModel,
+    };
+  }
+ 
+  // === Hands API ===
+ 
+  /**
+   * List all available hands
+   */
+  async listHands(): Promise<{
+    hands: {
+      id?: string;
+      name: string;
+      description?: string;
+      status?: string;
+      requirements_met?: boolean;
+      category?: string;
+      icon?: string;
+      tool_count?: number;
+      tools?: string[];
+      metric_count?: number;
+      metrics?: string[];
+    }[]
+  }> {
+    const hands = await invoke<Array<{
+      id?: string;
+      name: string;
+      description?: string;
+      status?: string;
+      requirements_met?: boolean;
+      category?: string;
+      icon?: string;
+      tool_count?: number;
+      tools?: string[];
+      metric_count?: number;
+      metrics?: string[];
+    }>>('hand_list');
+    return { hands: hands || [] };
+  }
+ 
+  /**
+   * Get hand details
+   */
+  async getHand(name: string): Promise<{
+    id?: string;
+    name?: string;
+    description?: string;
+    status?: string;
+    requirements_met?: boolean;
+    category?: string;
+    icon?: string;
+    provider?: string;
+    model?: string;
+    requirements?: { description?: string; name?: string; met?: boolean; satisfied?: boolean; details?: string; hint?: string }[];
+    tools?: string[];
+    metrics?: string[];
+    config?: Record<string, unknown>;
+    tool_count?: number;
+    metric_count?: number;
+  }> {
+    return invoke('hand_get', { name });
+  }
+ 
+  /**
+   * Trigger/execute a hand
+   */
+  async triggerHand(name: string, params?: Record<string, unknown>): Promise<{ runId: string; status: string }> {
+    const result = await invoke<{ instance_id: string; status: string }>('hand_execute', {
+      id: name,
+      input: params || {},
+    });
+    return { runId: result.instance_id, status: result.status };
+  }
+ 
+  /**
+   * Get hand run status
+   */
+  async getHandStatus(name: string, runId: string): Promise<{ status: string; result?: unknown }> {
+    return invoke('hand_run_status', { handName: name, runId });
+  }
+ 
+  /**
+   * Approve a hand execution
+   */
+  async approveHand(name: string, runId: string, approved: boolean, reason?: string): Promise<{ status: string }> {
+    return invoke('hand_approve', { handName: name, runId, approved, reason });
+  }
+ 
+  /**
+   * Cancel a hand execution
+   */
+  async cancelHand(name: string, runId: string): Promise<{ status: string }> {
+    return invoke('hand_cancel', { handName: name, runId });
+  }
+ 
+  /**
+   * List hand runs (execution history)
+   */
+  async listHandRuns(name: string, opts?: { limit?: number; offset?: number }): Promise<{
+    runs: {
+      runId?: string;
+      run_id?: string;
+      id?: string;
+      status?: string;
+      startedAt?: string;
+      started_at?: string;
+      completedAt?: string;
+      completed_at?: string;
+      result?: unknown;
+      error?: string;
+    }[]
+  }> {
+    // Hand run history API may not exist yet, return empty array
+    try {
+      return await invoke('hand_run_list', { handName: name, ...opts });
+    } catch {
+      return { runs: [] };
+    }
+  }
+ 
+  // === Skills API ===
+ 
+  /**
+   * List all discovered skills
+   */
+  async listSkills(): Promise<{
+    skills: {
+      id: string;
+      name: string;
+      description: string;
+      version: string;
+      capabilities: string[];
+      tags: string[];
+      mode: string;
+      enabled: boolean;
+      triggers: string[];
+      category?: string;
+    }[]
+  }> {
+    const skills = await invoke<Array<{
+      id: string;
+      name: string;
+      description: string;
+      version: string;
+      capabilities: string[];
+      tags: string[];
+      mode: string;
+      enabled: boolean;
+      triggers: string[];
+      category?: string;
+    }>>('skill_list');
+    return { skills: skills || [] };
+  }
+ 
+  /**
+   * Refresh skills from directory
+   */
+  async refreshSkills(skillDir?: string): Promise<{
+    skills: {
+      id: string;
+      name: string;
+      description: string;
+      version: string;
+      capabilities: string[];
+      tags: string[];
+      mode: string;
+      enabled: boolean;
+      triggers: string[];
+      category?: string;
+    }[]
+  }> {
+    const skills = await invoke<Array<{
+      id: string;
+      name: string;
+      description: string;
+      version: string;
+      capabilities: string[];
+      tags: string[];
+      mode: string;
+      enabled: boolean;
+      triggers: string[];
+      category?: string;
+    }>>('skill_refresh', { skillDir: skillDir || null });
+    return { skills: skills || [] };
+  }
+ 
+  /**
+   * Execute a skill
+   */
+  async executeSkill(id: string, input?: Record<string, unknown>): Promise<{
+    success: boolean;
+    output?: unknown;
+    error?: string;
+    durationMs?: number;
+  }> {
+    return invoke('skill_execute', {
+      id,
+      context: {},
+      input: input || {},
+    });
+  }
+ 
+  // === Triggers API ===
+ 
+  /**
+   * List all triggers
+   * Returns empty array on error for graceful degradation
+   */
+  async listTriggers(): Promise<{
+    triggers?: Array<{
+      id: string;
+      name: string;
+      handId: string;
+      triggerType: string;
+      enabled: boolean;
+      createdAt: string;
+      modifiedAt: string;
+      description?: string;
+      tags: string[];
+    }>
+  }> {
+    try {
+      const triggers = await invoke<Array<{
+        id: string;
+        name: string;
+        handId: string;
+        triggerType: string;
+        enabled: boolean;
+        createdAt: string;
+        modifiedAt: string;
+        description?: string;
+        tags: string[];
+      }>>('trigger_list');
+      return { triggers };
+    } catch (error) {
+      this.log('error', `[TriggersAPI] listTriggers failed: ${this.formatError(error)}`);
+      return { triggers: [] };
+    }
+  }
+ 
+  /**
+   * Get a single trigger by ID
+   * Returns null on error for graceful degradation
+   */
+  async getTrigger(id: string): Promise<{
+    id: string;
+    name: string;
+    handId: string;
+    triggerType: string;
+    enabled: boolean;
+    createdAt: string;
+    modifiedAt: string;
+    description?: string;
+    tags: string[];
+  } | null> {
+    try {
+      return await invoke<{
+        id: string;
+        name: string;
+        handId: string;
+        triggerType: string;
+        enabled: boolean;
+        createdAt: string;
+        modifiedAt: string;
+        description?: string;
+        tags: string[];
+      } | null>('trigger_get', { id });
+    } catch (error) {
+      this.log('error', `[TriggersAPI] getTrigger(${id}) failed: ${this.formatError(error)}`);
+      return null;
+    }
+  }
+ 
+  /**
+   * Create a new trigger
+   * Returns null on error for graceful degradation
+   */
+  async createTrigger(trigger: {
+    id: string;
+    name: string;
+    handId: string;
+    triggerType: { type: string; cron?: string; pattern?: string; path?: string; secret?: string; events?: string[] };
+    enabled?: boolean;
+    description?: string;
+    tags?: string[];
+  }): Promise<{
+    id: string;
+    name: string;
+    handId: string;
+    triggerType: string;
+    enabled: boolean;
+    createdAt: string;
+    modifiedAt: string;
+    description?: string;
+    tags: string[];
+  } | null> {
+    try {
+      return await invoke<{
+        id: string;
+        name: string;
+        handId: string;
+        triggerType: string;
+        enabled: boolean;
+        createdAt: string;
+        modifiedAt: string;
+        description?: string;
+        tags: string[];
+      }>('trigger_create', { request: trigger });
+    } catch (error) {
+      this.log('error', `[TriggersAPI] createTrigger(${trigger.id}) failed: ${this.formatError(error)}`);
+      return null;
+    }
+  }
+ 
+  /**
+   * Update an existing trigger
+   * Throws on error as this is a mutation operation that callers need to handle
+   */
+  async updateTrigger(id: string, updates: {
+    name?: string;
+    enabled?: boolean;
+    handId?: string;
+    triggerType?: { type: string; cron?: string; pattern?: string; path?: string; secret?: string; events?: string[] };
+  }): Promise<{
+    id: string;
+    name: string;
+    handId: string;
+    triggerType: string;
+    enabled: boolean;
+    createdAt: string;
+    modifiedAt: string;
+    description?: string;
+    tags: string[];
+  }> {
+    try {
+      return await invoke<{
+        id: string;
+        name: string;
+        handId: string;
+        triggerType: string;
+        enabled: boolean;
+        createdAt: string;
+        modifiedAt: string;
+        description?: string;
+        tags: string[];
+      }>('trigger_update', { id, updates });
+    } catch (error) {
+      this.log('error', `[TriggersAPI] updateTrigger(${id}) failed: ${this.formatError(error)}`);
+      throw error;
+    }
+  }
+ 
+  /**
+   * Delete a trigger
+   * Throws on error as this is a destructive operation that callers need to handle
+   */
+  async deleteTrigger(id: string): Promise<void> {
+    try {
+      await invoke('trigger_delete', { id });
+    } catch (error) {
+      this.log('error', `[TriggersAPI] deleteTrigger(${id}) failed: ${this.formatError(error)}`);
+      throw error;
+    }
+  }
+ 
+  /**
+   * Execute a trigger
+   * Throws on error as callers need to know if execution failed
+   */
+  async executeTrigger(id: string, input?: Record<string, unknown>): Promise<Record<string, unknown>> {
+    try {
+      return await invoke<Record<string, unknown>>('trigger_execute', { id, input: input || {} });
+    } catch (error) {
+      this.log('error', `[TriggersAPI] executeTrigger(${id}) failed: ${this.formatError(error)}`);
+      throw error;
+    }
+  }
+ 
+  // === Approvals API ===
+ 
+  async listApprovals(_status?: string): Promise<{
+    approvals: Array<{
+      id: string;
+      handId: string;
+      status: string;
+      createdAt: string;
+      input: Record<string, unknown>;
+    }>
+  }> {
+    try {
+      const approvals = await invoke<Array<{
+        id: string;
+        handId: string;
+        status: string;
+        createdAt: string;
+        input: Record<string, unknown>;
+      }>>('approval_list');
+      return { approvals };
+    } catch (error) {
+      console.error('[kernel-client] listApprovals error:', error);
+      return { approvals: [] };
+    }
+  }
+ 
+  async respondToApproval(approvalId: string, approved: boolean, reason?: string): Promise<void> {
+    return invoke('approval_respond', { id: approvalId, approved, reason });
+  }
+ 
+  /**
+   * REST API compatibility methods
+   */
+  public getRestBaseUrl(): string {
+    return ''; // Internal kernel doesn't use REST
+  }
+ 
+  public async restGet<T>(_path: string): Promise<T> {
+    throw new Error('REST API not available for internal kernel');
+  }
+ 
+  public async restPost<T>(_path: string, _body?: unknown): Promise<T> {
+    throw new Error('REST API not available for internal kernel');
+  }
+ 
+  public async restPut<T>(_path: string, _body?: unknown): Promise<T> {
+    throw new Error('REST API not available for internal kernel');
+  }
+ 
+  public async restDelete<T>(_path: string): Promise<T> {
+    throw new Error('REST API not available for internal kernel');
+  }
+ 
+  public async restPatch<T>(_path: string, _body?: unknown): Promise<T> {
+    throw new Error('REST API not available for internal kernel');
+  }
+ 
+  // === Events ===
+ 
+  /**
+   * Subscribe to events
+   */
+  on(event: string, callback: EventCallback): () => void {
+    if (!this.eventListeners.has(event)) {
+      this.eventListeners.set(event, new Set());
+    }
+    this.eventListeners.get(event)!.add(callback);
+ 
+    return () => {
+      this.eventListeners.get(event)?.delete(callback);
+    };
+  }
+ 
+  /**
+   * Subscribe to agent stream events (GatewayClient compatibility)
+   * Note: KernelClient handles streaming via chatStream callbacks directly,
+   * so this is a no-op that returns an empty unsubscribe function.
+   */
+  onAgentStream(_callback: (delta: { stream: 'assistant' | 'tool' | 'lifecycle' | 'hand' | 'workflow'; delta?: string; content?: string; runId?: string }) => void): () => void {
+    // KernelClient uses chatStream callbacks for streaming, not a separate event stream
+    // Return empty unsubscribe for compatibility
+    return () => {};
+  }
+ 
+  /**
+   * Verify audit log chain (GatewayClient compatibility)
+   * Note: Not implemented for internal kernel
+   */
+  async verifyAuditLogChain(): Promise<{ valid: boolean; chain_depth?: number; root_hash?: string; broken_at_index?: number }> {
+    return { valid: false, chain_depth: 0, root_hash: '' };
+  }
+ 
+  // === Internal ===
+ 
+  private setState(state: ConnectionState): void {
+    this.state = state;
+    this.onStateChange?.(state);
+    this.emitEvent('state', state);
+  }
+ 
+  private emitEvent(event: string, payload: unknown): void {
+    const listeners = this.eventListeners.get(event);
+    if (listeners) {
+      for (const cb of listeners) {
+        try {
+          cb(payload);
+        } catch {
+          /* ignore listener errors */
+        }
+      }
+    }
+  }
+ 
+  private log(level: string, message: string): void {
+    this.onLog?.(level, message);
+  }
+ 
+  /**
+   * Format error for consistent logging
+   */
+  private formatError(error: unknown): string {
+    if (error instanceof Error) {
+      return error.message;
+    }
+    return String(error);
+  }
+}
+ 
+// === Singleton ===
+ 
+let _client: KernelClient | null = null;
+ 
+/**
+ * Get the kernel client singleton
+ */
+export function getKernelClient(opts?: ConstructorParameters<typeof KernelClient>[0]): KernelClient {
+  if (!_client) {
+    _client = new KernelClient(opts);
+  } else if (opts) {
+    _client.updateOptions(opts);
+  }
+  return _client;
+}
+ 
+/**
+ * Check if internal kernel mode is available
+ */
+export function isInternalKernelAvailable(): boolean {
+  return isTauriRuntime();
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/llm-service.ts.html b/desktop/coverage/src/lib/llm-service.ts.html new file mode 100644 index 0000000..1e7dbf2 --- /dev/null +++ b/desktop/coverage/src/lib/llm-service.ts.html @@ -0,0 +1,1843 @@ + + + + + + Code coverage report for src/lib/llm-service.ts + + + + + + + + + +
+
+

All files / src/lib llm-service.ts

+
+ +
+ 0% + Statements + 0/373 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/373 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * LLM Service Adapter - Unified LLM interface for L4 self-evolution engines
+ *
+ * Provides a unified interface for:
+ * - ReflectionEngine: Semantic analysis + deep reflection
+ * - ContextCompactor: High-quality summarization
+ * - MemoryExtractor: Semantic importance scoring
+ *
+ * Supports multiple backends:
+ * - OpenAI (GPT-4, GPT-3.5)
+ * - Volcengine (Doubao)
+ * - OpenFang Gateway (passthrough)
+ *
+ * Part of ZCLAW L4 Self-Evolution capability.
+ */
+ 
+import { DEFAULT_MODEL_ID, DEFAULT_OPENAI_BASE_URL } from '../constants/models';
+ 
+// === Types ===
+ 
+export type LLMProvider = 'openai' | 'volcengine' | 'gateway' | 'mock';
+ 
+export interface LLMConfig {
+  provider: LLMProvider;
+  model?: string;
+  apiKey?: string;
+  apiBase?: string;
+  maxTokens?: number;
+  temperature?: number;
+  timeout?: number;
+}
+ 
+export interface LLMMessage {
+  role: 'system' | 'user' | 'assistant';
+  content: string;
+}
+ 
+export interface LLMResponse {
+  content: string;
+  tokensUsed?: {
+    input: number;
+    output: number;
+  };
+  model?: string;
+  latencyMs?: number;
+}
+ 
+export interface LLMServiceAdapter {
+  complete(messages: LLMMessage[], options?: Partial<LLMConfig>): Promise<LLMResponse>;
+  isAvailable(): boolean;
+  getProvider(): LLMProvider;
+}
+ 
+// === Default Configs ===
+ 
+const DEFAULT_CONFIGS: Record<LLMProvider, LLMConfig> = {
+  openai: {
+    provider: 'openai',
+    model: DEFAULT_MODEL_ID,
+    apiBase: DEFAULT_OPENAI_BASE_URL,
+    maxTokens: 2000,
+    temperature: 0.7,
+    timeout: 30000,
+  },
+  volcengine: {
+    provider: 'volcengine',
+    model: 'doubao-pro-32k',
+    apiBase: 'https://ark.cn-beijing.volces.com/api/v3',
+    maxTokens: 2000,
+    temperature: 0.7,
+    timeout: 30000,
+  },
+  gateway: {
+    provider: 'gateway',
+    apiBase: '/api/llm',
+    maxTokens: 2000,
+    temperature: 0.7,
+    timeout: 60000,
+  },
+  mock: {
+    provider: 'mock',
+    maxTokens: 100,
+    temperature: 0,
+    timeout: 100,
+  },
+};
+ 
+// === Storage ===
+ 
+const LLM_CONFIG_KEY = 'zclaw-llm-config';
+ 
+// === Mock Adapter (for testing) ===
+ 
+class MockLLMAdapter implements LLMServiceAdapter {
+  constructor(_config: LLMConfig) {
+    // Config is stored for future use (e.g., custom mock behavior based on config)
+  }
+ 
+  async complete(messages: LLMMessage[]): Promise<LLMResponse> {
+    // Simulate latency
+    await new Promise((resolve) => setTimeout(resolve, 50));
+ 
+    const lastMessage = messages[messages.length - 1];
+    const content = lastMessage?.content || '';
+ 
+    // Generate mock response based on content type
+    let response = '[Mock LLM Response] ';
+ 
+    if (content.includes('reflect') || content.includes('反思')) {
+      response += JSON.stringify({
+        patterns: [
+          {
+            observation: '用户经常询问代码优化相关问题',
+            frequency: 5,
+            sentiment: 'positive',
+            evidence: ['多次讨论性能优化', '关注代码质量'],
+          },
+        ],
+        improvements: [
+          {
+            area: '代码解释',
+            suggestion: '可以提供更详细的代码注释',
+            priority: 'medium',
+          },
+        ],
+        identityProposals: [],
+      });
+    } else if (content.includes('summarize') || content.includes('摘要')) {
+      response += '这是一个关于对话内容的摘要,包含了主要讨论的要点和结论。';
+    } else if (content.includes('importance') || content.includes('重要性')) {
+      response += JSON.stringify({
+        memories: [
+          { content: '用户偏好简洁的回答', importance: 7, type: 'preference' },
+        ],
+      });
+    } else {
+      response += 'Processed: ' + content.slice(0, 50);
+    }
+ 
+    return {
+      content: response,
+      tokensUsed: { input: content.length / 4, output: response.length / 4 },
+      model: 'mock-model',
+      latencyMs: 50,
+    };
+  }
+ 
+  isAvailable(): boolean {
+    return true;
+  }
+ 
+  getProvider(): LLMProvider {
+    return 'mock';
+  }
+}
+ 
+// === OpenAI Adapter ===
+ 
+class OpenAILLMAdapter implements LLMServiceAdapter {
+  private config: LLMConfig;
+ 
+  constructor(config: LLMConfig) {
+    this.config = { ...DEFAULT_CONFIGS.openai, ...config };
+  }
+ 
+  async complete(messages: LLMMessage[], options?: Partial<LLMConfig>): Promise<LLMResponse> {
+    const config = { ...this.config, ...options };
+    const startTime = Date.now();
+ 
+    if (!config.apiKey) {
+      throw new Error('[OpenAI] API key not configured');
+    }
+ 
+    const response = await fetch(`${config.apiBase}/chat/completions`, {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+        Authorization: `Bearer ${config.apiKey}`,
+      },
+      body: JSON.stringify({
+        model: config.model,
+        messages,
+        max_tokens: config.maxTokens,
+        temperature: config.temperature,
+      }),
+      signal: AbortSignal.timeout(config.timeout || 30000),
+    });
+ 
+    if (!response.ok) {
+      const errorBody = await response.text();
+      // Log full error in development only
+      if (import.meta.env.DEV) {
+        console.error('[OpenAI] API error:', errorBody);
+      }
+      // Return sanitized error to caller
+      throw new Error(`[OpenAI] API error: ${response.status} - Request failed`);
+    }
+ 
+    const data = await response.json();
+    const latencyMs = Date.now() - startTime;
+ 
+    return {
+      content: data.choices[0]?.message?.content || '',
+      tokensUsed: {
+        input: data.usage?.prompt_tokens || 0,
+        output: data.usage?.completion_tokens || 0,
+      },
+      model: data.model,
+      latencyMs,
+    };
+  }
+ 
+  isAvailable(): boolean {
+    return !!this.config.apiKey;
+  }
+ 
+  getProvider(): LLMProvider {
+    return 'openai';
+  }
+}
+ 
+// === Volcengine Adapter ===
+ 
+class VolcengineLLMAdapter implements LLMServiceAdapter {
+  private config: LLMConfig;
+ 
+  constructor(config: LLMConfig) {
+    this.config = { ...DEFAULT_CONFIGS.volcengine, ...config };
+  }
+ 
+  async complete(messages: LLMMessage[], options?: Partial<LLMConfig>): Promise<LLMResponse> {
+    const config = { ...this.config, ...options };
+    const startTime = Date.now();
+ 
+    if (!config.apiKey) {
+      throw new Error('[Volcengine] API key not configured');
+    }
+ 
+    const response = await fetch(`${config.apiBase}/chat/completions`, {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+        Authorization: `Bearer ${config.apiKey}`,
+      },
+      body: JSON.stringify({
+        model: config.model,
+        messages,
+        max_tokens: config.maxTokens,
+        temperature: config.temperature,
+      }),
+      signal: AbortSignal.timeout(config.timeout || 30000),
+    });
+ 
+    if (!response.ok) {
+      const errorBody = await response.text();
+      // Log full error in development only
+      if (import.meta.env.DEV) {
+        console.error('[Volcengine] API error:', errorBody);
+      }
+      // Return sanitized error to caller
+      throw new Error(`[Volcengine] API error: ${response.status} - Request failed`);
+    }
+ 
+    const data = await response.json();
+    const latencyMs = Date.now() - startTime;
+ 
+    return {
+      content: data.choices[0]?.message?.content || '',
+      tokensUsed: {
+        input: data.usage?.prompt_tokens || 0,
+        output: data.usage?.completion_tokens || 0,
+      },
+      model: data.model,
+      latencyMs,
+    };
+  }
+ 
+  isAvailable(): boolean {
+    return !!this.config.apiKey;
+  }
+ 
+  getProvider(): LLMProvider {
+    return 'volcengine';
+  }
+}
+ 
+// === Gateway Adapter (pass through to OpenFang or internal Kernel) ===
+ 
+class GatewayLLMAdapter implements LLMServiceAdapter {
+  private config: LLMConfig;
+ 
+  constructor(config: LLMConfig) {
+    this.config = { ...DEFAULT_CONFIGS.gateway, ...config };
+  }
+ 
+  async complete(messages: LLMMessage[], options?: Partial<LLMConfig>): Promise<LLMResponse> {
+    const config = { ...this.config, ...options };
+    const startTime = Date.now();
+ 
+    // Build a single prompt from messages
+    const systemMessage = messages.find(m => m.role === 'system')?.content || '';
+    const userMessage = messages.find(m => m.role === 'user')?.content || '';
+ 
+    // Combine system and user messages into a single prompt
+    const fullPrompt = systemMessage
+      ? `${systemMessage}\n\n${userMessage}`
+      : userMessage;
+ 
+    // Check if running in Tauri with internal kernel
+    // Use the same detection as kernel-client.ts
+    const isTauri = typeof window !== 'undefined' &&
+      '__TAURI_INTERNALS__' in window;
+ 
+    if (isTauri) {
+      // Use internal Kernel via Tauri invoke
+      try {
+        const { invoke } = await import('@tauri-apps/api/core');
+ 
+        // Get the default agent ID from connectionStore or use the first agent
+        const agentId = localStorage.getItem('zclaw-default-agent-id');
+ 
+        const response = await invoke<{ content: string; input_tokens: number; output_tokens: number }>('agent_chat', {
+          request: {
+            agentId: agentId || null,  // null will use default agent
+            message: fullPrompt,
+          },
+        });
+ 
+        const latencyMs = Date.now() - startTime;
+        return {
+          content: response.content || '',
+          tokensUsed: {
+            input: response.input_tokens || 0,
+            output: response.output_tokens || 0,
+          },
+          latencyMs,
+        };
+      } catch (err) {
+        console.warn('[LLMService] Kernel chat failed, falling back to mock:', err);
+        // Return empty response instead of throwing
+        return {
+          content: '',
+          tokensUsed: { input: 0, output: 0 },
+          latencyMs: Date.now() - startTime,
+        };
+      }
+    }
+ 
+    // External Gateway mode: Use OpenFang's chat endpoint
+    const agentId = localStorage.getItem('zclaw-default-agent-id') || 'default';
+ 
+    const response = await fetch(`/api/agents/${agentId}/message`, {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      body: JSON.stringify({
+        message: fullPrompt,
+        max_tokens: config.maxTokens,
+        temperature: config.temperature ?? 0.3, // Lower temperature for extraction tasks
+      }),
+      signal: AbortSignal.timeout(config.timeout || 60000),
+    });
+ 
+    if (!response.ok) {
+      const error = await response.text();
+      // If agent not found, try without agent ID (direct /api/chat)
+      if (response.status === 404) {
+        const fallbackResponse = await fetch('/api/chat', {
+          method: 'POST',
+          headers: { 'Content-Type': 'application/json' },
+          body: JSON.stringify({
+            message: fullPrompt,
+            max_tokens: config.maxTokens,
+            temperature: config.temperature ?? 0.3,
+          }),
+          signal: AbortSignal.timeout(config.timeout || 60000),
+        });
+ 
+        if (!fallbackResponse.ok) {
+          throw new Error(`[Gateway] Both endpoints failed: ${fallbackResponse.status}`);
+        }
+ 
+        const data = await fallbackResponse.json();
+        const latencyMs = Date.now() - startTime;
+        return {
+          content: data.response || data.content || '',
+          tokensUsed: { input: data.input_tokens || 0, output: data.output_tokens || 0 },
+          latencyMs,
+        };
+      }
+      throw new Error(`[Gateway] API error: ${response.status} - ${error}`);
+    }
+ 
+    const data = await response.json();
+    const latencyMs = Date.now() - startTime;
+ 
+    return {
+      content: data.response || data.content || '',
+      tokensUsed: { input: data.input_tokens || 0, output: data.output_tokens || 0 },
+      latencyMs,
+    };
+  }
+ 
+  isAvailable(): boolean {
+    // Gateway is available if we're in browser (can connect to OpenFang)
+    return typeof window !== 'undefined';
+  }
+ 
+  getProvider(): LLMProvider {
+    return 'gateway';
+  }
+}
+ 
+// === Factory ===
+ 
+let cachedAdapter: LLMServiceAdapter | null = null;
+ 
+export function createLLMAdapter(config?: Partial<LLMConfig>): LLMServiceAdapter {
+  const savedConfig = loadConfig();
+  const finalConfig = { ...savedConfig, ...config };
+ 
+  switch (finalConfig.provider) {
+    case 'openai':
+      return new OpenAILLMAdapter(finalConfig);
+    case 'volcengine':
+      return new VolcengineLLMAdapter(finalConfig);
+    case 'gateway':
+      return new GatewayLLMAdapter(finalConfig);
+    case 'mock':
+    default:
+      return new MockLLMAdapter(finalConfig);
+  }
+}
+ 
+export function getLLMAdapter(): LLMServiceAdapter {
+  if (!cachedAdapter) {
+    cachedAdapter = createLLMAdapter();
+  }
+  return cachedAdapter;
+}
+ 
+export function resetLLMAdapter(): void {
+  cachedAdapter = null;
+}
+ 
+// === Config Management ===
+ 
+export function loadConfig(): LLMConfig {
+  if (typeof window === 'undefined') {
+    return DEFAULT_CONFIGS.mock;
+  }
+ 
+  try {
+    const saved = localStorage.getItem(LLM_CONFIG_KEY);
+    if (saved) {
+      return JSON.parse(saved);
+    }
+  } catch {
+    // Ignore parse errors
+  }
+ 
+  // Default to gateway (OpenFang passthrough) for L4 self-evolution
+  return DEFAULT_CONFIGS.gateway;
+}
+ 
+export function saveConfig(config: LLMConfig): void {
+  if (typeof window === 'undefined') return;
+ 
+  // Don't save API key to localStorage for security
+  const safeConfig = { ...config };
+  delete safeConfig.apiKey;
+ 
+  localStorage.setItem(LLM_CONFIG_KEY, JSON.stringify(safeConfig));
+  resetLLMAdapter();
+}
+ 
+// === Prompt Templates ===
+ 
+export const LLM_PROMPTS = {
+  reflection: {
+    system: `你是一个 AI Agent 的自我反思引擎。分析最近的对话历史,识别行为模式,并生成改进建议。
+ 
+输出 JSON 格式:
+{
+  "patterns": [
+    {
+      "observation": "观察到的模式描述",
+      "frequency": 数字,
+      "sentiment": "positive/negative/neutral",
+      "evidence": ["证据1", "证据2"]
+    }
+  ],
+  "improvements": [
+    {
+      "area": "改进领域",
+      "suggestion": "具体建议",
+      "priority": "high/medium/low"
+    }
+  ],
+  "identityProposals": []
+}`,
+    user: (context: string) => `分析以下对话历史,进行自我反思:
+ 
+${context}
+ 
+请识别行为模式(积极和消极),并提供具体的改进建议。`,
+  },
+ 
+  compaction: {
+    system: `你是一个对话摘要专家。将长对话压缩为简洁的摘要,保留关键信息。
+ 
+要求:
+1. 保留所有重要决策和结论
+2. 保留用户偏好和约束
+3. 保留未完成的任务
+4. 保持时间顺序
+5. 摘要应能在后续对话中替代原始内容`,
+    user: (messages: string) => `请将以下对话压缩为简洁摘要,保留关键信息:
+ 
+${messages}`,
+  },
+ 
+  extraction: {
+    system: `你是一个记忆提取专家。从对话中提取值得长期记住的信息。
+ 
+提取类型:
+- fact: 用户告知的事实(如"我的公司叫XXX")
+- preference: 用户的偏好(如"我喜欢简洁的回答")
+- lesson: 本次对话的经验教训
+- task: 未完成的任务或承诺
+ 
+输出 JSON 数组:
+[
+  {
+    "content": "记忆内容",
+    "type": "fact/preference/lesson/task",
+    "importance": 1-10,
+    "tags": ["标签1", "标签2"]
+  }
+]`,
+    user: (conversation: string) => `从以下对话中提取值得长期记住的信息:
+ 
+${conversation}
+ 
+如果没有值得记忆的内容,返回空数组 []。`,
+  },
+};
+ 
+// === Helper Functions ===
+ 
+export async function llmReflect(context: string, adapter?: LLMServiceAdapter): Promise<string> {
+  const llm = adapter || getLLMAdapter();
+ 
+  const response = await llm.complete([
+    { role: 'system', content: LLM_PROMPTS.reflection.system },
+    { role: 'user', content: LLM_PROMPTS.reflection.user(context) },
+  ]);
+ 
+  return response.content;
+}
+ 
+export async function llmCompact(messages: string, adapter?: LLMServiceAdapter): Promise<string> {
+  const llm = adapter || getLLMAdapter();
+ 
+  const response = await llm.complete([
+    { role: 'system', content: LLM_PROMPTS.compaction.system },
+    { role: 'user', content: LLM_PROMPTS.compaction.user(messages) },
+  ]);
+ 
+  return response.content;
+}
+ 
+export async function llmExtract(
+  conversation: string,
+  adapter?: LLMServiceAdapter
+): Promise<string> {
+  const llm = adapter || getLLMAdapter();
+ 
+  const response = await llm.complete([
+    { role: 'system', content: LLM_PROMPTS.extraction.system },
+    { role: 'user', content: LLM_PROMPTS.extraction.user(conversation) },
+  ]);
+ 
+  return response.content;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/memory-extractor.ts.html b/desktop/coverage/src/lib/memory-extractor.ts.html new file mode 100644 index 0000000..ee44b34 --- /dev/null +++ b/desktop/coverage/src/lib/memory-extractor.ts.html @@ -0,0 +1,1291 @@ + + + + + + Code coverage report for src/lib/memory-extractor.ts + + + + + + + + + +
+
+

All files / src/lib memory-extractor.ts

+
+ +
+ 0% + Statements + 0/243 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/243 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Memory Extractor - Automatically extract memorable information from conversations
+ *
+ * Uses LLM to analyze completed conversations and extract:
+ * - Facts the user shared
+ * - User preferences discovered
+ * - Lessons learned during problem-solving
+ * - Pending tasks or commitments
+ *
+ * Also handles auto-updating USER.md with discovered preferences.
+ *
+ * Phase 1: Rule-based extraction (pattern matching).
+ * Phase 4: LLM-powered semantic extraction with importance scoring.
+ *
+ * Reference: ZCLAW_AGENT_INTELLIGENCE_EVOLUTION.md §6.2.2
+ */
+ 
+import {
+  intelligenceClient,
+  type MemoryType,
+} from './intelligence-client';
+import {
+  getLLMAdapter,
+  llmExtract,
+  type LLMServiceAdapter,
+  type LLMProvider,
+} from './llm-service';
+ 
+// === Types ===
+ 
+export interface ExtractedItem {
+  content: string;
+  type: MemoryType;
+  importance: number;
+  tags: string[];
+}
+ 
+export interface ExtractionResult {
+  items: ExtractedItem[];
+  saved: number;
+  skipped: number;
+  userProfileUpdated: boolean;
+}
+ 
+export interface ConversationMessage {
+  role: string;
+  content: string;
+}
+ 
+export interface ExtractionConfig {
+  useLLM: boolean;                  // Use LLM for semantic extraction (Phase 4)
+  llmProvider?: LLMProvider;        // Preferred LLM provider
+  llmFallbackToRules: boolean;      // Fall back to rules if LLM fails
+  minMessagesForExtraction: number; // Minimum messages before extraction
+  extractionCooldownMs: number;     // Cooldown between extractions
+  minImportanceThreshold: number;   // Only save items with importance >= this
+}
+ 
+// === Extraction Prompt ===
+ 
+const EXTRACTION_PROMPT = `请从以下对话中提取值得长期记住的信息。
+ 
+只提取以下类型:
+- fact: 用户告知的事实(如"我的公司叫 XXX"、"我在做 YYY 项目")
+- preference: 用户的偏好(如"我喜欢简洁的回答"、"请用中文")
+- lesson: 本次对话的经验教训(如"调用 API 前需要先验证 token")
+- task: 未完成的任务或承诺(如"下次帮我检查 XXX")
+ 
+评估规则:
+- importance 1-3: 临时性、不太重要的信息
+- importance 4-6: 有一定参考价值的信息
+- importance 7-9: 重要的持久信息
+- importance 10: 极其关键的信息
+ 
+输出**纯 JSON 数组**,每项包含 content, type, importance, tags[]。
+如果没有值得记忆的内容,返回空数组 []。
+不要输出任何其他内容,只输出 JSON。
+ 
+对话内容:
+`;
+ 
+// === Default Config ===
+ 
+export const DEFAULT_EXTRACTION_CONFIG: ExtractionConfig = {
+  useLLM: true,  // Enable LLM-powered semantic extraction by default
+  llmFallbackToRules: true,
+  minMessagesForExtraction: 2,  // Lowered from 4 to capture memories earlier
+  extractionCooldownMs: 30_000,
+  minImportanceThreshold: 3,
+};
+ 
+// === Memory Extractor ===
+ 
+export class MemoryExtractor {
+  private config: ExtractionConfig;
+  private lastExtractionTime = 0;
+  private llmAdapter: LLMServiceAdapter | null = null;
+ 
+  constructor(config?: Partial<ExtractionConfig>) {
+    this.config = { ...DEFAULT_EXTRACTION_CONFIG, ...config };
+ 
+    // Initialize LLM adapter if configured
+    if (this.config.useLLM) {
+      try {
+        this.llmAdapter = getLLMAdapter();
+      } catch (error) {
+        console.warn('[MemoryExtractor] Failed to initialize LLM adapter:', error);
+      }
+    }
+  }
+ 
+  /**
+   * Extract memories from a conversation.
+   * Uses LLM if configured, falls back to rule-based extraction.
+   */
+  async extractFromConversation(
+    messages: ConversationMessage[],
+    agentId: string,
+    conversationId?: string,
+    options?: { forceLLM?: boolean }
+  ): Promise<ExtractionResult> {
+    // Cooldown check
+    if (Date.now() - this.lastExtractionTime < this.config.extractionCooldownMs) {
+      console.log('[MemoryExtractor] Skipping extraction: cooldown active');
+      return { items: [], saved: 0, skipped: 0, userProfileUpdated: false };
+    }
+ 
+    // Minimum message threshold
+    const chatMessages = messages.filter(m => m.role === 'user' || m.role === 'assistant');
+    console.log(`[MemoryExtractor] Checking extraction: ${chatMessages.length} messages (min: ${this.config.minMessagesForExtraction})`);
+    if (chatMessages.length < this.config.minMessagesForExtraction) {
+      console.log('[MemoryExtractor] Skipping extraction: not enough messages');
+      return { items: [], saved: 0, skipped: 0, userProfileUpdated: false };
+    }
+ 
+    this.lastExtractionTime = Date.now();
+ 
+    // Try LLM extraction if enabled
+    let extracted: ExtractedItem[];
+    if ((this.config.useLLM || options?.forceLLM) && this.llmAdapter?.isAvailable()) {
+      try {
+        console.log('[MemoryExtractor] Using LLM-powered semantic extraction');
+        extracted = await this.llmBasedExtraction(chatMessages);
+      } catch (error) {
+        console.error('[MemoryExtractor] LLM extraction failed:', error);
+        if (!this.config.llmFallbackToRules) {
+          throw error;
+        }
+        console.log('[MemoryExtractor] Falling back to rule-based extraction');
+        extracted = this.ruleBasedExtraction(chatMessages);
+      }
+    } else {
+      // Rule-based extraction
+      console.log('[MemoryExtractor] Using rule-based extraction');
+      extracted = this.ruleBasedExtraction(chatMessages);
+      console.log(`[MemoryExtractor] Rule-based extracted ${extracted.length} items before filtering`);
+    }
+ 
+    // Filter by importance threshold
+    extracted = extracted.filter(item => item.importance >= this.config.minImportanceThreshold);
+    console.log(`[MemoryExtractor] After importance filtering (>= ${this.config.minImportanceThreshold}): ${extracted.length} items`);
+ 
+    // Save to memory
+    let saved = 0;
+    let skipped = 0;
+ 
+    for (const item of extracted) {
+      try {
+        await intelligenceClient.memory.store({
+          agent_id: agentId,
+          memory_type: item.type,
+          content: item.content,
+          importance: item.importance,
+          source: 'auto',
+          tags: item.tags,
+          conversation_id: conversationId,
+        });
+        saved++;
+      } catch {
+        skipped++;
+      }
+    }
+ 
+    // Auto-update USER.md with preferences
+    let userProfileUpdated = false;
+    const preferences = extracted.filter(e => e.type === 'preference' && e.importance >= 5);
+    if (preferences.length > 0) {
+      try {
+        const prefSummary = preferences.map(p => `- ${p.content}`).join('\n');
+        await intelligenceClient.identity.appendUserProfile(agentId, `### 自动发现的偏好 (${new Date().toLocaleDateString('zh-CN')})\n${prefSummary}`);
+        userProfileUpdated = true;
+      } catch (err) {
+        console.warn('[MemoryExtractor] Failed to update USER.md:', err);
+      }
+    }
+ 
+    if (saved > 0) {
+      console.log(`[MemoryExtractor] Extracted ${saved} memories from conversation (${skipped} skipped)`);
+    }
+ 
+    return { items: extracted, saved, skipped, userProfileUpdated };
+  }
+ 
+  /**
+   * LLM-powered semantic extraction.
+   * Uses LLM to understand context and score importance semantically.
+   */
+  private async llmBasedExtraction(messages: ConversationMessage[]): Promise<ExtractedItem[]> {
+    const conversationText = messages
+      .filter(m => m.role === 'user' || m.role === 'assistant')
+      .map(m => `[${m.role === 'user' ? '用户' : '助手'}]: ${m.content}`)
+      .join('\n\n');
+ 
+    // Use llmExtract helper from llm-service
+    const llmResponse = await llmExtract(conversationText, this.llmAdapter!);
+ 
+    // Parse the JSON response
+    return this.parseExtractionResponse(llmResponse);
+  }
+ 
+  /**
+   * Phase 1: Rule-based extraction using pattern matching.
+   * Extracts common patterns from user messages.
+   */
+  private ruleBasedExtraction(messages: ConversationMessage[]): ExtractedItem[] {
+    const items: ExtractedItem[] = [];
+    const userMessages = messages.filter(m => m.role === 'user').map(m => m.content);
+ 
+    for (const msg of userMessages) {
+      // Fact patterns
+      this.extractFacts(msg, items);
+      // Preference patterns
+      this.extractPreferences(msg, items);
+      // Task patterns
+      this.extractTasks(msg, items);
+    }
+ 
+    // Lesson extraction from assistant messages (error corrections, solutions)
+    const assistantMessages = messages.filter(m => m.role === 'assistant').map(m => m.content);
+    this.extractLessons(userMessages, assistantMessages, items);
+ 
+    return items;
+  }
+ 
+  private extractFacts(msg: string, items: ExtractedItem[]): void {
+    // "我的/我们的 X 是/叫 Y" patterns
+    const factPatterns = [
+      /我(?:的|们的|们)(\S{1,20})(?:是|叫|名叫|名字是)(.{2,50})/g,
+      /(?:公司|团队|项目|产品)(?:名|名称)?(?:是|叫)(.{2,30})/g,
+      /我(?:在|正在)(?:做|开发|使用|学习)(.{2,40})/g,
+      /我(?:是|做)(.{2,30})(?:的|工作)/g,
+    ];
+ 
+    for (const pattern of factPatterns) {
+      const matches = msg.matchAll(pattern);
+      for (const match of matches) {
+        const content = match[0].trim();
+        if (content.length > 5 && content.length < 100) {
+          items.push({
+            content,
+            type: 'fact',
+            importance: 6,
+            tags: ['auto-extracted'],
+          });
+        }
+      }
+    }
+  }
+ 
+  private extractPreferences(msg: string, items: ExtractedItem[]): void {
+    const prefPatterns = [
+      /(?:我喜欢|我偏好|我习惯|请用|请使用|默认用|我更愿意)(.{2,50})/g,
+      /(?:不要|别|不用)(.{2,30})(?:了|吧)?/g,
+      /(?:以后|下次|每次)(?:都)?(.{2,40})/g,
+      /(?:用中文|用英文|简洁|详细|简短)(?:一点|回复|回答)?/g,
+    ];
+ 
+    for (const pattern of prefPatterns) {
+      const matches = msg.matchAll(pattern);
+      for (const match of matches) {
+        const content = match[0].trim();
+        if (content.length > 3 && content.length < 80) {
+          items.push({
+            content: `用户偏好: ${content}`,
+            type: 'preference',
+            importance: 5,
+            tags: ['auto-extracted', 'preference'],
+          });
+        }
+      }
+    }
+  }
+ 
+  private extractTasks(msg: string, items: ExtractedItem[]): void {
+    const taskPatterns = [
+      /(?:帮我|帮忙|记得|别忘了|下次|以后|待办)(.{5,60})/g,
+      /(?:TODO|todo|FIXME|fixme)[:\s]*(.{5,60})/g,
+    ];
+ 
+    for (const pattern of taskPatterns) {
+      const matches = msg.matchAll(pattern);
+      for (const match of matches) {
+        const content = match[0].trim();
+        if (content.length > 5 && content.length < 100) {
+          items.push({
+            content,
+            type: 'task',
+            importance: 7,
+            tags: ['auto-extracted', 'task'],
+          });
+        }
+      }
+    }
+  }
+ 
+  private extractLessons(
+    _userMessages: string[],
+    assistantMessages: string[],
+    items: ExtractedItem[]
+  ): void {
+    // Look for error resolution patterns in assistant messages
+    for (const msg of assistantMessages) {
+      // "问题是/原因是/根因是" patterns
+      const lessonPatterns = [
+        /(?:问题是|原因是|根因是|解决方法是|关键是)(.{10,100})/g,
+        /(?:需要注意|要注意|注意事项)[::](.{10,80})/g,
+      ];
+ 
+      for (const pattern of lessonPatterns) {
+        const matches = msg.matchAll(pattern);
+        for (const match of matches) {
+          const content = match[0].trim();
+          if (content.length > 10 && content.length < 150) {
+            items.push({
+              content,
+              type: 'lesson',
+              importance: 6,
+              tags: ['auto-extracted', 'lesson'],
+            });
+          }
+        }
+      }
+    }
+  }
+ 
+  /**
+   * Build the LLM extraction prompt for a conversation.
+   * For Phase 2: send this to LLM and parse the JSON response.
+   */
+  buildExtractionPrompt(messages: ConversationMessage[]): string {
+    const conversationText = messages
+      .filter(m => m.role === 'user' || m.role === 'assistant')
+      .map(m => `[${m.role === 'user' ? '用户' : '助手'}]: ${m.content}`)
+      .join('\n\n');
+ 
+    return EXTRACTION_PROMPT + conversationText;
+  }
+ 
+  /**
+   * Parse LLM extraction response.
+   * For Phase 2: parse the JSON array from LLM response.
+   */
+  parseExtractionResponse(response: string): ExtractedItem[] {
+    try {
+      // Find JSON array in response
+      const jsonMatch = response.match(/\[[\s\S]*\]/);
+      if (!jsonMatch) return [];
+ 
+      const parsed = JSON.parse(jsonMatch[0]);
+      if (!Array.isArray(parsed)) return [];
+ 
+      return parsed
+        .filter((item: Record<string, unknown>) =>
+          item.content && item.type && item.importance !== undefined
+        )
+        .map((item: Record<string, unknown>) => ({
+          content: String(item.content),
+          type: item.type as MemoryType,
+          importance: Math.max(1, Math.min(10, Number(item.importance))),
+          tags: Array.isArray(item.tags) ? item.tags.map(String) : [],
+        }));
+    } catch {
+      console.warn('[MemoryExtractor] Failed to parse LLM extraction response');
+      return [];
+    }
+  }
+}
+ 
+// === Singleton ===
+ 
+let _instance: MemoryExtractor | null = null;
+ 
+export function getMemoryExtractor(): MemoryExtractor {
+  if (!_instance) {
+    _instance = new MemoryExtractor();
+  }
+  return _instance;
+}
+ 
+export function resetMemoryExtractor(): void {
+  _instance = null;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/message-virtualization.ts.html b/desktop/coverage/src/lib/message-virtualization.ts.html new file mode 100644 index 0000000..9daadaa --- /dev/null +++ b/desktop/coverage/src/lib/message-virtualization.ts.html @@ -0,0 +1,1570 @@ + + + + + + Code coverage report for src/lib/message-virtualization.ts + + + + + + + + + +
+
+

All files / src/lib message-virtualization.ts

+
+ +
+ 0% + Statements + 0/225 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/225 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Message Virtualization Utilities
+ *
+ * Provides efficient rendering for large message lists (10,000+ messages)
+ * using react-window's VariableSizeList with dynamic height measurement.
+ *
+ * @module message-virtualization
+ */
+ 
+import { useRef, useCallback, useMemo, useEffect, type CSSProperties, type ReactNode } from 'react';
+import React from 'react';
+import type { ListImperativeAPI } from 'react-window';
+ 
+/**
+ * Message item interface for virtualization
+ */
+export interface VirtualizedMessageItem {
+  id: string;
+  height: number;
+  role: 'user' | 'assistant' | 'tool' | 'hand' | 'workflow' | 'system';
+}
+ 
+/**
+ * Props for the virtualized message list component
+ */
+export interface VirtualizedMessageListProps {
+  messages: VirtualizedMessageItem[];
+  renderMessage: (id: string, style: CSSProperties) => ReactNode;
+  height: number;
+  width: number | string;
+  overscan?: number;
+  onScroll?: (scrollTop: number) => void;
+}
+ 
+/**
+ * Default estimated heights for each message type
+ * These are used before actual measurement
+ */
+const DEFAULT_HEIGHTS: Record<string, number> = {
+  user: 80,
+  assistant: 150,
+  tool: 100,
+  hand: 120,
+  workflow: 100,
+  system: 60,
+};
+ 
+/**
+ * Hook return type for virtualized message management
+ */
+export interface UseVirtualizedMessagesReturn {
+  /** Reference to the List instance */
+  listRef: React.RefObject<ListImperativeAPI | null>;
+  /** Get the current height for a message by id and role */
+  getHeight: (id: string, role: string) => number;
+  /** Update the measured height for a message */
+  setHeight: (id: string, height: number) => void;
+  /** Calculate total height of all messages */
+  totalHeight: number;
+  /** Scroll to the bottom of the list */
+  scrollToBottom: () => void;
+  /** Scroll to a specific message index */
+  scrollToIndex: (index: number) => void;
+  /** Reset height cache and recalculate */
+  resetCache: () => void;
+}
+ 
+/**
+ * Hook for virtualized message rendering with dynamic height measurement.
+ *
+ * @param messages - Array of message items to virtualize
+ * @param defaultHeights - Optional custom default heights per role
+ * @returns Object containing list ref, height getters/setters, and scroll utilities
+ *
+ * @example
+ * ```tsx
+ * const { listRef, getHeight, setHeight, scrollToBottom } = useVirtualizedMessages(messages);
+ *
+ * // In render:
+ * <VariableSizeList
+ *   ref={listRef}
+ *   itemCount={messages.length}
+ *   itemSize={(index) => getHeight(messages[index].id, messages[index].role)}
+ * >
+ *   {({ index, style }) => (
+ *     <MessageRenderer
+ *       message={messages[index]}
+ *       style={style}
+ *       onHeightChange={(h) => setHeight(messages[index].id, h)}
+ *     />
+ *   )}
+ * </VariableSizeList>
+ * ```
+ */
+export function useVirtualizedMessages(
+  messages: VirtualizedMessageItem[],
+  defaultHeights: Record<string, number> = DEFAULT_HEIGHTS
+): UseVirtualizedMessagesReturn {
+  const listRef = useRef<ListImperativeAPI>(null);
+  const heightsRef = useRef<Map<string, number>>(new Map());
+  const prevMessagesLengthRef = useRef<number>(0);
+ 
+  /**
+   * Get height for a message, falling back to default for role
+   */
+  const getHeight = useCallback(
+    (id: string, role: string): number => {
+      return heightsRef.current.get(id) ?? defaultHeights[role] ?? 100;
+    },
+    [defaultHeights]
+  );
+ 
+  /**
+   * Update height when a message is measured
+   * Triggers list recalculation if height changed
+   */
+  const setHeight = useCallback((id: string, height: number): void => {
+    const current = heightsRef.current.get(id);
+    if (current !== height) {
+      heightsRef.current.set(id, height);
+      // Height updated - the list will use the new height on next render
+    }
+  }, []);
+ 
+  /**
+   * Calculate total height of all messages
+   */
+  const totalHeight = useMemo((): number => {
+    return messages.reduce(
+      (sum, msg) => sum + getHeight(msg.id, msg.role),
+      0
+    );
+  }, [messages, getHeight]);
+ 
+  /**
+   * Scroll to the bottom of the list
+   */
+  const scrollToBottom = useCallback((): void => {
+    if (listRef.current && messages.length > 0) {
+      listRef.current.scrollToRow({ index: messages.length - 1, align: 'end' });
+    }
+  }, [messages.length]);
+ 
+  /**
+   * Scroll to a specific message index
+   */
+  const scrollToIndex = useCallback((index: number): void => {
+    if (listRef.current && index >= 0 && index < messages.length) {
+      listRef.current.scrollToRow({ index, align: 'center' });
+    }
+  }, [messages.length]);
+ 
+  /**
+   * Reset the height cache and force recalculation
+   */
+  const resetCache = useCallback((): void => {
+    heightsRef.current.clear();
+  }, []);
+ 
+  /**
+   * Auto-scroll to bottom when new messages arrive
+   */
+  useEffect(() => {
+    if (messages.length > prevMessagesLengthRef.current) {
+      // New messages added, scroll to bottom
+      scrollToBottom();
+    }
+    prevMessagesLengthRef.current = messages.length;
+  }, [messages.length, scrollToBottom]);
+ 
+  return {
+    listRef,
+    getHeight,
+    setHeight,
+    totalHeight,
+    scrollToBottom,
+    scrollToIndex,
+    resetCache,
+  };
+}
+ 
+/**
+ * LRU Cache for rendered messages.
+ * Useful for caching computed message data or rendered content.
+ *
+ * @typeParam T - Type of cached data
+ *
+ * @example
+ * ```tsx
+ * const cache = new MessageCache<ParsedMessageContent>(100);
+ *
+ * // Get or compute
+ * let content = cache.get(messageId);
+ * if (!content) {
+ *   content = parseMarkdown(message.content);
+ *   cache.set(messageId, content);
+ * }
+ * ```
+ */
+export class MessageCache<T> {
+  private cache: Map<string, { data: T; timestamp: number }>;
+  private readonly maxSize: number;
+  private accessOrder: string[];
+ 
+  constructor(maxSize: number = 100) {
+    this.cache = new Map();
+    this.maxSize = maxSize;
+    this.accessOrder = [];
+  }
+ 
+  /**
+   * Get cached data by key
+   * Updates access order for LRU eviction
+   */
+  get(key: string): T | undefined {
+    const entry = this.cache.get(key);
+    if (entry) {
+      // Move to end (most recently used)
+      const index = this.accessOrder.indexOf(key);
+      if (index > -1) {
+        this.accessOrder.splice(index, 1);
+        this.accessOrder.push(key);
+      }
+      return entry.data;
+    }
+    return undefined;
+  }
+ 
+  /**
+   * Set cached data by key
+   * Evicts oldest entries if at capacity
+   */
+  set(key: string, data: T): void {
+    // Remove if exists
+    if (this.cache.has(key)) {
+      const index = this.accessOrder.indexOf(key);
+      if (index > -1) {
+        this.accessOrder.splice(index, 1);
+      }
+    }
+ 
+    // Evict oldest if at capacity
+    while (this.accessOrder.length >= this.maxSize) {
+      const oldest = this.accessOrder.shift();
+      if (oldest) {
+        this.cache.delete(oldest);
+      }
+    }
+ 
+    this.cache.set(key, { data, timestamp: Date.now() });
+    this.accessOrder.push(key);
+  }
+ 
+  /**
+   * Check if key exists in cache
+   */
+  has(key: string): boolean {
+    return this.cache.has(key);
+  }
+ 
+  /**
+   * Remove a specific key from cache
+   */
+  delete(key: string): boolean {
+    const index = this.accessOrder.indexOf(key);
+    if (index > -1) {
+      this.accessOrder.splice(index, 1);
+    }
+    return this.cache.delete(key);
+  }
+ 
+  /**
+   * Clear all cached data
+   */
+  clear(): void {
+    this.cache.clear();
+    this.accessOrder = [];
+  }
+ 
+  /**
+   * Get current cache size
+   */
+  get size(): number {
+    return this.cache.size;
+  }
+ 
+  /**
+   * Get all keys in access order (oldest first)
+   */
+  get keys(): string[] {
+    return [...this.accessOrder];
+  }
+}
+ 
+/**
+ * Options for creating a message batcher
+ */
+export interface MessageBatcherOptions {
+  /** Maximum messages to batch before flush */
+  batchSize: number;
+  /** Maximum time to wait before flush (ms) */
+  maxWaitMs: number;
+}
+ 
+/**
+ * Message batcher for efficient WebSocket message processing.
+ * Groups incoming messages into batches for optimized rendering.
+ *
+ * @typeParam T - Type of message to batch
+ *
+ * @example
+ * ```tsx
+ * const batcher = createMessageBatcher<ChatMessage>(
+ *   (messages) => {
+ *     // Process batch of messages
+ *     chatStore.addMessages(messages);
+ *   },
+ *   { batchSize: 10, maxWaitMs: 50 }
+ * );
+ *
+ * // Add messages as they arrive
+ * websocket.on('message', (msg) => batcher.add(msg));
+ *
+ * // Flush remaining on disconnect
+ * websocket.on('close', () => batcher.flush());
+ * ```
+ */
+export function createMessageBatcher<T>(
+  callback: (messages: T[]) => void,
+  options: MessageBatcherOptions = { batchSize: 10, maxWaitMs: 50 }
+): {
+  add: (message: T) => void;
+  flush: () => void;
+  clear: () => void;
+  size: () => number;
+} {
+  let batch: T[] = [];
+  let timeoutId: ReturnType<typeof setTimeout> | null = null;
+ 
+  const flush = (): void => {
+    if (batch.length > 0) {
+      callback([...batch]);
+      batch = [];
+    }
+    if (timeoutId) {
+      clearTimeout(timeoutId);
+      timeoutId = null;
+    }
+  };
+ 
+  return {
+    add: (message: T): void => {
+      batch.push(message);
+ 
+      if (batch.length >= options.batchSize) {
+        flush();
+      } else if (!timeoutId) {
+        timeoutId = setTimeout(flush, options.maxWaitMs);
+      }
+    },
+    flush,
+    clear: (): void => {
+      batch = [];
+      if (timeoutId) {
+        clearTimeout(timeoutId);
+        timeoutId = null;
+      }
+    },
+    size: (): number => batch.length,
+  };
+}
+ 
+/**
+ * Memoization helper for message content parsing.
+ * Caches parsed content to avoid re-parsing on re-renders.
+ *
+ * @param messageId - Unique message identifier
+ * @param content - Raw content to parse
+ * @param parser - Parsing function
+ * @param cache - Optional cache instance to use
+ * @returns Parsed content
+ */
+export function useMemoizedContent<T>(
+  messageId: string,
+  content: string,
+  parser: (content: string) => T,
+  cache?: MessageCache<T>
+): T {
+  // Use provided cache or create a default one
+  const cacheRef = useRef<MessageCache<T> | undefined>(undefined);
+  if (!cacheRef.current && !cache) {
+    cacheRef.current = new MessageCache<T>(200);
+  }
+  const activeCache = cache ?? cacheRef.current!;
+ 
+  // Check cache first
+  const cached = activeCache.get(messageId);
+  if (cached !== undefined) {
+    return cached;
+  }
+ 
+  // Parse and cache
+  const parsed = parser(content);
+  activeCache.set(messageId, parsed);
+  return parsed;
+}
+ 
+/**
+ * Creates a stable message key for React rendering.
+ * Handles potential duplicate IDs by incorporating index.
+ *
+ * @param id - Message ID
+ * @param index - Message index in list
+ * @returns Stable key string
+ */
+export function createMessageKey(id: string, index: number): string {
+  return `${id}-${index}`;
+}
+ 
+/**
+ * Calculates the visible range of messages for a given viewport.
+ * Useful for lazy loading or prefetching.
+ *
+ * @param scrollTop - Current scroll position
+ * @param containerHeight - Height of visible container
+ * @param messages - Array of messages with heights
+ * @param overscan - Number of extra items to include on each side
+ * @returns Object with start and end indices of visible range
+ */
+export function calculateVisibleRange(
+  scrollTop: number,
+  containerHeight: number,
+  messages: VirtualizedMessageItem[],
+  overscan: number = 3
+): { start: number; end: number } {
+  let currentOffset = 0;
+  let start = 0;
+  let end = messages.length - 1;
+ 
+  // Find start index
+  for (let i = 0; i < messages.length; i++) {
+    const msgHeight = messages[i].height;
+    if (currentOffset + msgHeight > scrollTop) {
+      start = Math.max(0, i - overscan);
+      break;
+    }
+    currentOffset += msgHeight;
+  }
+ 
+  // Find end index
+  const targetEnd = scrollTop + containerHeight;
+  currentOffset = 0;
+  for (let i = 0; i < messages.length; i++) {
+    const msgHeight = messages[i].height;
+    currentOffset += msgHeight;
+    if (currentOffset >= targetEnd) {
+      end = Math.min(messages.length - 1, i + overscan);
+      break;
+    }
+  }
+ 
+  return { start, end };
+}
+ 
+/**
+ * Debounced scroll handler factory.
+ * Prevents excessive re-renders during fast scrolling.
+ *
+ * @param callback - Function to call with scroll position
+ * @param delay - Debounce delay in ms
+ * @returns Debounced scroll handler
+ */
+export function createDebouncedScrollHandler(
+  callback: (scrollTop: number) => void,
+  delay: number = 100
+): (scrollTop: number) => void {
+  let timeoutId: ReturnType<typeof setTimeout> | null = null;
+  let lastValue = 0;
+ 
+  return (scrollTop: number): void => {
+    lastValue = scrollTop;
+    if (timeoutId) {
+      clearTimeout(timeoutId);
+    }
+    timeoutId = setTimeout(() => {
+      callback(lastValue);
+      timeoutId = null;
+    }, delay);
+  };
+}
+ 
+export type {
+  VirtualizedMessageItem as MessageItem,
+  VirtualizedMessageListProps as MessageListProps,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/personality-presets.ts.html b/desktop/coverage/src/lib/personality-presets.ts.html new file mode 100644 index 0000000..38d6ef4 --- /dev/null +++ b/desktop/coverage/src/lib/personality-presets.ts.html @@ -0,0 +1,1168 @@ + + + + + + Code coverage report for src/lib/personality-presets.ts + + + + + + + + + +
+
+

All files / src/lib personality-presets.ts

+
+ +
+ 0% + Statements + 0/232 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/232 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Personality Presets Configuration
+ *
+ * Defines personality styles, scenario tags, and emoji presets for Agent onboarding.
+ * Used by AgentOnboardingWizard to provide guided personality setup.
+ */
+ 
+// === Personality Options ===
+ 
+export interface PersonalityOption {
+  id: string;
+  label: string;
+  description: string;
+  icon: string; // Icon name for Lucide
+  traits: string[];
+  communicationStyle: string;
+}
+ 
+export const PERSONALITY_OPTIONS: PersonalityOption[] = [
+  {
+    id: 'professional',
+    label: '专业严谨',
+    description: '精确、可靠、技术导向',
+    icon: 'Briefcase',
+    traits: ['精确', '可靠', '技术导向', '系统化'],
+    communicationStyle: '专业、准确、注重细节,提供技术深度和可操作的建议',
+  },
+  {
+    id: 'friendly',
+    label: '友好亲切',
+    description: '温暖、耐心、易于沟通',
+    icon: 'Heart',
+    traits: ['温暖', '耐心', '易于沟通', '善解人意'],
+    communicationStyle: '亲切、耐心、善解人意,用易懂的语言解释复杂概念',
+  },
+  {
+    id: 'creative',
+    label: '创意灵活',
+    description: '想象力丰富、善于探索',
+    icon: 'Sparkles',
+    traits: ['想象力丰富', '善于探索', '思维开放', '创新'],
+    communicationStyle: '富有创意、思维开放,鼓励探索新想法和解决方案',
+  },
+  {
+    id: 'concise',
+    label: '简洁高效',
+    description: '快速、直接、结果导向',
+    icon: 'Zap',
+    traits: ['快速', '直接', '结果导向', '高效'],
+    communicationStyle: '简洁明了、直奔主题,专注于快速解决问题',
+  },
+];
+ 
+// === Scenario Tags ===
+ 
+export interface ScenarioTag {
+  id: string;
+  label: string;
+  description: string;
+  icon: string; // Icon name for Lucide
+  keywords: string[];
+}
+ 
+export const SCENARIO_TAGS: ScenarioTag[] = [
+  {
+    id: 'coding',
+    label: '编程开发',
+    description: '代码编写、调试、代码审查',
+    icon: 'Code',
+    keywords: ['编程', '代码', '开发', '调试', 'Bug', '重构'],
+  },
+  {
+    id: 'writing',
+    label: '内容写作',
+    description: '文章撰写、文案创作、编辑润色',
+    icon: 'PenLine',
+    keywords: ['写作', '文案', '文章', '内容', '编辑', '润色'],
+  },
+  {
+    id: 'product',
+    label: '产品策划',
+    description: '产品规划、需求分析、用户研究',
+    icon: 'Package',
+    keywords: ['产品', '需求', '用户', '规划', '功能', 'PRD'],
+  },
+  {
+    id: 'data',
+    label: '数据分析',
+    description: '数据处理、统计分析、可视化',
+    icon: 'BarChart',
+    keywords: ['数据', '分析', '统计', '图表', '可视化', '报表'],
+  },
+  {
+    id: 'design',
+    label: '设计创意',
+    description: 'UI/UX设计、视觉设计、原型制作',
+    icon: 'Palette',
+    keywords: ['设计', 'UI', 'UX', '视觉', '原型', '界面'],
+  },
+  {
+    id: 'devops',
+    label: '运维部署',
+    description: '系统运维、CI/CD、容器化部署',
+    icon: 'Server',
+    keywords: ['运维', '部署', 'CI/CD', 'Docker', 'K8s', '服务器'],
+  },
+  {
+    id: 'research',
+    label: '研究调研',
+    description: '技术调研、文献研究、竞品分析',
+    icon: 'Search',
+    keywords: ['研究', '调研', '分析', '文献', '竞品', '技术'],
+  },
+  {
+    id: 'marketing',
+    label: '营销推广',
+    description: '营销策略、内容营销、社媒运营',
+    icon: 'Megaphone',
+    keywords: ['营销', '推广', '运营', '社媒', '增长', '转化'],
+  },
+  {
+    id: 'other',
+    label: '其他',
+    description: '其他用途或综合场景',
+    icon: 'MoreHorizontal',
+    keywords: [],
+  },
+];
+ 
+// === Emoji Presets ===
+ 
+export const EMOJI_PRESETS = {
+  animals: ['🦞', '🐱', '🐶', '🦊', '🐼', '🦁', '🐬', '🦄'],
+  objects: ['💻', '🚀', '⚡', '🔧', '📚', '🎨', '⭐', '💎'],
+  expressions: ['😊', '🤓', '😎', '🤖'],
+};
+ 
+export const ALL_EMOJIS = [
+  ...EMOJI_PRESETS.animals,
+  ...EMOJI_PRESETS.objects,
+  ...EMOJI_PRESETS.expressions,
+];
+ 
+// === Quick Start Suggestions ===
+ 
+export interface QuickStartSuggestion {
+  icon: string;
+  text: string;
+  scenarios: string[]; // Which scenarios this suggestion applies to
+}
+ 
+export const QUICK_START_SUGGESTIONS: QuickStartSuggestion[] = [
+  {
+    icon: '💡',
+    text: '帮我写一个 Python 脚本处理 Excel 文件',
+    scenarios: ['coding', 'data'],
+  },
+  {
+    icon: '📊',
+    text: '分析这个数据集的趋势和关键指标',
+    scenarios: ['data', 'research'],
+  },
+  {
+    icon: '✍️',
+    text: '帮我起草一份产品需求文档',
+    scenarios: ['product', 'writing'],
+  },
+  {
+    icon: '🔍',
+    text: '帮我研究一下这个技术方案的可行性',
+    scenarios: ['research', 'coding'],
+  },
+  {
+    icon: '🎨',
+    text: '给我一些 UI 设计的创意建议',
+    scenarios: ['design'],
+  },
+  {
+    icon: '📝',
+    text: '帮我写一篇技术博客文章',
+    scenarios: ['writing'],
+  },
+  {
+    icon: '🚀',
+    text: '帮我规划一个完整的营销方案',
+    scenarios: ['marketing', 'product'],
+  },
+  {
+    icon: '⚙️',
+    text: '帮我配置一个自动化部署流程',
+    scenarios: ['devops', 'coding'],
+  },
+];
+ 
+// === Helper Functions ===
+ 
+/**
+ * Get personality option by ID
+ */
+export function getPersonalityById(id: string): PersonalityOption | undefined {
+  return PERSONALITY_OPTIONS.find((p) => p.id === id);
+}
+ 
+/**
+ * Get scenario tag by ID
+ */
+export function getScenarioById(id: string): ScenarioTag | undefined {
+  return SCENARIO_TAGS.find((s) => s.id === id);
+}
+ 
+/**
+ * Get quick start suggestions for given scenarios
+ */
+export function getQuickStartSuggestions(scenarios: string[]): QuickStartSuggestion[] {
+  if (!scenarios || scenarios.length === 0) {
+    // Return first 3 general suggestions if no scenarios selected
+    return QUICK_START_SUGGESTIONS.slice(0, 3);
+  }
+ 
+  // Filter suggestions that match any of the selected scenarios
+  const matching = QUICK_START_SUGGESTIONS.filter((s) =>
+    s.scenarios.some((scenario) => scenarios.includes(scenario))
+  );
+ 
+  // Return up to 3 matching suggestions, fallback to first 3 if none match
+  return matching.length > 0 ? matching.slice(0, 3) : QUICK_START_SUGGESTIONS.slice(0, 3);
+}
+ 
+/**
+ * Generate welcome message based on personality and scenarios
+ */
+export function generateWelcomeMessage(config: {
+  userName?: string;
+  agentName: string;
+  emoji?: string;
+  personality?: string;
+  scenarios?: string[];
+}): string {
+  const { userName, agentName, emoji, personality, scenarios } = config;
+ 
+  // Build greeting
+  let greeting = '';
+  if (userName) {
+    greeting = `你好,${userName}!`;
+  } else {
+    greeting = '你好!';
+  }
+ 
+  // Build introduction
+  let intro = `我是${emoji ? ' ' + emoji : ''} ${agentName}`;
+ 
+  // Add scenario context
+  if (scenarios && scenarios.length > 0) {
+    const scenarioLabels = scenarios
+      .map((id) => getScenarioById(id)?.label)
+      .filter(Boolean)
+      .slice(0, 3);
+    if (scenarioLabels.length > 0) {
+      intro += `,你的${scenarioLabels.join('、')}助手`;
+    }
+  }
+ 
+  // Add personality touch
+  if (personality) {
+    const personalityOption = getPersonalityById(personality);
+    if (personalityOption) {
+      intro += `。我会以${personalityOption.traits[0]}的方式为你提供帮助`;
+    }
+  }
+ 
+  // Add closing
+  intro += '。有什么我可以帮你的吗?';
+ 
+  return `${greeting}\n\n${intro}`;
+}
+ 
+/**
+ * Generate SOUL.md content based on personality config
+ */
+export function generateSoulContent(config: {
+  agentName: string;
+  emoji?: string;
+  personality?: string;
+  scenarios?: string[];
+  communicationStyle?: string;
+}): string {
+  const { agentName, emoji, personality, scenarios, communicationStyle } = config;
+ 
+  const personalityOption = personality ? getPersonalityById(personality) : undefined;
+  const scenarioLabels =
+    scenarios
+      ?.map((id) => getScenarioById(id)?.label)
+      .filter(Boolean)
+      .join('、') || '通用';
+ 
+  return `# ${agentName} 人格
+ 
+> ${emoji || '🤖'} ${agentName} - ${scenarioLabels}助手
+ 
+## 核心特质
+ 
+${
+  personalityOption
+    ? personalityOption.traits.map((t) => `- ${t}`).join('\n')
+    : '- 高效执行\n- 专业可靠\n- 主动服务'
+}
+ 
+## 沟通风格
+ 
+${communicationStyle || personalityOption?.communicationStyle || '简洁、专业、友好'}
+ 
+## 专业领域
+ 
+${scenarioLabels}
+ 
+## 边界
+ 
+- 安全约束:不执行可能损害用户或系统的操作
+- 隐私保护:不主动收集或分享敏感信息
+- 能力边界:超出能力范围时坦诚告知
+ 
+## 语气
+ 
+- 使用中文进行交流
+- 保持专业但友好的态度
+- 适时提供额外上下文和建议
+`;
+}
+ 
+/**
+ * Generate USER.md content based on user profile
+ */
+export function generateUserContent(config: {
+  userName?: string;
+  userRole?: string;
+  scenarios?: string[];
+}): string {
+  const { userName, userRole, scenarios } = config;
+ 
+  const scenarioLabels =
+    scenarios
+      ?.map((id) => getScenarioById(id)?.label)
+      .filter(Boolean)
+      .join('、') || '通用';
+ 
+  const sections: string[] = ['# 用户档案\n'];
+ 
+  if (userName) {
+    sections.push(`## 基本信息\n\n- 姓名:${userName}`);
+    if (userRole) {
+      sections.push(`- 角色:${userRole}`);
+    }
+    sections.push('');
+  }
+ 
+  sections.push(`## 关注领域\n\n${scenarioLabels}\n`);
+ 
+  sections.push(`## 偏好设置\n\n- 语言:中文\n- 沟通风格:直接、高效\n`);
+ 
+  return sections.join('\n');
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/pipeline-client.ts.html b/desktop/coverage/src/lib/pipeline-client.ts.html new file mode 100644 index 0000000..878228f --- /dev/null +++ b/desktop/coverage/src/lib/pipeline-client.ts.html @@ -0,0 +1,1426 @@ + + + + + + Code coverage report for src/lib/pipeline-client.ts + + + + + + + + + +
+
+

All files / src/lib pipeline-client.ts

+
+ +
+ 0% + Statements + 0/280 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/280 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Pipeline Client (Tauri)
+ *
+ * Client for discovering, running, and monitoring Pipelines.
+ * Pipelines are DSL-based workflows that orchestrate Skills and Hands.
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+import { listen, type UnlistenFn } from '@tauri-apps/api/event';
+ 
+// Re-export UnlistenFn for external use
+export type { UnlistenFn };
+ 
+// === Types ===
+ 
+export interface PipelineInputInfo {
+  name: string;
+  inputType: string;
+  required: boolean;
+  label: string;
+  placeholder?: string;
+  default?: unknown;
+  options: string[];
+}
+ 
+export interface PipelineInfo {
+  id: string;
+  displayName: string;
+  description: string;
+  category: string;
+  tags: string[];
+  icon: string;
+  version: string;
+  author: string;
+  inputs: PipelineInputInfo[];
+}
+ 
+export interface RunPipelineRequest {
+  pipelineId: string;
+  inputs: Record<string, unknown>;
+}
+ 
+export interface RunPipelineResponse {
+  runId: string;
+  pipelineId: string;
+  status: string;
+}
+ 
+export interface PipelineRunResponse {
+  runId: string;
+  pipelineId: string;
+  status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
+  currentStep?: string;
+  percentage: number;
+  message: string;
+  outputs?: unknown;
+  error?: string;
+  startedAt: string;
+  endedAt?: string;
+}
+ 
+export interface PipelineCompleteEvent {
+  runId: string;
+  pipelineId: string;
+  status: string;
+  outputs?: unknown;
+  error?: string;
+}
+ 
+// === Pipeline Client ===
+ 
+export class PipelineClient {
+  /**
+   * List all available pipelines
+   */
+  static async listPipelines(options?: {
+    category?: string;
+  }): Promise<PipelineInfo[]> {
+    try {
+      const pipelines = await invoke<PipelineInfo[]>('pipeline_list', {
+        category: options?.category || null,
+      });
+      return pipelines;
+    } catch (error) {
+      console.error('Failed to list pipelines:', error);
+      throw new Error(`Failed to list pipelines: ${error}`);
+    }
+  }
+ 
+  /**
+   * Get a specific pipeline by ID
+   */
+  static async getPipeline(pipelineId: string): Promise<PipelineInfo> {
+    try {
+      const pipeline = await invoke<PipelineInfo>('pipeline_get', {
+        pipelineId,
+      });
+      return pipeline;
+    } catch (error) {
+      console.error(`Failed to get pipeline ${pipelineId}:`, error);
+      throw new Error(`Failed to get pipeline: ${error}`);
+    }
+  }
+ 
+  /**
+   * Run a pipeline with the given inputs
+   */
+  static async runPipeline(request: RunPipelineRequest): Promise<RunPipelineResponse> {
+    try {
+      const response = await invoke<RunPipelineResponse>('pipeline_run', {
+        request,
+      });
+      return response;
+    } catch (error) {
+      console.error('Failed to run pipeline:', error);
+      throw new Error(`Failed to run pipeline: ${error}`);
+    }
+  }
+ 
+  /**
+   * Get the progress of a running pipeline
+   */
+  static async getProgress(runId: string): Promise<PipelineRunResponse> {
+    try {
+      const progress = await invoke<PipelineRunResponse>('pipeline_progress', {
+        runId,
+      });
+      return progress;
+    } catch (error) {
+      console.error(`Failed to get progress for run ${runId}:`, error);
+      throw new Error(`Failed to get progress: ${error}`);
+    }
+  }
+ 
+  /**
+   * Get the result of a completed pipeline run
+   */
+  static async getResult(runId: string): Promise<PipelineRunResponse> {
+    try {
+      const result = await invoke<PipelineRunResponse>('pipeline_result', {
+        runId,
+      });
+      return result;
+    } catch (error) {
+      console.error(`Failed to get result for run ${runId}:`, error);
+      throw new Error(`Failed to get result: ${error}`);
+    }
+  }
+ 
+  /**
+   * Cancel a running pipeline
+   */
+  static async cancel(runId: string): Promise<void> {
+    try {
+      await invoke('pipeline_cancel', { runId });
+    } catch (error) {
+      console.error(`Failed to cancel run ${runId}:`, error);
+      throw new Error(`Failed to cancel run: ${error}`);
+    }
+  }
+ 
+  /**
+   * List all runs
+   */
+  static async listRuns(): Promise<PipelineRunResponse[]> {
+    try {
+      const runs = await invoke<PipelineRunResponse[]>('pipeline_runs');
+      return runs;
+    } catch (error) {
+      console.error('Failed to list runs:', error);
+      throw new Error(`Failed to list runs: ${error}`);
+    }
+  }
+ 
+  /**
+   * Refresh pipeline discovery (rescan filesystem)
+   */
+  static async refresh(): Promise<PipelineInfo[]> {
+    try {
+      const pipelines = await invoke<PipelineInfo[]>('pipeline_refresh');
+      return pipelines;
+    } catch (error) {
+      console.error('Failed to refresh pipelines:', error);
+      throw new Error(`Failed to refresh pipelines: ${error}`);
+    }
+  }
+ 
+  /**
+   * Subscribe to pipeline completion events
+   */
+  static async onComplete(
+    callback: (event: PipelineCompleteEvent) => void
+  ): Promise<UnlistenFn> {
+    return listen<PipelineCompleteEvent>('pipeline-complete', (event) => {
+      callback(event.payload);
+    });
+  }
+ 
+  /**
+   * Run a pipeline and wait for completion
+   * Returns the final result
+   */
+  static async runAndWait(
+    request: RunPipelineRequest,
+    onProgress?: (progress: PipelineRunResponse) => void,
+    pollIntervalMs: number = 1000
+  ): Promise<PipelineRunResponse> {
+    // Start the pipeline
+    const { runId } = await this.runPipeline(request);
+ 
+    // Poll for progress until completion
+    let result = await this.getProgress(runId);
+ 
+    while (result.status === 'running' || result.status === 'pending') {
+      if (onProgress) {
+        onProgress(result);
+      }
+ 
+      await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
+      result = await this.getProgress(runId);
+    }
+ 
+    return result;
+  }
+}
+ 
+// === Utility Functions ===
+ 
+/**
+ * Format pipeline input type for display
+ */
+export function formatInputType(type: string): string {
+  const typeMap: Record<string, string> = {
+    string: '文本',
+    number: '数字',
+    boolean: '布尔值',
+    select: '单选',
+    'multi-select': '多选',
+    file: '文件',
+    text: '多行文本',
+  };
+  return typeMap[type] || type;
+}
+ 
+/**
+ * Get default value for input type
+ */
+export function getDefaultForType(type: string): unknown {
+  switch (type) {
+    case 'string':
+    case 'text':
+      return '';
+    case 'number':
+      return 0;
+    case 'boolean':
+      return false;
+    case 'select':
+      return null;
+    case 'multi-select':
+      return [];
+    case 'file':
+      return null;
+    default:
+      return null;
+  }
+}
+ 
+/**
+ * Validate pipeline inputs against schema
+ */
+export function validateInputs(
+  inputs: PipelineInputInfo[],
+  values: Record<string, unknown>
+): { valid: boolean; errors: string[] } {
+  const errors: string[] = [];
+ 
+  for (const input of inputs) {
+    const value = values[input.name];
+ 
+    // Check required
+    if (input.required && (value === undefined || value === null || value === '')) {
+      errors.push(`${input.label || input.name} 是必填项`);
+      continue;
+    }
+ 
+    // Skip validation if not provided and not required
+    if (value === undefined || value === null) {
+      continue;
+    }
+ 
+    // Type-specific validation
+    switch (input.inputType) {
+      case 'number':
+        if (typeof value !== 'number') {
+          errors.push(`${input.label || input.name} 必须是数字`);
+        }
+        break;
+      case 'boolean':
+        if (typeof value !== 'boolean') {
+          errors.push(`${input.label || input.name} 必须是布尔值`);
+        }
+        break;
+      case 'select':
+        if (input.options.length > 0 && !input.options.includes(String(value))) {
+          errors.push(`${input.label || input.name} 必须是有效选项`);
+        }
+        break;
+      case 'multi-select':
+        if (!Array.isArray(value)) {
+          errors.push(`${input.label || input.name} 必须是数组`);
+        } else if (input.options.length > 0) {
+          const invalid = value.filter((v) => !input.options.includes(String(v)));
+          if (invalid.length > 0) {
+            errors.push(`${input.label || input.name} 包含无效选项`);
+          }
+        }
+        break;
+    }
+  }
+ 
+  return {
+    valid: errors.length === 0,
+    errors,
+  };
+}
+ 
+// === React Hook ===
+ 
+import { useState, useEffect, useCallback } from 'react';
+ 
+export interface UsePipelineOptions {
+  category?: string;
+  autoRefresh?: boolean;
+  refreshInterval?: number;
+}
+ 
+export function usePipelines(options: UsePipelineOptions = {}) {
+  const [pipelines, setPipelines] = useState<PipelineInfo[]>([]);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState<string | null>(null);
+ 
+  const loadPipelines = useCallback(async () => {
+    setLoading(true);
+    setError(null);
+    try {
+      const result = await PipelineClient.listPipelines({
+        category: options.category,
+      });
+      setPipelines(result);
+    } catch (err) {
+      setError(err instanceof Error ? err.message : String(err));
+    } finally {
+      setLoading(false);
+    }
+  }, [options.category]);
+ 
+  const refresh = useCallback(async () => {
+    setLoading(true);
+    setError(null);
+    try {
+      const result = await PipelineClient.refresh();
+      // Filter by category if specified
+      const filtered = options.category
+        ? result.filter((p) => p.category === options.category)
+        : result;
+      setPipelines(filtered);
+    } catch (err) {
+      setError(err instanceof Error ? err.message : String(err));
+    } finally {
+      setLoading(false);
+    }
+  }, [options.category]);
+ 
+  useEffect(() => {
+    loadPipelines();
+  }, [loadPipelines]);
+ 
+  useEffect(() => {
+    if (options.autoRefresh && options.refreshInterval) {
+      const interval = setInterval(loadPipelines, options.refreshInterval);
+      return () => clearInterval(interval);
+    }
+  }, [options.autoRefresh, options.refreshInterval, loadPipelines]);
+ 
+  return {
+    pipelines,
+    loading,
+    error,
+    refresh,
+    reload: loadPipelines,
+  };
+}
+ 
+export interface UsePipelineRunOptions {
+  onComplete?: (result: PipelineRunResponse) => void;
+  onProgress?: (progress: PipelineRunResponse) => void;
+}
+ 
+export function usePipelineRun(options: UsePipelineRunOptions = {}) {
+  const [running, setRunning] = useState(false);
+  const [progress, setProgress] = useState<PipelineRunResponse | null>(null);
+  const [error, setError] = useState<string | null>(null);
+ 
+  const run = useCallback(
+    async (pipelineId: string, inputs: Record<string, unknown>) => {
+      setRunning(true);
+      setError(null);
+      setProgress(null);
+ 
+      try {
+        const result = await PipelineClient.runAndWait(
+          { pipelineId, inputs },
+          (p) => {
+            setProgress(p);
+            options.onProgress?.(p);
+          }
+        );
+ 
+        setProgress(result);
+        options.onComplete?.(result);
+        return result;
+      } catch (err) {
+        const errorMsg = err instanceof Error ? err.message : String(err);
+        setError(errorMsg);
+        throw err;
+      } finally {
+        setRunning(false);
+      }
+    },
+    [options]
+  );
+ 
+  const cancel = useCallback(async () => {
+    if (progress?.runId) {
+      await PipelineClient.cancel(progress.runId);
+      setRunning(false);
+    }
+  }, [progress?.runId]);
+ 
+  return {
+    run,
+    cancel,
+    running,
+    progress,
+    error,
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/pipeline-recommender.ts.html b/desktop/coverage/src/lib/pipeline-recommender.ts.html new file mode 100644 index 0000000..bba4b5c --- /dev/null +++ b/desktop/coverage/src/lib/pipeline-recommender.ts.html @@ -0,0 +1,973 @@ + + + + + + Code coverage report for src/lib/pipeline-recommender.ts + + + + + + + + + +
+
+

All files / src/lib pipeline-recommender.ts

+
+ +
+ 0% + Statements + 0/190 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/190 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Pipeline Recommender Service
+ *
+ * Analyzes user messages to recommend relevant Pipelines.
+ * Used by Agent conversation flow to proactively suggest workflows.
+ */
+ 
+import { PipelineInfo, PipelineClient } from './pipeline-client';
+ 
+// === Types ===
+ 
+export interface PipelineRecommendation {
+  pipeline: PipelineInfo;
+  confidence: number;  // 0-1
+  matchedKeywords: string[];
+  suggestedInputs: Record<string, unknown>;
+  reason: string;
+}
+ 
+export interface IntentPattern {
+  keywords: RegExp[];
+  category?: string;
+  pipelineId?: string;
+  minConfidence: number;
+  inputSuggestions?: (message: string) => Record<string, unknown>;
+}
+ 
+// === Intent Patterns ===
+ 
+const INTENT_PATTERNS: IntentPattern[] = [
+  // Education - Classroom
+  {
+    keywords: [
+      /课件|教案|备课|课堂|教学|ppt|幻灯片/i,
+      /上课|讲课|教材/i,
+      /生成.*课件|制作.*课件|创建.*课件/i,
+    ],
+    category: 'education',
+    pipelineId: 'classroom-generator',
+    minConfidence: 0.75,
+  },
+ 
+  // Marketing - Campaign
+  {
+    keywords: [
+      /营销|推广|宣传|市场.*方案|营销.*策略/i,
+      /产品.*推广|品牌.*宣传/i,
+      /广告.*方案|营销.*计划/i,
+      /生成.*营销|制作.*营销/i,
+    ],
+    category: 'marketing',
+    pipelineId: 'marketing-campaign',
+    minConfidence: 0.72,
+  },
+ 
+  // Legal - Contract Review
+  {
+    keywords: [
+      /合同.*审查|合同.*风险|合同.*检查/i,
+      /审查.*合同|检查.*合同|分析.*合同/i,
+      /法律.*审查|合规.*检查/i,
+      /合同.*条款|条款.*风险/i,
+    ],
+    category: 'legal',
+    pipelineId: 'contract-review',
+    minConfidence: 0.78,
+  },
+ 
+  // Research - Literature Review
+  {
+    keywords: [
+      /文献.*综述|文献.*分析|文献.*检索/i,
+      /研究.*综述|学术.*综述/i,
+      /论文.*综述|论文.*调研/i,
+      /文献.*搜索|文献.*查找/i,
+    ],
+    category: 'research',
+    pipelineId: 'literature-review',
+    minConfidence: 0.73,
+  },
+ 
+  // Productivity - Meeting Summary
+  {
+    keywords: [
+      /会议.*纪要|会议.*总结|会议.*记录/i,
+      /整理.*会议|总结.*会议/i,
+      /会议.*整理|纪要.*生成/i,
+      /待办.*事项|行动.*项/i,
+    ],
+    category: 'productivity',
+    pipelineId: 'meeting-summary',
+    minConfidence: 0.70,
+  },
+ 
+  // Generic patterns for each category
+  {
+    keywords: [/帮我.*生成|帮我.*制作|帮我.*创建|自动.*生成/i],
+    minConfidence: 0.5,
+  },
+];
+ 
+// === Pipeline Recommender Class ===
+ 
+export class PipelineRecommender {
+  private pipelines: PipelineInfo[] = [];
+  private initialized = false;
+ 
+  /**
+   * Initialize the recommender by loading pipelines
+   */
+  async initialize(): Promise<void> {
+    if (this.initialized) return;
+ 
+    try {
+      this.pipelines = await PipelineClient.listPipelines();
+      this.initialized = true;
+    } catch (error) {
+      console.error('[PipelineRecommender] Failed to load pipelines:', error);
+    }
+  }
+ 
+  /**
+   * Refresh pipeline list
+   */
+  async refresh(): Promise<void> {
+    try {
+      this.pipelines = await PipelineClient.refresh();
+    } catch (error) {
+      console.error('[PipelineRecommender] Failed to refresh pipelines:', error);
+    }
+  }
+ 
+  /**
+   * Analyze a user message and return pipeline recommendations
+   */
+  async recommend(message: string): Promise<PipelineRecommendation[]> {
+    if (!this.initialized) {
+      await this.initialize();
+    }
+ 
+    const recommendations: PipelineRecommendation[] = [];
+ 
+    for (const pattern of INTENT_PATTERNS) {
+      const matches = pattern.keywords
+        .map(regex => regex.test(message))
+        .filter(Boolean);
+ 
+      if (matches.length === 0) continue;
+ 
+      const confidence = Math.min(
+        pattern.minConfidence + (matches.length - 1) * 0.05,
+        0.95
+      );
+ 
+      // Find matching pipeline
+      let matchingPipelines: PipelineInfo[] = [];
+ 
+      if (pattern.pipelineId) {
+        matchingPipelines = this.pipelines.filter(p => p.id === pattern.pipelineId);
+      } else if (pattern.category) {
+        matchingPipelines = this.pipelines.filter(p => p.category === pattern.category);
+      }
+ 
+      // If no specific pipeline found, recommend based on category or all
+      if (matchingPipelines.length === 0 && !pattern.pipelineId && !pattern.category) {
+        // Generic match - recommend top pipelines
+        matchingPipelines = this.pipelines.slice(0, 3);
+      }
+ 
+      for (const pipeline of matchingPipelines) {
+        const matchedKeywords = pattern.keywords
+          .filter(regex => regex.test(message))
+          .map(regex => regex.source);
+ 
+        const suggestion: PipelineRecommendation = {
+          pipeline,
+          confidence,
+          matchedKeywords,
+          suggestedInputs: pattern.inputSuggestions?.(message) ?? {},
+          reason: this.generateReason(pipeline, matchedKeywords, confidence),
+        };
+ 
+        // Avoid duplicates
+        if (!recommendations.find(r => r.pipeline.id === pipeline.id)) {
+          recommendations.push(suggestion);
+        }
+      }
+    }
+ 
+    // Sort by confidence and return top recommendations
+    return recommendations
+      .sort((a, b) => b.confidence - a.confidence)
+      .slice(0, 3);
+  }
+ 
+  /**
+   * Generate a human-readable reason for the recommendation
+   */
+  private generateReason(
+    pipeline: PipelineInfo,
+    matchedKeywords: string[],
+    confidence: number
+  ): string {
+    const confidenceText =
+      confidence >= 0.8 ? '非常适合' :
+      confidence >= 0.7 ? '适合' :
+      confidence >= 0.6 ? '可能适合' : '或许可以尝试';
+ 
+    if (matchedKeywords.length > 0) {
+      return `您的需求与【${pipeline.displayName}】${confidenceText}。这个 Pipeline 可以帮助您自动化完成相关任务。`;
+    }
+ 
+    return `【${pipeline.displayName}】可能对您有帮助。需要我为您启动吗?`;
+  }
+ 
+  /**
+   * Format recommendation for Agent message
+   */
+  formatRecommendationForAgent(rec: PipelineRecommendation): string {
+    const pipeline = rec.pipeline;
+    let message = `我可以使用【${pipeline.displayName}】为你自动完成这个任务。\n\n`;
+    message += `**功能说明**: ${pipeline.description}\n\n`;
+ 
+    if (Object.keys(rec.suggestedInputs).length > 0) {
+      message += `**我已识别到以下信息**:\n`;
+      for (const [key, value] of Object.entries(rec.suggestedInputs)) {
+        message += `- ${key}: ${value}\n`;
+      }
+      message += '\n';
+    }
+ 
+    message += `需要开始吗?`;
+ 
+    return message;
+  }
+ 
+  /**
+   * Check if a message might benefit from a pipeline
+   */
+  mightNeedPipeline(message: string): boolean {
+    const pipelineKeywords = [
+      '生成', '创建', '制作', '分析', '审查', '整理',
+      '总结', '归纳', '提取', '转换', '自动化',
+      '帮我', '请帮我', '能不能', '可以',
+    ];
+ 
+    return pipelineKeywords.some(kw => message.includes(kw));
+  }
+}
+ 
+// === Singleton Instance ===
+ 
+export const pipelineRecommender = new PipelineRecommender();
+ 
+// === React Hook ===
+ 
+import { useState, useEffect, useCallback } from 'react';
+ 
+export interface UsePipelineRecommendationOptions {
+  autoInit?: boolean;
+  minConfidence?: number;
+}
+ 
+export function usePipelineRecommendation(options: UsePipelineRecommendationOptions = {}) {
+  const [recommender] = useState(() => new PipelineRecommender());
+  const [initialized, setInitialized] = useState(false);
+  const [loading, setLoading] = useState(false);
+ 
+  useEffect(() => {
+    if (options.autoInit !== false) {
+      recommender.initialize().then(() => setInitialized(true));
+    }
+  }, [recommender, options.autoInit]);
+ 
+  const recommend = useCallback(async (message: string) => {
+    setLoading(true);
+    try {
+      const results = await recommender.recommend(message);
+      const minConf = options.minConfidence ?? 0.6;
+      return results.filter(r => r.confidence >= minConf);
+    } finally {
+      setLoading(false);
+    }
+  }, [recommender, options.minConfidence]);
+ 
+  return {
+    recommend,
+    initialized,
+    loading,
+    refresh: recommender.refresh.bind(recommender),
+    mightNeedPipeline: recommender.mightNeedPipeline,
+    formatRecommendationForAgent: recommender.formatRecommendationForAgent.bind(recommender),
+  };
+}
+ 
+export default pipelineRecommender;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/request-helper.ts.html b/desktop/coverage/src/lib/request-helper.ts.html new file mode 100644 index 0000000..7267da3 --- /dev/null +++ b/desktop/coverage/src/lib/request-helper.ts.html @@ -0,0 +1,1711 @@ + + + + + + Code coverage report for src/lib/request-helper.ts + + + + + + + + + +
+
+

All files / src/lib request-helper.ts

+
+ +
+ 88.95% + Statements + 290/326 +
+ + +
+ 80% + Branches + 48/60 +
+ + +
+ 100% + Functions + 23/23 +
+ + +
+ 88.95% + Lines + 290/326 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +15x +15x +15x +15x +15x +15x +15x +15x +  +  +1x +5x +5x +  +  +1x +2x +2x +  +  +1x +3x +3x +1x +  +1x +1x +2x +2x +2x +1x +  +  +  +3x +3x +3x +  +  +  +  +  +  +  +  +3x +3x +3x +3x +3x +  +3x +  +3x +  +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +16x +  +16x +16x +  +16x +19x +19x +  +19x +19x +19x +19x +19x +  +17x +  +19x +  +5x +5x +5x +  +  +  +5x +5x +5x +5x +5x +5x +  +  +5x +3x +3x +3x +3x +3x +3x +3x +3x +  +2x +2x +  +  +12x +19x +4x +  +  +4x +2x +  +  +2x +  +  +  +  +  +  +  +  +  +2x +2x +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +2x +4x +4x +4x +4x +4x +4x +19x +  +  +16x +16x +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +  +2x +2x +2x +1x +1x +1x +1x +1x +1x +1x +2x +  +  +  +  +  +  +  +1x +1x +10x +  +  +  +  +  +  +  +  +  +1x +  +13x +1x +1x +  +13x +13x +13x +3x +3x +  +13x +13x +  +  +  +  +  +  +  +  +  +  +  +1x +3x +3x +3x +3x +3x +3x +  +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +2x +2x +  +2x +3x +  +1x +1x +  +1x +1x +3x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +3x +3x +2x +2x +2x +2x +2x +1x +3x +  +  +  +  +  +  +  +1x +5x +5x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +3x +3x +1x +1x +1x +1x +  +  +  +  +1x +2x +2x +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x + 
/**
+ * Request Helper Module
+ *
+ * Provides request timeout, automatic retry with exponential backoff,
+ * and request cancellation support for API clients.
+ *
+ * @module lib/request-helper
+ */
+ 
+// === Configuration Types ===
+ 
+export interface RequestConfig {
+  /** Timeout in milliseconds, default 30000 */
+  timeout?: number;
+  /** Number of retry attempts, default 3 */
+  retries?: number;
+  /** Base retry delay in milliseconds, default 1000 (exponential backoff applied) */
+  retryDelay?: number;
+  /** HTTP status codes that trigger retry, default [408, 429, 500, 502, 503, 504] */
+  retryOn?: number[];
+  /** Maximum retry delay cap in milliseconds, default 30000 */
+  maxRetryDelay?: number;
+}
+ 
+export const DEFAULT_REQUEST_CONFIG: Required<RequestConfig> = {
+  timeout: 30000,
+  retries: 3,
+  retryDelay: 1000,
+  retryOn: [408, 429, 500, 502, 503, 504],
+  maxRetryDelay: 30000,
+};
+ 
+// === Error Types ===
+ 
+export class RequestError extends Error {
+  constructor(
+    message: string,
+    public readonly status: number,
+    public readonly statusText: string,
+    public readonly responseBody?: string
+  ) {
+    super(message);
+    this.name = 'RequestError';
+  }
+ 
+  /** Check if error is retryable based on status code */
+  isRetryable(retryCodes: number[] = DEFAULT_REQUEST_CONFIG.retryOn): boolean {
+    return retryCodes.includes(this.status);
+  }
+ 
+  /** Check if error is a timeout */
+  isTimeout(): boolean {
+    return this.status === 408 || this.message.includes('timeout');
+  }
+ 
+  /** Check if error is an authentication error (should NOT retry) */
+  isAuthError(): boolean {
+    return this.status === 401 || this.status === 403;
+  }
+}
+ 
+export class RequestCancelledError extends Error {
+  constructor(message: string = 'Request cancelled') {
+    super(message);
+    this.name = 'RequestCancelledError';
+  }
+}
+ 
+// === Helper Functions ===
+ 
+function delay(ms: number): Promise<void> {
+  return new Promise(resolve => setTimeout(resolve, ms));
+}
+ 
+/**
+ * Calculate exponential backoff delay with jitter
+ * @param baseDelay Base delay in ms
+ * @param attempt Current attempt number (0-indexed)
+ * @param maxDelay Maximum delay cap
+ * @returns Delay in milliseconds
+ */
+function calculateBackoff(
+  baseDelay: number,
+  attempt: number,
+  maxDelay: number = DEFAULT_REQUEST_CONFIG.maxRetryDelay
+): number {
+  // Exponential backoff: baseDelay * 2^attempt
+  const exponentialDelay = baseDelay * Math.pow(2, attempt);
+  // Cap at maxDelay
+  const cappedDelay = Math.min(exponentialDelay, maxDelay);
+  // Add jitter (0-25% of delay) to prevent thundering herd
+  const jitter = cappedDelay * 0.25 * Math.random();
+  return Math.floor(cappedDelay + jitter);
+}
+ 
+// === Request with Retry ===
+ 
+export interface RequestWithRetryOptions extends RequestInit {
+  /** Request configuration for timeout and retry */
+  config?: RequestConfig;
+}
+ 
+/**
+ * Execute a fetch request with timeout and automatic retry support.
+ *
+ * Features:
+ * - Configurable timeout with AbortController
+ * - Automatic retry with exponential backoff
+ * - Configurable retry status codes
+ * - Jitter to prevent thundering herd
+ *
+ * @param url Request URL
+ * @param options Fetch options + request config
+ * @param config Request configuration (timeout, retries, etc.)
+ * @returns Promise<Response>
+ * @throws RequestError on failure after all retries exhausted
+ * @throws RequestCancelledError if request was cancelled
+ */
+export async function requestWithRetry(
+  url: string,
+  options: RequestInit = {},
+  config: RequestConfig = {}
+): Promise<Response> {
+  const {
+    timeout = DEFAULT_REQUEST_CONFIG.timeout,
+    retries = DEFAULT_REQUEST_CONFIG.retries,
+    retryDelay = DEFAULT_REQUEST_CONFIG.retryDelay,
+    retryOn = DEFAULT_REQUEST_CONFIG.retryOn,
+  } = config;
+ 
+  let lastError: RequestError | null = null;
+  let responseBody = '';
+ 
+  for (let attempt = 0; attempt <= retries; attempt++) {
+    const controller = new AbortController();
+    const timeoutId = setTimeout(() => controller.abort(), timeout);
+ 
+    try {
+      const response = await fetch(url, {
+        ...options,
+        signal: controller.signal,
+      });
+ 
+      clearTimeout(timeoutId);
+ 
+      if (!response.ok) {
+        // Try to read response body for error details
+        try {
+          responseBody = await response.text();
+        } catch {
+          responseBody = '';
+        }
+ 
+        const error = new RequestError(
+          `Request failed: ${response.status} ${response.statusText}`,
+          response.status,
+          response.statusText,
+          responseBody
+        );
+ 
+        // Check if we should retry
+        if (retryOn.includes(response.status) && attempt < retries) {
+          const backoff = calculateBackoff(retryDelay, attempt);
+          console.warn(
+            `[RequestHelper] Request failed (${response.status}), ` +
+            `retrying in ${backoff}ms (attempt ${attempt + 1}/${retries})`
+          );
+          await delay(backoff);
+          continue;
+        }
+ 
+        throw error;
+      }
+ 
+      // Success - return response
+      return response;
+    } catch (error) {
+      clearTimeout(timeoutId);
+ 
+      // Re-throw RequestError (already formatted)
+      if (error instanceof RequestError) {
+        lastError = error;
+ 
+        // Check if we should retry
+        if (error.isRetryable(retryOn) && attempt < retries) {
+          const backoff = calculateBackoff(retryDelay, attempt);
+          console.warn(
+            `[RequestHelper] Request error (${error.status}), ` +
+            `retrying in ${backoff}ms (attempt ${attempt + 1}/${retries})`
+          );
+          await delay(backoff);
+          continue;
+        }
+ 
+        throw error;
+      }
+ 
+      // Handle AbortError (timeout)
+      if (error instanceof Error && error.name === 'AbortError') {
+        const timeoutError = new RequestError(
+          `Request timeout after ${timeout}ms`,
+          408,
+          'Request Timeout'
+        );
+ 
+        // Retry on timeout
+        if (attempt < retries) {
+          const backoff = calculateBackoff(retryDelay, attempt);
+          console.warn(
+            `[RequestHelper] Request timed out, ` +
+            `retrying in ${backoff}ms (attempt ${attempt + 1}/${retries})`
+          );
+          await delay(backoff);
+          lastError = timeoutError;
+          continue;
+        }
+ 
+        throw timeoutError;
+      }
+ 
+      // Handle cancellation
+      if (error instanceof RequestCancelledError) {
+        throw error;
+      }
+ 
+      // Unknown error - wrap and throw
+      throw new RequestError(
+        error instanceof Error ? error.message : 'Unknown error',
+        0,
+        'Unknown Error',
+        error instanceof Error ? error.stack : String(error)
+      );
+    }
+  }
+ 
+  // All retries exhausted
+  throw lastError || new RequestError('All retry attempts exhausted', 0, 'Retry Exhausted');
+}
+ 
+/**
+ * Execute a request and parse JSON response.
+ * Combines requestWithRetry with JSON parsing.
+ *
+ * @param url Request URL
+ * @param options Fetch options
+ * @param config Request configuration
+ * @returns Parsed JSON response
+ */
+export async function requestJson<T = unknown>(
+  url: string,
+  options: RequestInit = {},
+  config: RequestConfig = {}
+): Promise<T> {
+  const response = await requestWithRetry(url, options, config);
+ 
+  try {
+    return await response.json();
+  } catch (error) {
+    throw new RequestError(
+      `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,
+      0,
+      'Parse Error',
+      await response.text().catch(() => '')
+    );
+  }
+}
+ 
+// === Request Manager (Cancellation Support) ===
+ 
+/**
+ * Manages multiple concurrent requests with cancellation support.
+ * Provides centralized control over request lifecycle.
+ */
+export class RequestManager {
+  private controllers = new Map<string, AbortController>();
+  private requestConfigs = new Map<string, RequestConfig>();
+ 
+  /**
+   * Create a new request with an ID for tracking.
+   * Returns the AbortController for signal attachment.
+   *
+   * @param id Unique request identifier
+   * @param config Optional request configuration
+   * @returns AbortController for the request
+   */
+  createRequest(id: string, config?: RequestConfig): AbortController {
+    // Cancel existing request with same ID
+    if (this.controllers.has(id)) {
+      this.cancelRequest(id);
+    }
+ 
+    const controller = new AbortController();
+    this.controllers.set(id, controller);
+    if (config) {
+      this.requestConfigs.set(id, config);
+    }
+ 
+    return controller;
+  }
+ 
+  /**
+   * Execute a managed request with automatic tracking.
+   * The request will be automatically removed when complete.
+   *
+   * @param id Unique request identifier
+   * @param url Request URL
+   * @param options Fetch options
+   * @param config Request configuration
+   * @returns Response promise
+   */
+  async executeManaged(
+    id: string,
+    url: string,
+    options: RequestInit = {},
+    config: RequestConfig = {}
+  ): Promise<Response> {
+    const controller = this.createRequest(id, config);
+ 
+    try {
+      const response = await requestWithRetry(
+        url,
+        {
+          ...options,
+          signal: controller.signal,
+        },
+        config
+      );
+ 
+      // Clean up on success
+      this.controllers.delete(id);
+      this.requestConfigs.delete(id);
+ 
+      return response;
+    } catch (error) {
+      // Clean up on error
+      this.controllers.delete(id);
+      this.requestConfigs.delete(id);
+ 
+      throw error;
+    }
+  }
+ 
+  /**
+   * Execute a managed JSON request with automatic tracking.
+   *
+   * @param id Unique request identifier
+   * @param url Request URL
+   * @param options Fetch options
+   * @param config Request configuration
+   * @returns Parsed JSON response
+   */
+  async executeManagedJson<T = unknown>(
+    id: string,
+    url: string,
+    options: RequestInit = {},
+    config: RequestConfig = {}
+  ): Promise<T> {
+    const response = await this.executeManaged(id, url, options, config);
+ 
+    try {
+      return await response.json();
+    } catch (error) {
+      throw new RequestError(
+        `Failed to parse JSON response: ${error instanceof Error ? error.message : 'Unknown error'}`,
+        0,
+        'Parse Error',
+        await response.text().catch(() => '')
+      );
+    }
+  }
+ 
+  /**
+   * Cancel a specific request by ID.
+   *
+   * @param id Request identifier
+   * @returns true if request was cancelled, false if not found
+   */
+  cancelRequest(id: string): boolean {
+    const controller = this.controllers.get(id);
+    if (controller) {
+      controller.abort();
+      this.controllers.delete(id);
+      this.requestConfigs.delete(id);
+      return true;
+    }
+    return false;
+  }
+ 
+  /**
+   * Check if a request is currently in progress.
+   *
+   * @param id Request identifier
+   * @returns true if request is active
+   */
+  isRequestActive(id: string): boolean {
+    return this.controllers.has(id);
+  }
+ 
+  /**
+   * Get all active request IDs.
+   *
+   * @returns Array of active request IDs
+   */
+  getActiveRequestIds(): string[] {
+    return Array.from(this.controllers.keys());
+  }
+ 
+  /**
+   * Cancel all active requests.
+   */
+  cancelAll(): void {
+    this.controllers.forEach((controller, id) => {
+      controller.abort();
+      console.log(`[RequestManager] Cancelled request: ${id}`);
+    });
+    this.controllers.clear();
+    this.requestConfigs.clear();
+  }
+ 
+  /**
+   * Get the number of active requests.
+   */
+  get activeCount(): number {
+    return this.controllers.size;
+  }
+}
+ 
+// === Default Request Manager Instance ===
+ 
+/**
+ * Global request manager instance for application-wide request tracking.
+ * Use this for simple cases; create new instances for isolated contexts.
+ */
+export const globalRequestManager = new RequestManager();
+ 
+// === Convenience Functions ===
+ 
+/**
+ * Create a GET request with retry support.
+ */
+export async function get(
+  url: string,
+  headers?: HeadersInit,
+  config?: RequestConfig
+): Promise<Response> {
+  return requestWithRetry(url, { method: 'GET', headers }, config);
+}
+ 
+/**
+ * Create a POST request with retry support.
+ */
+export async function post(
+  url: string,
+  body?: unknown,
+  headers?: HeadersInit,
+  config?: RequestConfig
+): Promise<Response> {
+  return requestWithRetry(
+    url,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+        ...headers,
+      },
+      body: body ? JSON.stringify(body) : undefined,
+    },
+    config
+  );
+}
+ 
+/**
+ * Create a PUT request with retry support.
+ */
+export async function put(
+  url: string,
+  body?: unknown,
+  headers?: HeadersInit,
+  config?: RequestConfig
+): Promise<Response> {
+  return requestWithRetry(
+    url,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+        ...headers,
+      },
+      body: body ? JSON.stringify(body) : undefined,
+    },
+    config
+  );
+}
+ 
+/**
+ * Create a DELETE request with retry support.
+ */
+export async function del(
+  url: string,
+  headers?: HeadersInit,
+  config?: RequestConfig
+): Promise<Response> {
+  return requestWithRetry(url, { method: 'DELETE', headers }, config);
+}
+ 
+/**
+ * Create a PATCH request with retry support.
+ */
+export async function patch(
+  url: string,
+  body?: unknown,
+  headers?: HeadersInit,
+  config?: RequestConfig
+): Promise<Response> {
+  return requestWithRetry(
+    url,
+    {
+      method: 'PATCH',
+      headers: {
+        'Content-Type': 'application/json',
+        ...headers,
+      },
+      body: body ? JSON.stringify(body) : undefined,
+    },
+    config
+  );
+}
+ 
+export default {
+  requestWithRetry,
+  requestJson,
+  RequestManager,
+  globalRequestManager,
+  RequestError,
+  RequestCancelledError,
+  get,
+  post,
+  put,
+  del,
+  patch,
+  DEFAULT_REQUEST_CONFIG,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/secure-storage.ts.html b/desktop/coverage/src/lib/secure-storage.ts.html new file mode 100644 index 0000000..99b937d --- /dev/null +++ b/desktop/coverage/src/lib/secure-storage.ts.html @@ -0,0 +1,1567 @@ + + + + + + Code coverage report for src/lib/secure-storage.ts + + + + + + + + + +
+
+

All files / src/lib secure-storage.ts

+
+ +
+ 34.17% + Statements + 95/278 +
+ + +
+ 67.85% + Branches + 19/28 +
+ + +
+ 40.9% + Functions + 9/22 +
+ + +
+ 34.17% + Lines + 95/278 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +4951x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +1x +  +  +1x +  +  +  +  +23x +23x +23x +23x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +23x +  +  +  +  +  +1x +  +  +  +  +  +1x +11x +  +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +11x +  +  +  +  +  +  +1x +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +11x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +17x +17x +16x +16x +  +1x +  +1x +1x +1x +1x +  +1x +1x +1x +  +  +  +  +7x +7x +7x +7x +7x +  +  +7x +  +  +  +  +11x +11x +11x +  +11x +1x +  +1x +1x +1x +  +10x +10x +10x +10x +  +10x +11x +  +  +  +  +11x +  +  +11x +  +  +  +  +  +11x +11x +  +11x +11x +  +11x +7x +7x +7x +7x +7x +1x +  +1x +7x +  +  +5x +11x +2x +2x +  +3x +11x +  +  +11x +  +  +  +  +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ZCLAW Secure Storage
+ *
+ * Provides secure credential storage using the OS keyring/keychain.
+ * Falls back to encrypted localStorage when not running in Tauri or if keyring is unavailable.
+ *
+ * Platform support:
+ * - Windows: DPAPI
+ * - macOS: Keychain
+ * - Linux: Secret Service API (gnome-keyring, kwallet, etc.)
+ * - Fallback: AES-GCM encrypted localStorage
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+import { isTauriRuntime } from './tauri-gateway';
+import {
+  deriveKey,
+  encrypt,
+  decrypt,
+  generateMasterKey,
+} from './crypto-utils';
+ 
+// Cache for keyring availability check
+let keyringAvailable: boolean | null = null;
+ 
+// Encryption constants for localStorage fallback
+const ENCRYPTED_PREFIX = 'enc_';
+const MASTER_KEY_NAME = 'zclaw-master-key';
+ 
+// Cache for the derived crypto key
+let cachedCryptoKey: CryptoKey | null = null;
+ 
+/**
+ * Check if secure storage (keyring) is available
+ */
+export async function isSecureStorageAvailable(): Promise<boolean> {
+  if (!isTauriRuntime()) {
+    return false;
+  }
+ 
+  // Use cached result if available
+  if (keyringAvailable !== null) {
+    return keyringAvailable;
+  }
+ 
+  try {
+    keyringAvailable = await invoke<boolean>('secure_store_is_available');
+    return keyringAvailable;
+  } catch (error) {
+    console.warn('[SecureStorage] Keyring not available:', error);
+    keyringAvailable = false;
+    return false;
+  }
+}
+ 
+/**
+ * Secure storage interface
+ * Uses OS keyring when available, falls back to encrypted localStorage
+ */
+export const secureStorage = {
+  /**
+   * Store a value securely
+   * @param key - Storage key
+   * @param value - Value to store
+   */
+  async set(key: string, value: string): Promise<void> {
+    const trimmedValue = value.trim();
+ 
+    if (await isSecureStorageAvailable()) {
+      try {
+        if (trimmedValue) {
+          await invoke('secure_store_set', { key, value: trimmedValue });
+        } else {
+          await invoke('secure_store_delete', { key });
+        }
+        // Also write encrypted backup to localStorage for migration support
+        await writeEncryptedLocalStorage(key, trimmedValue);
+        return;
+      } catch (error) {
+        console.warn('[SecureStorage] Failed to use keyring, falling back to encrypted localStorage:', error);
+      }
+    }
+ 
+    // Fallback to encrypted localStorage
+    await writeEncryptedLocalStorage(key, trimmedValue);
+  },
+ 
+  /**
+   * Retrieve a value from secure storage
+   * @param key - Storage key
+   * @returns Stored value or null if not found
+   */
+  async get(key: string): Promise<string | null> {
+    if (await isSecureStorageAvailable()) {
+      try {
+        const value = await invoke<string>('secure_store_get', { key });
+        if (value !== null && value !== undefined && value !== '') {
+          return value;
+        }
+        // If keyring returned empty, try encrypted localStorage fallback for migration
+        return await readEncryptedLocalStorage(key);
+      } catch (error) {
+        console.warn('[SecureStorage] Failed to read from keyring, trying encrypted localStorage:', error);
+      }
+    }
+ 
+    // Fallback to encrypted localStorage
+    return await readEncryptedLocalStorage(key);
+  },
+ 
+  /**
+   * Delete a value from secure storage
+   * @param key - Storage key
+   */
+  async delete(key: string): Promise<void> {
+    if (await isSecureStorageAvailable()) {
+      try {
+        await invoke('secure_store_delete', { key });
+      } catch (error) {
+        console.warn('[SecureStorage] Failed to delete from keyring:', error);
+      }
+    }
+ 
+    // Always clear localStorage backup
+    clearLocalStorageBackup(key);
+  },
+ 
+  /**
+   * Check if secure storage is being used (vs localStorage fallback)
+   */
+  async isUsingKeyring(): Promise<boolean> {
+    return isSecureStorageAvailable();
+  },
+};
+ 
+/**
+ * localStorage backup functions for migration and fallback
+ * Now with AES-GCM encryption for non-Tauri environments
+ */
+ 
+/**
+ * Get or create the master encryption key for localStorage fallback
+ */
+async function getOrCreateMasterKey(): Promise<CryptoKey> {
+  if (cachedCryptoKey) {
+    return cachedCryptoKey;
+  }
+ 
+  let masterKeyRaw = localStorage.getItem(MASTER_KEY_NAME);
+ 
+  if (!masterKeyRaw) {
+    masterKeyRaw = generateMasterKey();
+    localStorage.setItem(MASTER_KEY_NAME, masterKeyRaw);
+  }
+ 
+  cachedCryptoKey = await deriveKey(masterKeyRaw);
+  return cachedCryptoKey;
+}
+ 
+/**
+ * Check if a stored value is encrypted (has iv and data fields)
+ */
+function isEncrypted(value: string): boolean {
+  try {
+    const parsed = JSON.parse(value);
+    return parsed && typeof parsed.iv === 'string' && typeof parsed.data === 'string';
+  } catch {
+    return false;
+  }
+}
+ 
+/**
+ * Write encrypted data to localStorage
+ */
+async function writeEncryptedLocalStorage(key: string, value: string): Promise<void> {
+  try {
+    const encryptedKey = ENCRYPTED_PREFIX + key;
+ 
+    if (!value) {
+      localStorage.removeItem(encryptedKey);
+      // Also remove legacy unencrypted key
+      localStorage.removeItem(key);
+      return;
+    }
+ 
+    try {
+      const cryptoKey = await getOrCreateMasterKey();
+      const encrypted = await encrypt(value, cryptoKey);
+      localStorage.setItem(encryptedKey, JSON.stringify(encrypted));
+      // Remove legacy unencrypted key if it exists
+      localStorage.removeItem(key);
+    } catch (error) {
+      console.error('[SecureStorage] Encryption failed:', error);
+      // Fallback to plaintext if encryption fails (should not happen)
+      localStorage.setItem(key, value);
+    }
+  } catch {
+    // Ignore localStorage failures
+  }
+}
+ 
+/**
+ * Read and decrypt data from localStorage
+ * Supports both encrypted and legacy unencrypted formats
+ */
+async function readEncryptedLocalStorage(key: string): Promise<string | null> {
+  try {
+    // Try encrypted key first
+    const encryptedKey = ENCRYPTED_PREFIX + key;
+    const encryptedRaw = localStorage.getItem(encryptedKey);
+ 
+    if (encryptedRaw && isEncrypted(encryptedRaw)) {
+      try {
+        const cryptoKey = await getOrCreateMasterKey();
+        const encrypted = JSON.parse(encryptedRaw);
+        return await decrypt(encrypted, cryptoKey);
+      } catch (error) {
+        console.error('[SecureStorage] Decryption failed:', error);
+        // Fall through to try legacy key
+      }
+    }
+ 
+    // Try legacy unencrypted key for backward compatibility
+    const legacyValue = localStorage.getItem(key);
+    if (legacyValue !== null) {
+      return legacyValue;
+    }
+ 
+    return null;
+  } catch {
+    return null;
+  }
+}
+ 
+/**
+ * Clear data from localStorage (both encrypted and legacy)
+ */
+function clearLocalStorageBackup(key: string): void {
+  try {
+    localStorage.removeItem(ENCRYPTED_PREFIX + key);
+    localStorage.removeItem(key);
+  } catch {
+    // Ignore localStorage failures
+  }
+}
+ 
+// Keep synchronous versions for backward compatibility (deprecated)
+function writeLocalStorageBackup(key: string, value: string): void {
+  try {
+    if (value) {
+      localStorage.setItem(key, value);
+    } else {
+      localStorage.removeItem(key);
+    }
+  } catch {
+    // Ignore localStorage failures
+  }
+}
+ 
+function readLocalStorageBackup(key: string): string | null {
+  try {
+    return localStorage.getItem(key);
+  } catch {
+    return null;
+  }
+}
+ 
+/**
+ * Synchronous versions for compatibility with existing code
+ * These use localStorage only and are provided for gradual migration
+ */
+export const secureStorageSync = {
+  /**
+   * Synchronously get a value from localStorage (for migration only)
+   * @deprecated Use async secureStorage.get() instead
+   */
+  get(key: string): string | null {
+    return readLocalStorageBackup(key);
+  },
+ 
+  /**
+   * Synchronously set a value in localStorage (for migration only)
+   * @deprecated Use async secureStorage.set() instead
+   */
+  set(key: string, value: string): void {
+    writeLocalStorageBackup(key, value);
+  },
+ 
+  /**
+   * Synchronously delete a value from localStorage (for migration only)
+   * @deprecated Use async secureStorage.delete() instead
+   */
+  delete(key: string): void {
+    clearLocalStorageBackup(key);
+  },
+};
+ 
+// === Device Keys Secure Storage ===
+ 
+/**
+ * Storage keys for Ed25519 device keys
+ */
+const DEVICE_KEYS_PRIVATE_KEY = 'zclaw_device_keys_private';
+const DEVICE_KEYS_PUBLIC_KEY = 'zclaw_device_keys_public';
+const DEVICE_KEYS_CREATED = 'zclaw_device_keys_created';
+const DEVICE_KEYS_LEGACY = 'zclaw_device_keys'; // Old format for migration
+ 
+/**
+ * Ed25519 SignKeyPair interface (compatible with tweetnacl)
+ */
+export interface Ed25519KeyPair {
+  publicKey: Uint8Array;
+  secretKey: Uint8Array;
+}
+ 
+/**
+ * Legacy device keys format (stored in localStorage)
+ * Used for migration from the old format.
+ */
+interface LegacyDeviceKeys {
+  deviceId: string;
+  publicKeyBase64: string;
+  secretKeyBase64: string;
+}
+ 
+/**
+ * Base64 URL-safe encode (without padding)
+ */
+function base64UrlEncode(bytes: Uint8Array): string {
+  let binary = '';
+  for (let i = 0; i < bytes.length; i++) {
+    binary += String.fromCharCode(bytes[i]);
+  }
+  return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
+}
+ 
+/**
+ * Base64 URL-safe decode
+ */
+function base64UrlDecode(str: string): Uint8Array {
+  str = str.replace(/-/g, '+').replace(/_/g, '/');
+  while (str.length % 4) str += '=';
+  const binary = atob(str);
+  const bytes = new Uint8Array(binary.length);
+  for (let i = 0; i < binary.length; i++) {
+    bytes[i] = binary.charCodeAt(i);
+  }
+  return bytes;
+}
+ 
+/**
+ * Store device keys securely.
+ * The secret key is stored in the OS keyring when available,
+ * falling back to localStorage with a warning.
+ *
+ * @param publicKey - Ed25519 public key (32 bytes)
+ * @param secretKey - Ed25519 secret key (64 bytes)
+ */
+export async function storeDeviceKeys(
+  publicKey: Uint8Array,
+  secretKey: Uint8Array
+): Promise<void> {
+  const publicKeyBase64 = base64UrlEncode(publicKey);
+  const secretKeyBase64 = base64UrlEncode(secretKey);
+  const createdAt = Date.now().toString();
+ 
+  if (await isSecureStorageAvailable()) {
+    // Store secret key in keyring (most secure)
+    await secureStorage.set(DEVICE_KEYS_PRIVATE_KEY, secretKeyBase64);
+    // Public key and metadata can go to localStorage (non-sensitive)
+    localStorage.setItem(DEVICE_KEYS_PUBLIC_KEY, publicKeyBase64);
+    localStorage.setItem(DEVICE_KEYS_CREATED, createdAt);
+    // Clear legacy format if present
+    try {
+      localStorage.removeItem(DEVICE_KEYS_LEGACY);
+    } catch {
+      // Ignore
+    }
+  } else {
+    // Fallback: store in localStorage (less secure, but better than nothing)
+    console.warn(
+      '[SecureStorage] Keyring not available, using localStorage fallback for device keys. ' +
+        'Consider running in Tauri for secure key storage.'
+    );
+    localStorage.setItem(
+      DEVICE_KEYS_LEGACY,
+      JSON.stringify({
+        publicKeyBase64,
+        secretKeyBase64,
+        createdAt,
+      })
+    );
+  }
+}
+ 
+/**
+ * Retrieve device keys from secure storage.
+ * Attempts to read from keyring first, then falls back to localStorage.
+ * Also handles migration from the legacy format.
+ *
+ * @returns Key pair or null if not found
+ */
+export async function getDeviceKeys(): Promise<Ed25519KeyPair | null> {
+  // Try keyring storage first (new format)
+  if (await isSecureStorageAvailable()) {
+    const secretKeyBase64 = await secureStorage.get(DEVICE_KEYS_PRIVATE_KEY);
+    const publicKeyBase64 = localStorage.getItem(DEVICE_KEYS_PUBLIC_KEY);
+ 
+    if (secretKeyBase64 && publicKeyBase64) {
+      try {
+        return {
+          publicKey: base64UrlDecode(publicKeyBase64),
+          secretKey: base64UrlDecode(secretKeyBase64),
+        };
+      } catch (e) {
+        console.warn('[SecureStorage] Failed to decode keys from keyring:', e);
+      }
+    }
+  }
+ 
+  // Try legacy format (localStorage)
+  const legacyStored = localStorage.getItem(DEVICE_KEYS_LEGACY);
+  if (legacyStored) {
+    try {
+      const parsed: LegacyDeviceKeys = JSON.parse(legacyStored);
+      return {
+        publicKey: base64UrlDecode(parsed.publicKeyBase64),
+        secretKey: base64UrlDecode(parsed.secretKeyBase64),
+      };
+    } catch (e) {
+      console.warn('[SecureStorage] Failed to decode legacy keys:', e);
+    }
+  }
+ 
+  return null;
+}
+ 
+/**
+ * Delete device keys from all storage locations.
+ * Used when keys need to be regenerated.
+ */
+export async function deleteDeviceKeys(): Promise<void> {
+  // Delete from keyring
+  if (await isSecureStorageAvailable()) {
+    await secureStorage.delete(DEVICE_KEYS_PRIVATE_KEY);
+  }
+ 
+  // Delete from localStorage
+  try {
+    localStorage.removeItem(DEVICE_KEYS_PUBLIC_KEY);
+    localStorage.removeItem(DEVICE_KEYS_CREATED);
+    localStorage.removeItem(DEVICE_KEYS_LEGACY);
+  } catch {
+    // Ignore localStorage errors
+  }
+}
+ 
+/**
+ * Check if device keys exist in any storage.
+ */
+export async function hasDeviceKeys(): Promise<boolean> {
+  const keys = await getDeviceKeys();
+  return keys !== null;
+}
+ 
+/**
+ * Get the creation timestamp of stored device keys.
+ * Returns null if keys don't exist or timestamp is unavailable.
+ */
+export async function getDeviceKeysCreatedAt(): Promise<number | null> {
+  // Try new format
+  const created = localStorage.getItem(DEVICE_KEYS_CREATED);
+  if (created) {
+    const parsed = parseInt(created, 10);
+    if (!isNaN(parsed)) {
+      return parsed;
+    }
+  }
+ 
+  // Try legacy format
+  const legacyStored = localStorage.getItem(DEVICE_KEYS_LEGACY);
+  if (legacyStored) {
+    try {
+      const parsed = JSON.parse(legacyStored);
+      if (typeof parsed.createdAt === 'number' || typeof parsed.createdAt === 'string') {
+        return parseInt(String(parsed.createdAt), 10);
+      }
+    } catch {
+      // Ignore
+    }
+  }
+ 
+  return null;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/security-audit.ts.html b/desktop/coverage/src/lib/security-audit.ts.html new file mode 100644 index 0000000..8624be7 --- /dev/null +++ b/desktop/coverage/src/lib/security-audit.ts.html @@ -0,0 +1,1777 @@ + + + + + + Code coverage report for src/lib/security-audit.ts + + + + + + + + + +
+
+

All files / src/lib security-audit.ts

+
+ +
+ 52.5% + Statements + 157/299 +
+ + +
+ 72.97% + Branches + 27/37 +
+ + +
+ 39.39% + Functions + 13/33 +
+ + +
+ 52.5% + Lines + 157/299 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +5651x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +19x +19x +19x +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +2x +2x +2x +  +  +  +  +1x +  +  +  +  +  +  +19x +19x +19x +19x +  +  +19x +  +  +  +19x +19x +  +  +19x +  +  +  +  +26x +26x +26x +26x +14x +26x +  +  +26x +  +  +  +  +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +  +10x +10x +  +  +  +  +20x +20x +20x +20x +20x +20x +20x +1x +1x +  +19x +19x +19x +19x +19x +19x +19x +19x +20x +  +  +20x +19x +19x +  +19x +  +  +20x +  +  +  +  +20x +  +  +  +  +  +  +  +  +1x +12x +12x +12x +12x +12x +12x +12x +12x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +3x +3x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +  +1x +3x +3x +3x +  +1x +  +1x +  +  +1x +1x +1x +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +6x +6x +6x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  + 
/**
+ * Security Audit Logging Module
+ *
+ * Provides comprehensive security event logging for ZCLAW application.
+ * All security-relevant events are logged with timestamps and details.
+ *
+ * Security events logged:
+ * - Authentication events (login, logout, failed attempts)
+ * - API key operations (access, rotation, deletion)
+ * - Data access events (encrypted data read/write)
+ * - Security violations (failed decryption, tampering attempts)
+ * - Configuration changes
+ */
+ 
+import { hashSha256 } from './crypto-utils';
+ 
+// ============================================================================
+// Types
+// ============================================================================
+ 
+export type SecurityEventType =
+  | 'auth_login'
+  | 'auth_logout'
+  | 'auth_failed'
+  | 'auth_token_refresh'
+  | 'key_accessed'
+  | 'key_stored'
+  | 'key_deleted'
+  | 'key_rotated'
+  | 'data_encrypted'
+  | 'data_decrypted'
+  | 'data_access'
+  | 'data_export'
+  | 'data_import'
+  | 'security_violation'
+  | 'decryption_failed'
+  | 'integrity_check_failed'
+  | 'config_changed'
+  | 'permission_granted'
+  | 'permission_denied'
+  | 'session_started'
+  | 'session_ended'
+  | 'rate_limit_exceeded'
+  | 'suspicious_activity';
+ 
+export type SecurityEventSeverity = 'info' | 'warning' | 'error' | 'critical';
+ 
+export interface SecurityEvent {
+  id: string;
+  type: SecurityEventType;
+  severity: SecurityEventSeverity;
+  timestamp: string;
+  message: string;
+  details: Record<string, unknown>;
+  userAgent?: string;
+  ip?: string;
+  sessionId?: string;
+  agentId?: string;
+}
+ 
+export interface SecurityAuditReport {
+  generatedAt: string;
+  totalEvents: number;
+  eventsByType: Record<SecurityEventType, number>;
+  eventsBySeverity: Record<SecurityEventSeverity, number>;
+  recentCriticalEvents: SecurityEvent[];
+  recommendations: string[];
+}
+ 
+// ============================================================================
+// Constants
+// ============================================================================
+ 
+const SECURITY_LOG_KEY = 'zclaw_security_audit_log';
+const MAX_LOG_ENTRIES = 2000;
+const AUDIT_VERSION = 1;
+ 
+// ============================================================================
+// Internal State
+// ============================================================================
+ 
+let isAuditEnabled: boolean = true;
+let currentSessionId: string | null = null;
+ 
+// ============================================================================
+// Core Functions
+// ============================================================================
+ 
+/**
+ * Generate a unique event ID
+ */
+function generateEventId(): string {
+  return `evt_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
+}
+ 
+/**
+ * Get the current session ID
+ */
+export function getCurrentSessionId(): string | null {
+  return currentSessionId;
+}
+ 
+/**
+ * Set the current session ID
+ */
+export function setCurrentSessionId(sessionId: string | null): void {
+  currentSessionId = sessionId;
+}
+ 
+/**
+ * Enable or disable audit logging
+ */
+export function setAuditEnabled(enabled: boolean): void {
+  isAuditEnabled = enabled;
+  logSecurityEventInternal('config_changed', 'info', `Audit logging ${enabled ? 'enabled' : 'disabled'}`, {});
+}
+ 
+/**
+ * Check if audit logging is enabled
+ */
+export function isAuditEnabledState(): boolean {
+  return isAuditEnabled;
+}
+ 
+/**
+ * Internal function to persist security events
+ */
+function persistEvent(event: SecurityEvent): void {
+  try {
+    const events = getStoredEvents();
+    events.push(event);
+ 
+    // Trim old entries if needed
+    if (events.length > MAX_LOG_ENTRIES) {
+      events.splice(0, events.length - MAX_LOG_ENTRIES);
+    }
+ 
+    localStorage.setItem(SECURITY_LOG_KEY, JSON.stringify(events));
+  } catch {
+    // Ignore persistence failures to prevent application disruption
+  }
+}
+ 
+/**
+ * Get stored security events
+ */
+function getStoredEvents(): SecurityEvent[] {
+  try {
+    const stored = localStorage.getItem(SECURITY_LOG_KEY);
+    if (!stored) return [];
+    return JSON.parse(stored) as SecurityEvent[];
+  } catch {
+    return [];
+  }
+}
+ 
+/**
+ * Determine severity based on event type
+ */
+function getDefaultSeverity(type: SecurityEventType): SecurityEventSeverity {
+  const severityMap: Record<SecurityEventType, SecurityEventSeverity> = {
+    auth_login: 'info',
+    auth_logout: 'info',
+    auth_failed: 'warning',
+    auth_token_refresh: 'info',
+    key_accessed: 'info',
+    key_stored: 'info',
+    key_deleted: 'warning',
+    key_rotated: 'info',
+    data_encrypted: 'info',
+    data_decrypted: 'info',
+    data_access: 'info',
+    data_export: 'warning',
+    data_import: 'warning',
+    security_violation: 'critical',
+    decryption_failed: 'error',
+    integrity_check_failed: 'critical',
+    config_changed: 'warning',
+    permission_granted: 'info',
+    permission_denied: 'warning',
+    session_started: 'info',
+    session_ended: 'info',
+    rate_limit_exceeded: 'warning',
+    suspicious_activity: 'critical',
+  };
+ 
+  return severityMap[type] || 'info';
+}
+ 
+/**
+ * Internal function to log security events
+ */
+function logSecurityEventInternal(
+  type: SecurityEventType,
+  severity: SecurityEventSeverity,
+  message: string,
+  details: Record<string, unknown>
+): void {
+  if (!isAuditEnabled && type !== 'config_changed') {
+    return;
+  }
+ 
+  const event: SecurityEvent = {
+    id: generateEventId(),
+    type,
+    severity,
+    timestamp: new Date().toISOString(),
+    message,
+    details,
+    sessionId: currentSessionId || undefined,
+  };
+ 
+  // Add user agent if in browser
+  if (typeof navigator !== 'undefined') {
+    event.userAgent = navigator.userAgent;
+  }
+ 
+  persistEvent(event);
+ 
+  // Log to console for development
+  if (process.env.NODE_ENV === 'development') {
+    const logMethod = severity === 'critical' || severity === 'error' ? 'error' :
+                   severity === 'warning' ? 'warn' : 'log';
+    console[logMethod](`[SecurityAudit] ${type}: ${message}`, details);
+  }
+}
+ 
+// ============================================================================
+// Public API
+// ============================================================================
+ 
+/**
+ * Log a security event
+ */
+export function logSecurityEvent(
+  type: SecurityEventType,
+  message: string,
+  details: Record<string, unknown> = {},
+  severity?: SecurityEventSeverity
+): void {
+  const eventSeverity = severity || getDefaultSeverity(type);
+  logSecurityEventInternal(type, eventSeverity, message, details);
+}
+ 
+/**
+ * Log authentication event
+ */
+export function logAuthEvent(
+  type: 'auth_login' | 'auth_logout' | 'auth_failed' | 'auth_token_refresh',
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent(type, message, details);
+}
+ 
+/**
+ * Log key management event
+ */
+export function logKeyEvent(
+  type: 'key_accessed' | 'key_stored' | 'key_deleted' | 'key_rotated',
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent(type, message, details);
+}
+ 
+/**
+ * Log data access event
+ */
+export function logDataEvent(
+  type: 'data_encrypted' | 'data_decrypted' | 'data_access' | 'data_export' | 'data_import',
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent(type, message, details);
+}
+ 
+/**
+ * Log security violation
+ */
+export function logSecurityViolation(
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent('security_violation', message, details, 'critical');
+}
+ 
+/**
+ * Log decryption failure
+ */
+export function logDecryptionFailure(
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent('decryption_failed', message, details, 'error');
+}
+ 
+/**
+ * Log integrity check failure
+ */
+export function logIntegrityFailure(
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent('integrity_check_failed', message, details, 'critical');
+}
+ 
+/**
+ * Log permission event
+ */
+export function logPermissionEvent(
+  type: 'permission_granted' | 'permission_denied',
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent(type, message, details);
+}
+ 
+/**
+ * Log session event
+ */
+export function logSessionEvent(
+  type: 'session_started' | 'session_ended',
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent(type, message, details);
+}
+ 
+/**
+ * Log suspicious activity
+ */
+export function logSuspiciousActivity(
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent('suspicious_activity', message, details, 'critical');
+}
+ 
+/**
+ * Log rate limit event
+ */
+export function logRateLimitEvent(
+  message: string,
+  details: Record<string, unknown> = {}
+): void {
+  logSecurityEvent('rate_limit_exceeded', message, details, 'warning');
+}
+ 
+// ============================================================================
+// Query Functions
+// ============================================================================
+ 
+/**
+ * Get all security events
+ */
+export function getSecurityEvents(): SecurityEvent[] {
+  return getStoredEvents();
+}
+ 
+/**
+ * Get security events by type
+ */
+export function getSecurityEventsByType(type: SecurityEventType): SecurityEvent[] {
+  return getStoredEvents().filter(event => event.type === type);
+}
+ 
+/**
+ * Get security events by severity
+ */
+export function getSecurityEventsBySeverity(severity: SecurityEventSeverity): SecurityEvent[] {
+  return getStoredEvents().filter(event => event.severity === severity);
+}
+ 
+/**
+ * Get security events within a time range
+ */
+export function getSecurityEventsByTimeRange(start: Date, end: Date): SecurityEvent[] {
+  const startTime = start.getTime();
+  const endTime = end.getTime();
+ 
+  return getStoredEvents().filter(event => {
+    const eventTime = new Date(event.timestamp).getTime();
+    return eventTime >= startTime && eventTime <= endTime;
+  });
+}
+ 
+/**
+ * Get recent critical events
+ */
+export function getRecentCriticalEvents(count: number = 10): SecurityEvent[] {
+  return getStoredEvents()
+    .filter(event => event.severity === 'critical' || event.severity === 'error')
+    .slice(-count);
+}
+ 
+/**
+ * Get events for a specific session
+ */
+export function getSecurityEventsBySession(sessionId: string): SecurityEvent[] {
+  return getStoredEvents().filter(event => event.sessionId === sessionId);
+}
+ 
+// ============================================================================
+// Report Generation
+// ============================================================================
+ 
+/**
+ * Generate a security audit report
+ */
+export function generateSecurityAuditReport(): SecurityAuditReport {
+  const events = getStoredEvents();
+ 
+  const eventsByType = Object.create(null) as Record<SecurityEventType, number>;
+  const eventsBySeverity: Record<SecurityEventSeverity, number> = {
+    info: 0,
+    warning: 0,
+    error: 0,
+    critical: 0,
+  };
+ 
+  for (const event of events) {
+    eventsByType[event.type] = (eventsByType[event.type] || 0) + 1;
+    eventsBySeverity[event.severity]++;
+  }
+ 
+  const recentCriticalEvents = getRecentCriticalEvents(10);
+ 
+  const recommendations: string[] = [];
+ 
+  // Generate recommendations based on findings
+  if (eventsBySeverity.critical > 0) {
+    recommendations.push('Investigate critical security events immediately');
+  }
+ 
+  if ((eventsByType.auth_failed || 0) > 5) {
+    recommendations.push('Multiple failed authentication attempts detected - consider rate limiting');
+  }
+ 
+  if ((eventsByType.decryption_failed || 0) > 3) {
+    recommendations.push('Multiple decryption failures - check key integrity');
+  }
+ 
+  if ((eventsByType.suspicious_activity || 0) > 0) {
+    recommendations.push('Suspicious activity detected - review access logs');
+  }
+ 
+  if (events.length === 0) {
+    recommendations.push('No security events recorded - ensure audit logging is enabled');
+  }
+ 
+  return {
+    generatedAt: new Date().toISOString(),
+    totalEvents: events.length,
+    eventsByType,
+    eventsBySeverity,
+    recentCriticalEvents,
+    recommendations,
+  };
+}
+ 
+// ============================================================================
+// Maintenance Functions
+// ============================================================================
+ 
+/**
+ * Clear all security events
+ */
+export function clearSecurityAuditLog(): void {
+  localStorage.removeItem(SECURITY_LOG_KEY);
+  logSecurityEventInternal('config_changed', 'warning', 'Security audit log cleared', {});
+}
+ 
+/**
+ * Export security events for external analysis
+ */
+export function exportSecurityEvents(): string {
+  const events = getStoredEvents();
+  return JSON.stringify({
+    version: AUDIT_VERSION,
+    exportedAt: new Date().toISOString(),
+    events,
+  }, null, 2);
+}
+ 
+/**
+ * Import security events from external source
+ */
+export function importSecurityEvents(jsonData: string, merge: boolean = false): void {
+  try {
+    const data = JSON.parse(jsonData);
+    const importedEvents = data.events as SecurityEvent[];
+ 
+    if (!importedEvents || !Array.isArray(importedEvents)) {
+      throw new Error('Invalid import data format');
+    }
+ 
+    if (merge) {
+      const existingEvents = getStoredEvents();
+      const mergedEvents = [...existingEvents, ...importedEvents];
+      localStorage.setItem(SECURITY_LOG_KEY, JSON.stringify(mergedEvents.slice(-MAX_LOG_ENTRIES)));
+    } else {
+      localStorage.setItem(SECURITY_LOG_KEY, JSON.stringify(importedEvents.slice(-MAX_LOG_ENTRIES)));
+    }
+ 
+    logSecurityEventInternal('data_import', 'warning', `Imported ${importedEvents.length} security events`, {
+      merge,
+      sourceVersion: data.version,
+    });
+  } catch (error) {
+    logSecurityEventInternal('security_violation', 'error', 'Failed to import security events', {
+      error: error instanceof Error ? error.message : String(error),
+    });
+    throw error;
+  }
+}
+ 
+/**
+ * Verify audit log integrity
+ */
+export async function verifyAuditLogIntegrity(): Promise<{
+  valid: boolean;
+  eventCount: number;
+  hash: string;
+}> {
+  const events = getStoredEvents();
+  const data = JSON.stringify(events);
+  const hash = await hashSha256(data);
+ 
+  return {
+    valid: events.length > 0,
+    eventCount: events.length,
+    hash,
+  };
+}
+ 
+// ============================================================================
+// Initialization
+// ============================================================================
+ 
+/**
+ * Initialize the security audit module
+ */
+export function initializeSecurityAudit(sessionId?: string): void {
+  if (sessionId) {
+    currentSessionId = sessionId;
+  }
+ 
+  logSecurityEventInternal('session_started', 'info', 'Security audit session started', {
+    sessionId: currentSessionId,
+    auditEnabled: isAuditEnabled,
+  });
+}
+ 
+/**
+ * Shutdown the security audit module
+ */
+export function shutdownSecurityAudit(): void {
+  logSecurityEventInternal('session_ended', 'info', 'Security audit session ended', {
+    sessionId: currentSessionId,
+  });
+ 
+  currentSessionId = null;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/security-index.ts.html b/desktop/coverage/src/lib/security-index.ts.html new file mode 100644 index 0000000..39b5b02 --- /dev/null +++ b/desktop/coverage/src/lib/security-index.ts.html @@ -0,0 +1,808 @@ + + + + + + Code coverage report for src/lib/security-index.ts + + + + + + + + + +
+
+

All files / src/lib security-index.ts

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Security Module Index
+ *
+ * Central export point for all security-related functionality in ZCLAW.
+ *
+ * Modules:
+ * - crypto-utils: AES-256-GCM encryption, key derivation, hashing
+ * - secure-storage: OS keychain integration with encrypted localStorage fallback
+ * - api-key-storage: Secure API key management
+ * - encrypted-chat-storage: Encrypted chat history persistence
+ * - security-audit: Security event logging and reporting
+ * - security-utils: Input validation, XSS prevention, rate limiting
+ */
+ 
+// Re-export crypto utilities
+export {
+  // Core encryption
+  encrypt,
+  decrypt,
+  encryptObject,
+  decryptObject,
+  deriveKey,
+  generateMasterKey,
+  generateSalt,
+ 
+  // Hashing
+  hashSha256,
+  hashSha512,
+ 
+  // Utilities
+  arrayToBase64,
+  base64ToArray,
+  constantTimeEqual,
+  generateRandomString,
+  secureWipe,
+  clearKeyCache,
+  isCryptoAvailable,
+  isValidEncryptedData,
+} from './crypto-utils';
+ 
+export type { EncryptedData } from './crypto-utils';
+ 
+// Re-export secure storage
+export {
+  secureStorage,
+  secureStorageSync,
+  isSecureStorageAvailable,
+  storeDeviceKeys,
+  getDeviceKeys,
+  deleteDeviceKeys,
+  hasDeviceKeys,
+  getDeviceKeysCreatedAt,
+} from './secure-storage';
+ 
+export type { Ed25519KeyPair } from './secure-storage';
+ 
+// Re-export API key storage
+export {
+  // Types
+  type ApiKeyType,
+  type ApiKeyMetadata,
+ 
+  // Core functions
+  storeApiKey,
+  getApiKey,
+  deleteApiKey,
+  listApiKeyMetadata,
+  updateApiKeyMetadata,
+  hasApiKey,
+  validateStoredApiKey,
+  rotateApiKey,
+ 
+  // Utility functions
+  validateApiKeyFormat,
+  exportApiKeyConfig,
+  isUsingKeychain,
+  generateTestApiKey,
+} from './api-key-storage';
+ 
+// Re-export encrypted chat storage
+export {
+  initializeEncryptedChatStorage,
+  saveConversations,
+  loadConversations,
+  clearAllChatData,
+  exportEncryptedBackup,
+  importEncryptedBackup,
+  isEncryptedStorageActive,
+  getStorageStats,
+  rotateEncryptionKey,
+} from './encrypted-chat-storage';
+ 
+// Re-export security audit
+export {
+  // Core logging
+  logSecurityEvent,
+  logAuthEvent,
+  logKeyEvent,
+  logDataEvent,
+  logSecurityViolation,
+  logDecryptionFailure,
+  logIntegrityFailure,
+  logPermissionEvent,
+  logSessionEvent,
+  logSuspiciousActivity,
+  logRateLimitEvent,
+ 
+  // Query functions
+  getSecurityEvents,
+  getSecurityEventsByType,
+  getSecurityEventsBySeverity,
+  getSecurityEventsByTimeRange,
+  getRecentCriticalEvents,
+  getSecurityEventsBySession,
+ 
+  // Report generation
+  generateSecurityAuditReport,
+ 
+  // Maintenance
+  clearSecurityAuditLog,
+  exportSecurityEvents,
+  importSecurityEvents,
+  verifyAuditLogIntegrity,
+ 
+  // Session management
+  getCurrentSessionId,
+  setCurrentSessionId,
+  setAuditEnabled,
+  isAuditEnabledState,
+  initializeSecurityAudit,
+  shutdownSecurityAudit,
+} from './security-audit';
+ 
+export type {
+  SecurityEventType,
+  SecurityEventSeverity,
+  SecurityEvent,
+  SecurityAuditReport,
+} from './security-audit';
+ 
+// Re-export security utilities
+export {
+  // HTML sanitization
+  escapeHtml,
+  unescapeHtml,
+  sanitizeHtml,
+ 
+  // URL validation
+  validateUrl,
+  isSafeRedirectUrl,
+ 
+  // Path validation
+  validatePath,
+ 
+  // Input validation
+  isValidEmail,
+  isValidUsername,
+  validatePasswordStrength,
+  sanitizeFilename,
+  sanitizeJson,
+ 
+  // Rate limiting
+  isRateLimited,
+  resetRateLimit,
+  getRemainingAttempts,
+ 
+  // CSP helpers
+  generateCspNonce,
+  buildCspHeader,
+  DEFAULT_CSP_DIRECTIVES,
+ 
+  // Security checks
+  checkSecurityHeaders,
+ 
+  // Random generation
+  generateSecureToken,
+  generateSecureId,
+} from './security-utils';
+ 
+// ============================================================================
+// Security Initialization
+// ============================================================================
+ 
+/**
+ * Initialize all security modules
+ * Call this during application startup
+ */
+export async function initializeSecurity(sessionId?: string): Promise<void> {
+  // Initialize security audit first
+  const { initializeSecurityAudit } = await import('./security-audit');
+  initializeSecurityAudit(sessionId);
+ 
+  // Initialize encrypted chat storage
+  const { initializeEncryptedChatStorage } = await import('./encrypted-chat-storage');
+  await initializeEncryptedChatStorage();
+ 
+  console.log('[Security] All security modules initialized');
+}
+ 
+/**
+ * Shutdown all security modules
+ * Call this during application shutdown
+ */
+export async function shutdownSecurity(): Promise<void> {
+  const { shutdownSecurityAudit } = await import('./security-audit');
+  shutdownSecurityAudit();
+ 
+  const { clearKeyCache } = await import('./crypto-utils');
+  clearKeyCache();
+ 
+  console.log('[Security] All security modules shut down');
+}
+ 
+/**
+ * Get a comprehensive security status report
+ */
+export async function getSecurityStatus(): Promise<{
+  auditEnabled: boolean;
+  keychainAvailable: boolean;
+  chatStorageInitialized: boolean;
+  storedApiKeys: number;
+  recentEvents: number;
+  criticalEvents: number;
+}> {
+  const { isAuditEnabledState, getSecurityEventsBySeverity } = await import('./security-audit');
+  const { isSecureStorageAvailable } = await import('./secure-storage');
+  const { isEncryptedStorageActive: isChatStorageInitialized } = await import('./encrypted-chat-storage');
+  const { listApiKeyMetadata } = await import('./api-key-storage');
+ 
+  const criticalEvents = getSecurityEventsBySeverity('critical').length;
+  const errorEvents = getSecurityEventsBySeverity('error').length;
+ 
+  return {
+    auditEnabled: isAuditEnabledState(),
+    keychainAvailable: await isSecureStorageAvailable(),
+    chatStorageInitialized: await isChatStorageInitialized(),
+    storedApiKeys: (await listApiKeyMetadata()).length,
+    recentEvents: criticalEvents + errorEvents,
+    criticalEvents,
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/security-utils.ts.html b/desktop/coverage/src/lib/security-utils.ts.html new file mode 100644 index 0000000..9710f5e --- /dev/null +++ b/desktop/coverage/src/lib/security-utils.ts.html @@ -0,0 +1,2272 @@ + + + + + + Code coverage report for src/lib/security-utils.ts + + + + + + + + + +
+
+

All files / src/lib security-utils.ts

+
+ +
+ 65.47% + Statements + 256/391 +
+ + +
+ 70.58% + Branches + 60/85 +
+ + +
+ 60% + Functions + 12/20 +
+ + +
+ 65.47% + Lines + 256/391 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +1x +3x +  +  +3x +3x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +4x +4x +  +  +  +4x +4x +4x +  +  +  +4x +4x +  +  +4x +4x +  +  +4x +  +7x +1x +1x +1x +  +  +7x +  +  +  +  +  +6x +7x +2x +  +  +2x +1x +1x +1x +  +  +2x +1x +1x +1x +1x +1x +1x +  +  +2x +  +  +  +  +  +  +  +  +2x +  +  +7x +  +  +  +  +  +  +  +  +  +6x +7x +  +  +4x +  +4x +4x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +5x +5x +  +  +  +  +5x +5x +5x +  +  +  +5x +5x +  +  +  +5x +5x +  +  +5x +5x +2x +2x +  +  +5x +2x +1x +2x +1x +1x +2x +  +  +2x +2x +2x +  +  +2x +  +2x +5x +  +  +5x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +4x +  +  +  +  +  +4x +4x +4x +  +  +  +4x +4x +  +  +  +  +4x +  +  +4x +1x +1x +  +  +3x +3x +1x +1x +3x +  +  +2x +2x +1x +1x +2x +  +  +4x +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +5x +  +  +  +  +5x +5x +5x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +3x +3x +  +  +  +  +  +  +3x +  +  +  +  +3x +3x +3x +3x +3x +  +3x +  +  +  +3x +1x +3x +2x +2x +  +3x +  +  +  +3x +2x +3x +1x +1x +  +3x +  +3x +3x +3x +  +3x +1x +3x +2x +2x +  +3x +2x +3x +1x +1x +  +  +3x +3x +3x +3x +3x +3x +3x +3x +  +3x +13x +1x +1x +1x +1x +13x +  +3x +3x +3x +3x +3x +3x +  +  +  +  +  +  +  +1x +3x +  +  +  +  +3x +  +  +3x +  +  +3x +  +  +3x +  +  +3x +  +  +3x +  +  +  +  +  +3x +3x +  +  +  +  +  +  +  +  +1x +3x +  +  +  +3x +3x +  +  +3x +2x +2x +6x +4x +4x +6x +2x +  +2x +3x +1x +1x +3x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +14x +14x +14x +14x +14x +14x +  +14x +2x +2x +2x +2x +2x +2x +  +14x +8x +8x +  +4x +4x +4x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +5x +5x +5x +5x +5x +  +  +  +  +  +  +  +1x +2x +2x +2x +2x + 
/**
+ * Security Utilities for Input Validation and XSS Prevention
+ *
+ * Provides comprehensive input validation, sanitization, and XSS prevention
+ * for the ZCLAW application.
+ *
+ * Security features:
+ * - HTML sanitization
+ * - URL validation
+ * - Path traversal prevention
+ * - Input validation helpers
+ * - Content Security Policy helpers
+ */
+ 
+// ============================================================================
+// HTML Sanitization
+// ============================================================================
+ 
+/**
+ * HTML entity encoding map
+ */
+const HTML_ENTITIES: Record<string, string> = {
+  '&': '&amp;',
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&quot;',
+  "'": '&#x27;',
+  '/': '&#x2F;',
+  '`': '&#x60;',
+  '=': '&#x3D;',
+};
+ 
+/**
+ * Escape HTML entities in a string
+ * Prevents XSS attacks by encoding dangerous characters
+ *
+ * @param input - The string to escape
+ * @returns The escaped string
+ */
+export function escapeHtml(input: string): string {
+  if (typeof input !== 'string') {
+    return '';
+  }
+  return input.replace(/[&<>"'`=\/]/g, char => HTML_ENTITIES[char] || char);
+}
+ 
+/**
+ * Unescape HTML entities in a string
+ *
+ * @param input - The string to unescape
+ * @returns The unescaped string
+ */
+export function unescapeHtml(input: string): string {
+  if (typeof input !== 'string') {
+    return '';
+  }
+ 
+  const textarea = document.createElement('textarea');
+  textarea.innerHTML = input;
+  return textarea.value;
+}
+ 
+/**
+ * Allowed HTML tags for safe rendering
+ */
+const ALLOWED_TAGS = new Set([
+  'p', 'br', 'b', 'i', 'u', 'strong', 'em',
+  'ul', 'ol', 'li', 'blockquote', 'code', 'pre',
+  'a', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+]);
+ 
+/**
+ * Allowed HTML attributes
+ */
+const ALLOWED_ATTRIBUTES = new Set([
+  'href', 'title', 'class', 'id', 'target', 'rel',
+]);
+ 
+/**
+ * Sanitize HTML content for safe rendering
+ * Removes dangerous tags and attributes while preserving safe content
+ *
+ * @param html - The HTML string to sanitize
+ * @param options - Sanitization options
+ * @returns The sanitized HTML
+ */
+export function sanitizeHtml(
+  html: string,
+  options: {
+    allowedTags?: string[];
+    allowedAttributes?: string[];
+    allowDataAttributes?: boolean;
+  } = {}
+): string {
+  if (typeof html !== 'string') {
+    return '';
+  }
+ 
+  const allowedTags = new Set(options.allowedTags || ALLOWED_TAGS);
+  const allowedAttributes = new Set(options.allowedAttributes || ALLOWED_ATTRIBUTES);
+ 
+  // Create a temporary container
+  const container = document.createElement('div');
+  container.innerHTML = html;
+ 
+  // Recursively clean elements
+  function cleanElement(element: Element): void {
+    // Remove script tags entirely
+    if (element.tagName.toLowerCase() === 'script') {
+      element.remove();
+      return;
+    }
+ 
+    // Remove style tags entirely
+    if (element.tagName.toLowerCase() === 'style') {
+      element.remove();
+      return;
+    }
+ 
+    // Remove event handlers and dangerous attributes
+    const attributes = Array.from(element.attributes);
+    for (const attr of attributes) {
+      const attrName = attr.name.toLowerCase();
+ 
+      // Remove event handlers (onclick, onload, etc.)
+      if (attrName.startsWith('on')) {
+        element.removeAttribute(attr.name);
+        continue;
+      }
+ 
+      // Remove javascript: URLs
+      if (attrName === 'href' || attrName === 'src') {
+        const value = attr.value.toLowerCase().trim();
+        if (value.startsWith('javascript:') || value.startsWith('data:text/html')) {
+          element.removeAttribute(attr.name);
+          continue;
+        }
+      }
+ 
+      // Remove data attributes if not allowed
+      if (attrName.startsWith('data-') && !options.allowDataAttributes) {
+        element.removeAttribute(attr.name);
+        continue;
+      }
+ 
+      // Remove non-allowed attributes
+      if (!allowedAttributes.has(attrName)) {
+        element.removeAttribute(attr.name);
+      }
+    }
+ 
+    // Remove non-allowed tags (but keep their content)
+    if (!allowedTags.has(element.tagName.toLowerCase())) {
+      const parent = element.parentNode;
+      while (element.firstChild) {
+        parent?.insertBefore(element.firstChild, element);
+      }
+      parent?.removeChild(element);
+      return;
+    }
+ 
+    // Recursively clean child elements
+    Array.from(element.children).forEach(cleanElement);
+  }
+ 
+  // Clean all elements
+  Array.from(container.children).forEach(cleanElement);
+ 
+  return container.innerHTML;
+}
+ 
+// ============================================================================
+// URL Validation
+// ============================================================================
+ 
+/**
+ * Allowed URL schemes
+ */
+const ALLOWED_SCHEMES = new Set([
+  'http', 'https', 'mailto', 'tel', 'ftp', 'file',
+]);
+ 
+/**
+ * Validate and sanitize a URL
+ *
+ * @param url - The URL to validate
+ * @param options - Validation options
+ * @returns The validated URL or null if invalid
+ */
+export function validateUrl(
+  url: string,
+  options: {
+    allowedSchemes?: string[];
+    allowLocalhost?: boolean;
+    allowPrivateIp?: boolean;
+    maxLength?: number;
+  } = {}
+): string | null {
+  if (typeof url !== 'string' || url.length === 0) {
+    return null;
+  }
+ 
+  const maxLength = options.maxLength || 2048;
+  if (url.length > maxLength) {
+    return null;
+  }
+ 
+  try {
+    const parsed = new URL(url);
+ 
+    // Check scheme
+    const allowedSchemes = new Set(options.allowedSchemes || ALLOWED_SCHEMES);
+    if (!allowedSchemes.has(parsed.protocol.replace(':', ''))) {
+      return null;
+    }
+ 
+    // Check for localhost
+    if (!options.allowLocalhost) {
+      if (parsed.hostname === 'localhost' ||
+          parsed.hostname === '127.0.0.1' ||
+          parsed.hostname === '[::1]') {
+        return null;
+      }
+    }
+ 
+    // Check for private IP ranges
+    if (!options.allowPrivateIp) {
+      const privateIpRegex = /^(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.)/;
+      if (privateIpRegex.test(parsed.hostname)) {
+        return null;
+      }
+    }
+ 
+    return parsed.toString();
+  } catch {
+    return null;
+  }
+}
+ 
+/**
+ * Check if a URL is safe for redirect
+ * Prevents open redirect vulnerabilities
+ *
+ * @param url - The URL to check
+ * @returns True if the URL is safe for redirect
+ */
+export function isSafeRedirectUrl(url: string): boolean {
+  if (typeof url !== 'string' || url.length === 0) {
+    return false;
+  }
+ 
+  // Relative URLs are generally safe
+  if (url.startsWith('/') && !url.startsWith('//')) {
+    return true;
+  }
+ 
+  // Check for javascript: protocol
+  const lowerUrl = url.toLowerCase().trim();
+  if (lowerUrl.startsWith('javascript:')) {
+    return false;
+  }
+ 
+  // Check for data: protocol
+  if (lowerUrl.startsWith('data:')) {
+    return false;
+  }
+ 
+  // Validate as absolute URL
+  const validated = validateUrl(url, { allowLocalhost: false });
+  return validated !== null;
+}
+ 
+// ============================================================================
+// Path Validation
+// ============================================================================
+ 
+/**
+ * Validate a file path to prevent path traversal attacks
+ *
+ * @param path - The path to validate
+ * @param options - Validation options
+ * @returns The validated path or null if invalid
+ */
+export function validatePath(
+  path: string,
+  options: {
+    allowAbsolute?: boolean;
+    allowParentDir?: boolean;
+    maxLength?: number;
+    allowedExtensions?: string[];
+    baseDir?: string;
+  } = {}
+): string | null {
+  if (typeof path !== 'string' || path.length === 0) {
+    return null;
+  }
+ 
+  const maxLength = options.maxLength || 4096;
+  if (path.length > maxLength) {
+    return null;
+  }
+ 
+  // Normalize path separators
+  let normalized = path.replace(/\\/g, '/');
+ 
+  // Check for null bytes
+  if (normalized.includes('\0')) {
+    return null;
+  }
+ 
+  // Check for path traversal
+  if (!options.allowParentDir) {
+    if (normalized.includes('..') || normalized.includes('./')) {
+      return null;
+    }
+  }
+ 
+  // Check for absolute paths
+  if (!options.allowAbsolute) {
+    if (normalized.startsWith('/') || /^[a-zA-Z]:/.test(normalized)) {
+      return null;
+    }
+  }
+ 
+  // Check extensions
+  if (options.allowedExtensions && options.allowedExtensions.length > 0) {
+    const ext = normalized.split('.').pop()?.toLowerCase();
+    if (!ext || !options.allowedExtensions.includes(ext)) {
+      return null;
+    }
+  }
+ 
+  // If baseDir is specified, ensure path is within it
+  if (options.baseDir) {
+    const baseDir = options.baseDir.replace(/\\/g, '/').replace(/\/$/, '');
+    if (!normalized.startsWith(baseDir)) {
+      // Try to resolve relative to baseDir
+      try {
+        const resolved = new URL(normalized, `file://${baseDir}/`).pathname;
+        if (!resolved.startsWith(baseDir)) {
+          return null;
+        }
+        normalized = resolved;
+      } catch {
+        return null;
+      }
+    }
+  }
+ 
+  return normalized;
+}
+ 
+// ============================================================================
+// Input Validation Helpers
+// ============================================================================
+ 
+/**
+ * Validate an email address
+ *
+ * @param email - The email to validate
+ * @returns True if valid
+ */
+export function isValidEmail(email: string): boolean {
+  if (typeof email !== 'string' || email.length === 0 || email.length > 254) {
+    return false;
+  }
+ 
+  // RFC 5322 compliant regex (simplified)
+  const emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
+  return emailRegex.test(email);
+}
+ 
+/**
+ * Validate a username
+ *
+ * @param username - The username to validate
+ * @param options - Validation options
+ * @returns True if valid
+ */
+export function isValidUsername(
+  username: string,
+  options: {
+    minLength?: number;
+    maxLength?: number;
+    allowedChars?: RegExp;
+  } = {}
+): boolean {
+  const minLength = options.minLength || 3;
+  const maxLength = options.maxLength || 30;
+  const allowedChars = options.allowedChars || /^[a-zA-Z0-9_-]+$/;
+ 
+  if (typeof username !== 'string') {
+    return false;
+  }
+ 
+  if (username.length < minLength || username.length > maxLength) {
+    return false;
+  }
+ 
+  return allowedChars.test(username);
+}
+ 
+/**
+ * Validate a password strength
+ *
+ * @param password - The password to validate
+ * @param options - Validation options
+ * @returns Validation result with strength score
+ */
+export function validatePasswordStrength(
+  password: string,
+  options: {
+    minLength?: number;
+    requireUppercase?: boolean;
+    requireLowercase?: boolean;
+    requireNumber?: boolean;
+    requireSpecial?: boolean;
+    maxLength?: number;
+  } = {}
+): {
+  valid: boolean;
+  score: number;
+  issues: string[];
+} {
+  const minLength = options.minLength || 8;
+  const maxLength = options.maxLength || 128;
+  const issues: string[] = [];
+  let score = 0;
+ 
+  if (typeof password !== 'string') {
+    return { valid: false, score: 0, issues: ['Password must be a string'] };
+  }
+ 
+  if (password.length < minLength) {
+    issues.push(`Password must be at least ${minLength} characters`);
+  } else {
+    score += Math.min(password.length / 8, 3) * 10;
+  }
+ 
+  if (password.length > maxLength) {
+    issues.push(`Password must be at most ${maxLength} characters`);
+  }
+ 
+  if (options.requireUppercase !== false && !/[A-Z]/.test(password)) {
+    issues.push('Password must contain an uppercase letter');
+  } else if (/[A-Z]/.test(password)) {
+    score += 10;
+  }
+ 
+  if (options.requireLowercase !== false && !/[a-z]/.test(password)) {
+    issues.push('Password must contain a lowercase letter');
+  } else if (/[a-z]/.test(password)) {
+    score += 10;
+  }
+ 
+  if (options.requireNumber !== false && !/[0-9]/.test(password)) {
+    issues.push('Password must contain a number');
+  } else if (/[0-9]/.test(password)) {
+    score += 10;
+  }
+ 
+  if (options.requireSpecial !== false && !/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) {
+    issues.push('Password must contain a special character');
+  } else if (/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) {
+    score += 15;
+  }
+ 
+  // Check for common patterns
+  const commonPatterns = [
+    /123/,
+    /abc/i,
+    /qwe/i,
+    /password/i,
+    /admin/i,
+    /letmein/i,
+  ];
+ 
+  for (const pattern of commonPatterns) {
+    if (pattern.test(password)) {
+      issues.push('Password contains a common pattern');
+      score -= 10;
+      break;
+    }
+  }
+ 
+  return {
+    valid: issues.length === 0,
+    score: Math.max(0, Math.min(100, score)),
+    issues,
+  };
+}
+ 
+/**
+ * Sanitize a filename
+ *
+ * @param filename - The filename to sanitize
+ * @returns The sanitized filename
+ */
+export function sanitizeFilename(filename: string): string {
+  if (typeof filename !== 'string') {
+    return '';
+  }
+ 
+  // Remove path separators
+  let sanitized = filename.replace(/[\/\\]/g, '_');
+ 
+  // Remove null bytes
+  sanitized = sanitized.replace(/\0/g, '');
+ 
+  // Remove control characters
+  sanitized = sanitized.replace(/[\x00-\x1f\x7f]/g, '');
+ 
+  // Remove dangerous characters
+  sanitized = sanitized.replace(/[<>:"|?*]/g, '_');
+ 
+  // Trim whitespace and dots
+  sanitized = sanitized.trim().replace(/^\.+|\.+$/g, '');
+ 
+  // Limit length
+  if (sanitized.length > 255) {
+    const ext = sanitized.split('.').pop();
+    const name = sanitized.slice(0, -(ext?.length || 0) - 1);
+    sanitized = name.slice(0, 250 - (ext?.length || 0)) + (ext ? `.${ext}` : '');
+  }
+ 
+  return sanitized;
+}
+ 
+/**
+ * Sanitize JSON input
+ * Prevents prototype pollution and other JSON-based attacks
+ *
+ * @param json - The JSON string to sanitize
+ * @returns The parsed and sanitized object or null if invalid
+ */
+export function sanitizeJson<T = unknown>(json: string): T | null {
+  if (typeof json !== 'string') {
+    return null;
+  }
+ 
+  try {
+    const parsed = JSON.parse(json);
+ 
+    // Check for prototype pollution
+    if (typeof parsed === 'object' && parsed !== null) {
+      const dangerousKeys = ['__proto__', 'constructor', 'prototype'];
+      for (const key of dangerousKeys) {
+        if (key in parsed) {
+          delete (parsed as Record<string, unknown>)[key];
+        }
+      }
+    }
+ 
+    return parsed as T;
+  } catch {
+    return null;
+  }
+}
+ 
+// ============================================================================
+// Rate Limiting
+// ============================================================================
+ 
+interface RateLimitEntry {
+  count: number;
+  resetAt: number;
+}
+ 
+const rateLimitStore = new Map<string, RateLimitEntry>();
+ 
+/**
+ * Check if an action is rate limited
+ *
+ * @param key - The rate limit key (e.g., 'api:username')
+ * @param maxAttempts - Maximum attempts allowed
+ * @param windowMs - Time window in milliseconds
+ * @returns True if rate limited (should block), false otherwise
+ */
+export function isRateLimited(
+  key: string,
+  maxAttempts: number,
+  windowMs: number
+): boolean {
+  const now = Date.now();
+  const entry = rateLimitStore.get(key);
+ 
+  if (!entry || now > entry.resetAt) {
+    rateLimitStore.set(key, {
+      count: 1,
+      resetAt: now + windowMs,
+    });
+    return false;
+  }
+ 
+  if (entry.count >= maxAttempts) {
+    return true;
+  }
+ 
+  entry.count++;
+  return false;
+}
+ 
+/**
+ * Reset rate limit for a key
+ *
+ * @param key - The rate limit key to reset
+ */
+export function resetRateLimit(key: string): void {
+  rateLimitStore.delete(key);
+}
+ 
+/**
+ * Get remaining attempts for a rate-limited action
+ *
+ * @param key - The rate limit key
+ * @param maxAttempts - Maximum attempts allowed
+ * @returns Number of remaining attempts
+ */
+export function getRemainingAttempts(key: string, maxAttempts: number): number {
+  const entry = rateLimitStore.get(key);
+  if (!entry || Date.now() > entry.resetAt) {
+    return maxAttempts;
+  }
+  return Math.max(0, maxAttempts - entry.count);
+}
+ 
+// ============================================================================
+// Content Security Policy Helpers
+// ============================================================================
+ 
+/**
+ * Generate a nonce for CSP
+ *
+ * @returns A base64-encoded nonce
+ */
+export function generateCspNonce(): string {
+  const array = crypto.getRandomValues(new Uint8Array(16));
+  return btoa(String.fromCharCode(...array));
+}
+ 
+/**
+ * CSP directives for secure applications
+ */
+export const DEFAULT_CSP_DIRECTIVES = {
+  'default-src': "'self'",
+  'script-src': "'self' 'unsafe-inline'", // Note: unsafe-inline should be avoided in production
+  'style-src': "'self' 'unsafe-inline'",
+  'img-src': "'self' data: https:",
+  'font-src': "'self'",
+  'connect-src': "'self' ws: wss:",
+  'frame-ancestors': "'none'",
+  'base-uri': "'self'",
+  'form-action': "'self'",
+};
+ 
+/**
+ * Build a Content Security Policy header value
+ *
+ * @param directives - CSP directives
+ * @returns The CSP header value
+ */
+export function buildCspHeader(
+  directives: Partial<typeof DEFAULT_CSP_DIRECTIVES> = DEFAULT_CSP_DIRECTIVES
+): string {
+  const merged = { ...DEFAULT_CSP_DIRECTIVES, ...directives };
+  return Object.entries(merged)
+    .map(([key, value]) => `${key} ${value}`)
+    .join('; ');
+}
+ 
+// ============================================================================
+// Security Headers Validation
+// ============================================================================
+ 
+/**
+ * Check if security headers are properly set (for browser environments)
+ */
+export function checkSecurityHeaders(): {
+  secure: boolean;
+  issues: string[];
+} {
+  const issues: string[] = [];
+ 
+  // Check if running over HTTPS
+  if (typeof window !== 'undefined') {
+    if (window.location.protocol !== 'https:' && window.location.hostname !== 'localhost') {
+      issues.push('Application is not running over HTTPS');
+    }
+ 
+    // Check for mixed content
+    if (window.location.protocol === 'https:') {
+      // This would require DOM inspection to detect mixed content
+    }
+  }
+ 
+  return {
+    secure: issues.length === 0,
+    issues,
+  };
+}
+ 
+// ============================================================================
+// Secure Random Generation
+// ============================================================================
+ 
+/**
+ * Generate a secure random token
+ *
+ * @param length - Token length in bytes
+ * @returns Hex-encoded random token
+ */
+export function generateSecureToken(length: number = 32): string {
+  const array = crypto.getRandomValues(new Uint8Array(length));
+  return Array.from(array)
+    .map(b => b.toString(16).padStart(2, '0'))
+    .join('');
+}
+ 
+/**
+ * Generate a secure random ID
+ *
+ * @param prefix - Optional prefix
+ * @returns A secure random ID
+ */
+export function generateSecureId(prefix: string = ''): string {
+  const timestamp = Date.now().toString(36);
+  const random = generateSecureToken(8);
+  return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/skill-adapter.ts.html b/desktop/coverage/src/lib/skill-adapter.ts.html new file mode 100644 index 0000000..2f06992 --- /dev/null +++ b/desktop/coverage/src/lib/skill-adapter.ts.html @@ -0,0 +1,730 @@ + + + + + + Code coverage report for src/lib/skill-adapter.ts + + + + + + + + + +
+
+

All files / src/lib skill-adapter.ts

+
+ +
+ 0% + Statements + 0/118 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/118 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Skill Adapter - Converts between configStore and UI skill formats
+ *
+ * Bridges the gap between:
+ * - configStore.SkillInfo (backend/Gateway format)
+ * - SkillMarket UI format (based on skill-discovery types)
+ *
+ * Part of Phase 1: Skill Market Store Unification
+ */
+ 
+import type { SkillInfo as ConfigSkillInfo } from '../store/configStore';
+ 
+// === UI Skill Types (aligned with SkillMarket expectations) ===
+ 
+export interface UISkillInfo {
+  id: string;
+  name: string;
+  description: string;
+  triggers: string[];
+  capabilities: string[];
+  toolDeps: string[];
+  installed: boolean;
+  category?: string;
+  path?: string;
+  source?: 'builtin' | 'extra';
+}
+ 
+// Category mapping based on skill keywords
+const CATEGORY_KEYWORDS: Record<string, string[]> = {
+  development: ['code', 'git', 'frontend', 'backend', 'react', 'vue', 'api', 'typescript', 'javascript'],
+  security: ['security', 'audit', 'vulnerability', 'pentest', 'auth'],
+  analytics: ['data', 'analysis', 'analytics', 'visualization', 'report'],
+  content: ['writing', 'content', 'article', 'copy', 'chinese'],
+  ops: ['devops', 'docker', 'k8s', 'deploy', 'ci', 'cd', 'automation'],
+  management: ['pm', 'project', 'requirement', 'planning', 'prd'],
+  testing: ['test', 'api test', 'e2e', 'unit'],
+  business: ['finance', 'budget', 'expense', 'accounting'],
+  marketing: ['social', 'media', 'marketing', 'campaign', 'operation'],
+};
+ 
+/**
+ * Infer category from skill name and description
+ */
+function inferCategory(skill: ConfigSkillInfo): string | undefined {
+  const text = `${skill.name} ${skill.description || ''}`.toLowerCase();
+ 
+  for (const [category, keywords] of Object.entries(CATEGORY_KEYWORDS)) {
+    if (keywords.some(keyword => text.includes(keyword))) {
+      return category;
+    }
+  }
+ 
+  return undefined;
+}
+ 
+/**
+ * Extract trigger patterns from config format
+ */
+function extractTriggers(triggers?: ConfigSkillInfo['triggers']): string[] {
+  if (!triggers) return [];
+ 
+  return triggers
+    .map(t => t.pattern || t.type)
+    .filter((p): p is string => Boolean(p));
+}
+ 
+/**
+ * Extract capabilities from actions or capabilities field
+ */
+function extractCapabilities(skill: ConfigSkillInfo): string[] {
+  // Prefer explicit capabilities field if available
+  if (skill.capabilities && skill.capabilities.length > 0) {
+    return skill.capabilities;
+  }
+ 
+  // Fall back to extracting from actions
+  if (skill.actions) {
+    return skill.actions
+      .map(a => a.type)
+      .filter((t): t is string => Boolean(t));
+  }
+ 
+  return [];
+}
+ 
+/**
+ * Extract tool dependencies from actions params
+ */
+function extractToolDeps(actions?: ConfigSkillInfo['actions']): string[] {
+  if (!actions) return [];
+ 
+  const deps = new Set<string>();
+ 
+  for (const action of actions) {
+    if (action.params?.tools && Array.isArray(action.params.tools)) {
+      for (const tool of action.params.tools) {
+        if (typeof tool === 'string') {
+          deps.add(tool);
+        }
+      }
+    }
+    if (action.params?.toolDeps && Array.isArray(action.params.toolDeps)) {
+      for (const dep of action.params.toolDeps) {
+        if (typeof dep === 'string') {
+          deps.add(dep);
+        }
+      }
+    }
+  }
+ 
+  return Array.from(deps);
+}
+ 
+/**
+ * Adapt a single skill from configStore format to UI format
+ */
+export function adaptSkillInfo(skill: ConfigSkillInfo): UISkillInfo {
+  return {
+    id: skill.id,
+    name: skill.name,
+    description: skill.description || '',
+    triggers: extractTriggers(skill.triggers),
+    capabilities: extractCapabilities(skill),
+    toolDeps: extractToolDeps(skill.actions),
+    installed: skill.enabled ?? false,
+    category: inferCategory(skill),
+    path: skill.path,
+    source: skill.source,
+  };
+}
+ 
+/**
+ * Adapt an array of skills from configStore format to UI format
+ */
+export function adaptSkills(skills: ConfigSkillInfo[]): UISkillInfo[] {
+  return skills.map(adaptSkillInfo);
+}
+ 
+/**
+ * Search skills by query string
+ */
+export function searchSkills(skills: UISkillInfo[], query: string): UISkillInfo[] {
+  const q = query.toLowerCase().trim();
+  if (!q) return skills;
+ 
+  const tokens = q.split(/[\s,;.!?.,;!?]+/).filter(t => t.length > 0);
+ 
+  const scored = skills.map(skill => {
+    let score = 0;
+ 
+    // Name match (highest weight)
+    if (skill.name.toLowerCase().includes(q)) score += 10;
+ 
+    // Description match
+    if (skill.description.toLowerCase().includes(q)) score += 5;
+ 
+    // Trigger match
+    for (const trigger of skill.triggers) {
+      const tLower = trigger.toLowerCase();
+      if (tLower === q) { score += 15; break; }
+      if (tLower.includes(q) || q.includes(tLower)) score += 8;
+    }
+ 
+    // Capability match
+    for (const cap of skill.capabilities) {
+      if (cap.toLowerCase().includes(q)) score += 4;
+    }
+ 
+    // Token-level matching
+    for (const token of tokens) {
+      if (skill.name.toLowerCase().includes(token)) score += 2;
+      if (skill.description.toLowerCase().includes(token)) score += 1;
+      for (const trigger of skill.triggers) {
+        if (trigger.toLowerCase().includes(token)) score += 3;
+      }
+    }
+ 
+    // Category match
+    if (skill.category && skill.category.toLowerCase().includes(q)) score += 3;
+ 
+    return { skill, score };
+  });
+ 
+  return scored
+    .filter(s => s.score > 0)
+    .sort((a, b) => b.score - a.score)
+    .map(s => s.skill);
+}
+ 
+/**
+ * Get unique categories from skills
+ */
+export function getCategories(skills: UISkillInfo[]): string[] {
+  const categories = new Set<string>();
+  for (const skill of skills) {
+    if (skill.category) {
+      categories.add(skill.category);
+    }
+  }
+  return Array.from(categories);
+}
+ 
+// === Aliases for backward compatibility ===
+ 
+/**
+ * Alias for UISkillInfo for backward compatibility
+ */
+export type SkillDisplay = UISkillInfo;
+ 
+/**
+ * Alias for adaptSkills for catalog adaptation
+ */
+export function adaptSkillsCatalog(skills: ConfigSkillInfo[]): UISkillInfo[] {
+  return adaptSkills(skills);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/skill-discovery.ts.html b/desktop/coverage/src/lib/skill-discovery.ts.html new file mode 100644 index 0000000..eb9c10f --- /dev/null +++ b/desktop/coverage/src/lib/skill-discovery.ts.html @@ -0,0 +1,1411 @@ + + + + + + Code coverage report for src/lib/skill-discovery.ts + + + + + + + + + +
+
+

All files / src/lib skill-discovery.ts

+
+ +
+ 0% + Statements + 0/253 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/253 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Skill Discovery - Agent-driven skill search, recommendation, and management
+ *
+ * Enables ZCLAW agents to:
+ * - Search available skills by keyword/capability
+ * - Recommend skills based on recent conversation patterns
+ * - Manage skill installation lifecycle (with user approval)
+ *
+ * Dynamically loads skills from the backend Kernel's SkillRegistry.
+ *
+ * Reference: ZCLAW_AGENT_INTELLIGENCE_EVOLUTION.md §6.5.2
+ */
+ 
+import { intelligenceClient } from './intelligence-client';
+import { canAutoExecute } from './autonomy-manager';
+ 
+// === Types ===
+ 
+export interface SkillInfo {
+  id: string;
+  name: string;
+  description: string;
+  triggers: string[];
+  capabilities: string[];
+  toolDeps: string[];
+  installed: boolean;
+  category?: string;
+  path?: string;
+  version?: string;
+  mode?: string;
+}
+ 
+/** Backend skill response format */
+interface BackendSkillInfo {
+  id: string;
+  name: string;
+  description: string;
+  version: string;
+  capabilities: string[];
+  tags: string[];
+  mode: string;
+  enabled: boolean;
+}
+ 
+export interface SkillSuggestion {
+  skill: SkillInfo;
+  reason: string;
+  confidence: number;         // 0-1
+  matchedPatterns: string[];
+}
+ 
+export interface SkillSearchResult {
+  query: string;
+  results: SkillInfo[];
+  totalAvailable: number;
+}
+ 
+export interface ConversationContext {
+  role: string;
+  content: string;
+}
+ 
+// === Storage ===
+ 
+const SKILL_INDEX_KEY = 'zclaw-skill-index';
+const SKILL_SUGGESTIONS_KEY = 'zclaw-skill-suggestions';
+ 
+// === Skill Discovery Engine ===
+ 
+export class SkillDiscoveryEngine {
+  private skills: SkillInfo[] = [];
+  private suggestionHistory: SkillSuggestion[] = [];
+  private loadedFromBackend: boolean = false;
+ 
+  constructor() {
+    this.loadIndex();
+    this.loadSuggestions();
+    // Try to load from backend, fallback to cache
+    this.loadFromBackend();
+  }
+ 
+  /**
+   * Load skills from backend Tauri command.
+   * Falls back to cached skills if backend is unavailable.
+   */
+  private async loadFromBackend(): Promise<void> {
+    try {
+      // Dynamic import to avoid bundling issues in non-Tauri environments
+      const { invoke } = await import('@tauri-apps/api/core');
+      const backendSkills = await invoke<BackendSkillInfo[]>('skill_list');
+ 
+      // Convert backend format to frontend format
+      this.skills = backendSkills.map(this.convertFromBackend);
+      this.loadedFromBackend = true;
+      this.saveIndex();
+      console.log(`[SkillDiscovery] Loaded ${this.skills.length} skills from backend`);
+    } catch (error) {
+      console.warn('[SkillDiscovery] Failed to load skills from backend:', error);
+      // Keep using cached skills (loaded in loadIndex)
+      this.loadedFromBackend = false;
+    }
+  }
+ 
+  /**
+   * Convert backend skill format to frontend format.
+   */
+  private convertFromBackend(backend: BackendSkillInfo): SkillInfo {
+    return {
+      id: backend.id,
+      name: backend.name,
+      description: backend.description,
+      version: backend.version,
+      triggers: backend.tags, // Use tags as triggers
+      capabilities: backend.capabilities,
+      mode: backend.mode,
+      toolDeps: [], // Backend doesn't have this field
+      installed: backend.enabled,
+      category: backend.tags[0] || 'general',
+    };
+  }
+ 
+  /**
+   * Refresh skills from backend.
+   * Optionally specify a custom directory to scan.
+   */
+  async refresh(skillDir?: string): Promise<number> {
+    try {
+      const { invoke } = await import('@tauri-apps/api/core');
+      const backendSkills = await invoke<BackendSkillInfo[]>('skill_refresh', {
+        skillDir
+      });
+ 
+      this.skills = backendSkills.map(this.convertFromBackend);
+      this.loadedFromBackend = true;
+      this.saveIndex();
+      console.log(`[SkillDiscovery] Refreshed ${this.skills.length} skills`);
+      return this.skills.length;
+    } catch (error) {
+      console.error('[SkillDiscovery] Failed to refresh skills:', error);
+      throw error;
+    }
+  }
+ 
+  /**
+   * Check if skills were loaded from backend.
+   */
+  isLoadedFromBackend(): boolean {
+    return this.loadedFromBackend;
+  }
+ 
+  // === Search ===
+ 
+  /**
+   * Search skills by keyword. Matches against name, description, triggers, capabilities.
+   */
+  searchSkills(query: string): SkillSearchResult {
+    const q = query.toLowerCase().trim();
+    if (!q) {
+      return { query, results: [...this.skills], totalAvailable: this.skills.length };
+    }
+ 
+    const tokens = q.split(/[\s,;.!?。,;!?]+/).filter(t => t.length > 0);
+ 
+    const scored = this.skills.map(skill => {
+      let score = 0;
+ 
+      // Name match (highest weight)
+      if (skill.name.toLowerCase().includes(q)) score += 10;
+ 
+      // Description match
+      if (skill.description.toLowerCase().includes(q)) score += 5;
+ 
+      // Trigger match (exact or partial)
+      for (const trigger of skill.triggers) {
+        const tLower = trigger.toLowerCase();
+        if (tLower === q) { score += 15; break; }
+        if (tLower.includes(q) || q.includes(tLower)) score += 8;
+      }
+ 
+      // Capability match
+      for (const cap of skill.capabilities) {
+        if (cap.toLowerCase().includes(q)) score += 4;
+      }
+ 
+      // Token-level matching
+      for (const token of tokens) {
+        if (skill.name.toLowerCase().includes(token)) score += 2;
+        if (skill.description.toLowerCase().includes(token)) score += 1;
+        for (const trigger of skill.triggers) {
+          if (trigger.toLowerCase().includes(token)) score += 3;
+        }
+      }
+ 
+      // Category match
+      if (skill.category && skill.category.toLowerCase().includes(q)) score += 3;
+ 
+      return { skill, score };
+    });
+ 
+    const results = scored
+      .filter(s => s.score > 0)
+      .sort((a, b) => b.score - a.score)
+      .map(s => s.skill);
+ 
+    return { query, results, totalAvailable: this.skills.length };
+  }
+ 
+  // === Recommendation ===
+ 
+  /**
+   * Suggest skills based on recent conversation content and memory patterns.
+   */
+  async suggestSkills(
+    recentConversations: ConversationContext[],
+    agentId: string,
+    limit: number = 5
+  ): Promise<SkillSuggestion[]> {
+    const suggestions: SkillSuggestion[] = [];
+ 
+    // 1. Extract key topics from conversations
+    const topics = this.extractTopics(recentConversations);
+ 
+    // 2. Match topics against skill triggers and capabilities
+    for (const skill of this.skills) {
+      const matchedPatterns: string[] = [];
+      let confidence = 0;
+ 
+      for (const topic of topics) {
+        const topicLower = topic.toLowerCase();
+ 
+        // Check triggers
+        for (const trigger of skill.triggers) {
+          if (trigger.toLowerCase().includes(topicLower) || topicLower.includes(trigger.toLowerCase())) {
+            matchedPatterns.push(`话题"${topic}"匹配触发词"${trigger}"`);
+            confidence += 0.3;
+          }
+        }
+ 
+        // Check capabilities
+        for (const cap of skill.capabilities) {
+          if (cap.toLowerCase().includes(topicLower)) {
+            matchedPatterns.push(`话题"${topic}"匹配能力"${cap}"`);
+            confidence += 0.2;
+          }
+        }
+      }
+ 
+      // 3. Check memory patterns for recurring needs
+      try {
+        const memories = await intelligenceClient.memory.search({
+          agentId,
+          query: skill.name,
+          limit: 5,
+          minImportance: 3,
+        });
+        if (memories.length > 0) {
+          matchedPatterns.push(`记忆中有${memories.length}条相关记录`);
+          confidence += memories.length * 0.1;
+        }
+      } catch { /* non-critical */ }
+ 
+      if (matchedPatterns.length > 0 && confidence > 0) {
+        suggestions.push({
+          skill,
+          reason: matchedPatterns.slice(0, 3).join(';'),
+          confidence: Math.min(confidence, 1),
+          matchedPatterns,
+        });
+      }
+    }
+ 
+    // Sort by confidence
+    const sorted = suggestions
+      .sort((a, b) => b.confidence - a.confidence)
+      .slice(0, limit);
+ 
+    // Cache suggestions
+    this.suggestionHistory = sorted;
+    this.saveSuggestions();
+ 
+    return sorted;
+  }
+ 
+  // === Skill Management ===
+ 
+  /**
+   * Get all available skills.
+   */
+  getAllSkills(): SkillInfo[] {
+    return [...this.skills];
+  }
+ 
+  /**
+   * Get skills by category.
+   */
+  getSkillsByCategory(category: string): SkillInfo[] {
+    return this.skills.filter(s => s.category === category);
+  }
+ 
+  /**
+   * Get unique categories.
+   */
+  getCategories(): string[] {
+    return [...new Set(this.skills.map(s => s.category).filter(Boolean))] as string[];
+  }
+ 
+  /**
+   * Register a new skill (e.g., from a SKILL.md file scan).
+   */
+  registerSkill(skill: SkillInfo): void {
+    const existing = this.skills.findIndex(s => s.id === skill.id);
+    if (existing >= 0) {
+      this.skills[existing] = skill;
+    } else {
+      this.skills.push(skill);
+    }
+    this.saveIndex();
+  }
+ 
+  /**
+   * Mark a skill as installed/uninstalled.
+   * Includes autonomy check for skill_install/skill_uninstall actions.
+   */
+  setSkillInstalled(
+    skillId: string,
+    installed: boolean,
+    options?: { skipAutonomyCheck?: boolean }
+  ): { success: boolean; reason?: string } {
+    const skill = this.skills.find(s => s.id === skillId);
+    if (!skill) {
+      return { success: false, reason: `Skill not found: ${skillId}` };
+    }
+ 
+    // Autonomy check - verify if skill installation is allowed
+    if (!options?.skipAutonomyCheck) {
+      const action = installed ? 'skill_install' : 'skill_uninstall';
+      const { canProceed, decision } = canAutoExecute(action, 6);
+      console.log(`[SkillDiscovery] Autonomy check for ${action}: ${decision.reason}`);
+ 
+      if (!canProceed) {
+        return { success: false, reason: decision.reason };
+      }
+    }
+ 
+    skill.installed = installed;
+    this.saveIndex();
+    console.log(`[SkillDiscovery] Skill ${skillId} ${installed ? 'installed' : 'uninstalled'}`);
+    return { success: true };
+  }
+ 
+  /**
+   * Get last cached suggestions.
+   */
+  getLastSuggestions(): SkillSuggestion[] {
+    return [...this.suggestionHistory];
+  }
+ 
+  // === Topic Extraction ===
+ 
+  private extractTopics(conversations: ConversationContext[]): string[] {
+    const topics = new Set<string>();
+ 
+    const patterns = [
+      // Chinese task patterns
+      /帮我(.{2,15})/g,
+      /我想(.{2,15})/g,
+      /如何(.{2,15})/g,
+      /怎么(.{2,15})/g,
+      /需要(.{2,15})/g,
+      /分析(.{2,15})/g,
+      /写一个(.{2,15})/g,
+      /做一个(.{2,15})/g,
+      // English task patterns
+      /(?:help me |I need to |how to |please )(.{3,30})/gi,
+      // Technical terms
+      /(?:React|Vue|Python|Docker|K8s|API|SQL|CSS|TypeScript|Node|Git)/gi,
+      // Domain keywords
+      /(?:部署|测试|审查|优化|设计|开发|分析|报告|运营|安全)/g,
+    ];
+ 
+    for (const msg of conversations.filter(m => m.role === 'user')) {
+      for (const pattern of patterns) {
+        const matches = msg.content.matchAll(pattern);
+        for (const match of matches) {
+          const topic = (match[1] || match[0]).trim();
+          if (topic.length >= 2 && topic.length <= 30) {
+            topics.add(topic);
+          }
+        }
+      }
+    }
+ 
+    return [...topics].slice(0, 20);
+  }
+ 
+  // === Persistence ===
+ 
+  private loadIndex(): void {
+    try {
+      const raw = localStorage.getItem(SKILL_INDEX_KEY);
+      if (raw) this.skills = JSON.parse(raw);
+    } catch {
+      this.skills = [];
+    }
+  }
+ 
+  private saveIndex(): void {
+    try {
+      localStorage.setItem(SKILL_INDEX_KEY, JSON.stringify(this.skills));
+    } catch { /* silent */ }
+  }
+ 
+  private loadSuggestions(): void {
+    try {
+      const raw = localStorage.getItem(SKILL_SUGGESTIONS_KEY);
+      if (raw) this.suggestionHistory = JSON.parse(raw);
+    } catch {
+      this.suggestionHistory = [];
+    }
+  }
+ 
+  private saveSuggestions(): void {
+    try {
+      localStorage.setItem(SKILL_SUGGESTIONS_KEY, JSON.stringify(this.suggestionHistory));
+    } catch { /* silent */ }
+  }
+}
+ 
+// === Singleton ===
+ 
+let _instance: SkillDiscoveryEngine | null = null;
+ 
+export function getSkillDiscovery(): SkillDiscoveryEngine {
+  if (!_instance) {
+    _instance = new SkillDiscoveryEngine();
+  }
+  return _instance;
+}
+ 
+export function resetSkillDiscovery(): void {
+  _instance = null;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/tauri-gateway.ts.html b/desktop/coverage/src/lib/tauri-gateway.ts.html new file mode 100644 index 0000000..45d3037 --- /dev/null +++ b/desktop/coverage/src/lib/tauri-gateway.ts.html @@ -0,0 +1,739 @@ + + + + + + Code coverage report for src/lib/tauri-gateway.ts + + + + + + + + + +
+
+

All files / src/lib tauri-gateway.ts

+
+ +
+ 0% + Statements + 0/115 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/115 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { invoke } from '@tauri-apps/api/core';
+ 
+export interface LocalGatewayStatus {
+  supported: boolean;
+  cliAvailable: boolean;
+  runtimeSource: string | null;
+  runtimePath: string | null;
+  serviceLabel: string | null;
+  serviceLoaded: boolean;
+  serviceStatus: string | null;
+  configOk: boolean;
+  port: number | null;
+  portStatus: string | null;
+  probeUrl: string | null;
+  listenerPids: number[];
+  error: string | null;
+  raw: Record<string, unknown>;
+}
+ 
+export interface LocalGatewayAuth {
+  configPath: string | null;
+  gatewayToken: string | null;
+}
+ 
+export interface LocalGatewayPrepareResult {
+  configPath: string | null;
+  originsUpdated: boolean;
+  gatewayRestarted: boolean;
+}
+ 
+export interface LocalGatewayPairingApprovalResult {
+  approved: boolean;
+  requestId: string | null;
+  deviceId: string | null;
+}
+ 
+function buildFallbackStatus(supported: boolean, error: string | null = null): LocalGatewayStatus {
+  return {
+    supported,
+    cliAvailable: false,
+    runtimeSource: null,
+    runtimePath: null,
+    serviceLabel: null,
+    serviceLoaded: false,
+    serviceStatus: null,
+    configOk: false,
+    port: null,
+    portStatus: null,
+    probeUrl: null,
+    listenerPids: [],
+    error,
+    raw: {},
+  };
+}
+ 
+export function isTauriRuntime(): boolean {
+  return typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;
+}
+ 
+async function callLocalGateway(command: string): Promise<LocalGatewayStatus> {
+  if (!isTauriRuntime()) {
+    return buildFallbackStatus(false);
+  }
+ 
+  return invoke<LocalGatewayStatus>(command);
+}
+ 
+export function getUnsupportedLocalGatewayStatus(): LocalGatewayStatus {
+  return buildFallbackStatus(false);
+}
+ 
+export async function getLocalGatewayStatus(): Promise<LocalGatewayStatus> {
+  return callLocalGateway('gateway_status');
+}
+ 
+export async function startLocalGateway(): Promise<LocalGatewayStatus> {
+  return callLocalGateway('gateway_start');
+}
+ 
+export async function stopLocalGateway(): Promise<LocalGatewayStatus> {
+  return callLocalGateway('gateway_stop');
+}
+ 
+export async function restartLocalGateway(): Promise<LocalGatewayStatus> {
+  return callLocalGateway('gateway_restart');
+}
+ 
+export async function getLocalGatewayAuth(): Promise<LocalGatewayAuth> {
+  if (!isTauriRuntime()) {
+    return {
+      configPath: null,
+      gatewayToken: null,
+    };
+  }
+ 
+  return invoke<LocalGatewayAuth>('gateway_local_auth');
+}
+ 
+export async function prepareLocalGatewayForTauri(): Promise<LocalGatewayPrepareResult> {
+  if (!isTauriRuntime()) {
+    return {
+      configPath: null,
+      originsUpdated: false,
+      gatewayRestarted: false,
+    };
+  }
+ 
+  return invoke<LocalGatewayPrepareResult>('gateway_prepare_for_tauri');
+}
+ 
+export async function approveLocalGatewayDevicePairing(deviceId: string, publicKeyBase64: string, url?: string): Promise<LocalGatewayPairingApprovalResult> {
+  if (!isTauriRuntime()) {
+    return {
+      approved: false,
+      requestId: null,
+      deviceId: null,
+    };
+  }
+ 
+  return invoke<LocalGatewayPairingApprovalResult>('gateway_approve_device_pairing', {
+    deviceId,
+    publicKeyBase64,
+    url,
+  });
+}
+ 
+// ============================================================================
+// Process Monitoring Types and Functions
+// ============================================================================
+ 
+export interface ProcessInfo {
+  pid: number;
+  name: string;
+  status: string;
+  cpuPercent: number | null;
+  memoryMb: number | null;
+  uptimeSeconds: number | null;
+}
+ 
+export interface ProcessListResponse {
+  processes: ProcessInfo[];
+  totalCount: number;
+  runtimeSource: string | null;
+}
+ 
+export interface ProcessLogsResponse {
+  pid: number | null;
+  logs: string;
+  lines: number;
+  runtimeSource: string | null;
+}
+ 
+export interface VersionResponse {
+  version: string;
+  commit: string | null;
+  buildDate: string | null;
+  runtimeSource: string | null;
+  raw: Record<string, unknown>;
+}
+ 
+/**
+ * List OpenFang processes
+ * @returns List of running OpenFang processes with their status
+ */
+export async function getOpenFangProcessList(): Promise<ProcessListResponse> {
+  if (!isTauriRuntime()) {
+    return {
+      processes: [],
+      totalCount: 0,
+      runtimeSource: null,
+    };
+  }
+ 
+  return invoke<ProcessListResponse>('openfang_process_list');
+}
+ 
+/**
+ * Get OpenFang process logs
+ * @param pid - Optional process ID to get logs for. If not specified, gets main process logs.
+ * @param lines - Number of log lines to retrieve (default: 100)
+ * @returns Process logs
+ */
+export async function getOpenFangProcessLogs(
+  pid?: number,
+  lines?: number
+): Promise<ProcessLogsResponse> {
+  if (!isTauriRuntime()) {
+    return {
+      pid: pid ?? null,
+      logs: '',
+      lines: 0,
+      runtimeSource: null,
+    };
+  }
+ 
+  return invoke<ProcessLogsResponse>('openfang_process_logs', {
+    pid,
+    lines,
+  });
+}
+ 
+/**
+ * Get OpenFang version information
+ * @returns Version information including version string, commit hash, and build date
+ */
+export async function getOpenFangVersion(): Promise<VersionResponse> {
+  if (!isTauriRuntime()) {
+    return {
+      version: 'unknown',
+      commit: null,
+      buildDate: null,
+      runtimeSource: null,
+      raw: {},
+    };
+  }
+ 
+  return invoke<VersionResponse>('openfang_version');
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/team-client.ts.html b/desktop/coverage/src/lib/team-client.ts.html new file mode 100644 index 0000000..fdfcc22 --- /dev/null +++ b/desktop/coverage/src/lib/team-client.ts.html @@ -0,0 +1,1405 @@ + + + + + + Code coverage report for src/lib/team-client.ts + + + + + + + + + +
+
+

All files / src/lib team-client.ts

+
+ +
+ 91.91% + Statements + 250/272 +
+ + +
+ 78.57% + Branches + 22/28 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 91.91% + Lines + 250/272 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +17x +17x +17x +17x +17x +  +17x +17x +17x +17x +17x +17x +17x +17x +  +17x +  +  +  +  +  +  +  +  +  +17x +17x +  +  +  +  +  +  +  +  +  +  +17x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +1x +  +1x +1x +  +1x +  +  +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +1x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +1x +1x +1x +1x +  +1x + 
/**
+ * OpenFang Team API Client
+ *
+ * REST API client for multi-agent team collaboration endpoints.
+ * Communicates with OpenFang Kernel for team management,
+ * task coordination, and Dev↔QA loops.
+ *
+ * @module lib/team-client
+ */
+ 
+import type {
+  Team,
+  TeamMember,
+  TeamTask,
+  TeamMemberRole,
+  DevQALoop,
+  CreateTeamRequest,
+  AddTeamTaskRequest,
+  TeamResponse,
+  ReviewFeedback,
+  TaskDeliverable,
+  CollaborationEvent,
+  TeamMetrics,
+} from '../types/team';
+ 
+// Re-export types for consumers
+export type { CollaborationEvent } from '../types/team';
+ 
+// === Configuration ===
+ 
+const API_BASE = '/api';  // Uses Vite proxy
+ 
+// === Error Types ===
+ 
+export class TeamAPIError extends Error {
+  constructor(
+    message: string,
+    public statusCode: number,
+    public endpoint: string,
+    public details?: unknown
+  ) {
+    super(message);
+    this.name = 'TeamAPIError';
+  }
+}
+ 
+// === Helper Functions ===
+ 
+async function request<T>(
+  endpoint: string,
+  options: RequestInit = {}
+): Promise<T> {
+  const url = `${API_BASE}${endpoint}`;
+ 
+  try {
+    const response = await fetch(url, {
+      headers: {
+        'Content-Type': 'application/json',
+        ...options.headers,
+      },
+      ...options,
+    });
+ 
+    if (!response.ok) {
+      const errorData = await response.json().catch(() => ({}));
+      throw new TeamAPIError(
+        errorData.message || `HTTP ${response.status}`,
+        response.status,
+        endpoint,
+        errorData
+      );
+    }
+ 
+    return response.json();
+  } catch (error) {
+    if (error instanceof TeamAPIError) {
+      throw error;
+    }
+    throw new TeamAPIError(
+      (error as Error).message,
+      0,
+      endpoint,
+      error
+    );
+  }
+}
+ 
+// === Team API ===
+ 
+/**
+ * List all teams
+ */
+export async function listTeams(): Promise<{ teams: Team[]; total: number }> {
+  return request<{ teams: Team[]; total: number }>('/teams');
+}
+ 
+/**
+ * Get a specific team by ID
+ */
+export async function getTeam(teamId: string): Promise<TeamResponse> {
+  return request<TeamResponse>(`/teams/${teamId}`);
+}
+ 
+/**
+ * Create a new team
+ */
+export async function createTeam(data: CreateTeamRequest): Promise<TeamResponse> {
+  return request<TeamResponse>('/teams', {
+    method: 'POST',
+    body: JSON.stringify(data),
+  });
+}
+ 
+/**
+ * Update a team
+ */
+export async function updateTeam(
+  teamId: string,
+  data: Partial<Pick<Team, 'name' | 'description' | 'pattern' | 'status'>>
+): Promise<TeamResponse> {
+  return request<TeamResponse>(`/teams/${teamId}`, {
+    method: 'PUT',
+    body: JSON.stringify(data),
+  });
+}
+ 
+/**
+ * Delete a team
+ */
+export async function deleteTeam(teamId: string): Promise<{ success: boolean }> {
+  return request<{ success: boolean }>(`/teams/${teamId}`, {
+    method: 'DELETE',
+  });
+}
+ 
+// === Team Member API ===
+ 
+/**
+ * Add a member to a team
+ */
+export async function addTeamMember(
+  teamId: string,
+  agentId: string,
+  role: TeamMemberRole
+): Promise<{ member: TeamMember; success: boolean }> {
+  return request<{ member: TeamMember; success: boolean }>(
+    `/teams/${teamId}/members`,
+    {
+      method: 'POST',
+      body: JSON.stringify({ agentId, role }),
+    }
+  );
+}
+ 
+/**
+ * Remove a member from a team
+ */
+export async function removeTeamMember(
+  teamId: string,
+  memberId: string
+): Promise<{ success: boolean }> {
+  return request<{ success: boolean }>(
+    `/teams/${teamId}/members/${memberId}`,
+    { method: 'DELETE' }
+  );
+}
+ 
+/**
+ * Update a member's role
+ */
+export async function updateMemberRole(
+  teamId: string,
+  memberId: string,
+  role: TeamMemberRole
+): Promise<{ member: TeamMember; success: boolean }> {
+  return request<{ member: TeamMember; success: boolean }>(
+    `/teams/${teamId}/members/${memberId}`,
+    {
+      method: 'PUT',
+      body: JSON.stringify({ role }),
+    }
+  );
+}
+ 
+// === Team Task API ===
+ 
+/**
+ * Add a task to a team
+ */
+export async function addTeamTask(
+  data: AddTeamTaskRequest
+): Promise<{ task: TeamTask; success: boolean }> {
+  return request<{ task: TeamTask; success: boolean }>(
+    `/teams/${data.teamId}/tasks`,
+    {
+      method: 'POST',
+      body: JSON.stringify({
+        title: data.title,
+        description: data.description,
+        priority: data.priority,
+        type: data.type,
+        assigneeId: data.assigneeId,
+        dependencies: data.dependencies,
+        estimate: data.estimate,
+      }),
+    }
+  );
+}
+ 
+/**
+ * Update a task's status
+ */
+export async function updateTaskStatus(
+  teamId: string,
+  taskId: string,
+  status: TeamTask['status']
+): Promise<{ task: TeamTask; success: boolean }> {
+  return request<{ task: TeamTask; success: boolean }>(
+    `/teams/${teamId}/tasks/${taskId}`,
+    {
+      method: 'PUT',
+      body: JSON.stringify({ status }),
+    }
+  );
+}
+ 
+/**
+ * Assign a task to a member
+ */
+export async function assignTask(
+  teamId: string,
+  taskId: string,
+  memberId: string
+): Promise<{ task: TeamTask; success: boolean }> {
+  return request<{ task: TeamTask; success: boolean }>(
+    `/teams/${teamId}/tasks/${taskId}/assign`,
+    {
+      method: 'POST',
+      body: JSON.stringify({ memberId }),
+    }
+  );
+}
+ 
+/**
+ * Submit a deliverable for a task
+ */
+export async function submitDeliverable(
+  teamId: string,
+  taskId: string,
+  deliverable: TaskDeliverable
+): Promise<{ task: TeamTask; success: boolean }> {
+  return request<{ task: TeamTask; success: boolean }>(
+    `/teams/${teamId}/tasks/${taskId}/deliverable`,
+    {
+      method: 'POST',
+      body: JSON.stringify(deliverable),
+    }
+  );
+}
+ 
+// === Dev↔QA Loop API ===
+ 
+/**
+ * Start a Dev↔QA loop for a task
+ */
+export async function startDevQALoop(
+  teamId: string,
+  taskId: string,
+  developerId: string,
+  reviewerId: string
+): Promise<{ loop: DevQALoop; success: boolean }> {
+  return request<{ loop: DevQALoop; success: boolean }>(
+    `/teams/${teamId}/loops`,
+    {
+      method: 'POST',
+      body: JSON.stringify({ taskId, developerId, reviewerId }),
+    }
+  );
+}
+ 
+/**
+ * Submit a review for a Dev↔QA loop
+ */
+export async function submitReview(
+  teamId: string,
+  loopId: string,
+  feedback: Omit<ReviewFeedback, 'reviewedAt' | 'reviewerId'>
+): Promise<{ loop: DevQALoop; success: boolean }> {
+  return request<{ loop: DevQALoop; success: boolean }>(
+    `/teams/${teamId}/loops/${loopId}/review`,
+    {
+      method: 'POST',
+      body: JSON.stringify(feedback),
+    }
+  );
+}
+ 
+/**
+ * Update a Dev↔QA loop state
+ */
+export async function updateLoopState(
+  teamId: string,
+  loopId: string,
+  state: DevQALoop['state']
+): Promise<{ loop: DevQALoop; success: boolean }> {
+  return request<{ loop: DevQALoop; success: boolean }>(
+    `/teams/${teamId}/loops/${loopId}`,
+    {
+      method: 'PUT',
+      body: JSON.stringify({ state }),
+    }
+  );
+}
+ 
+// === Metrics & Events ===
+ 
+/**
+ * Get team metrics
+ */
+export async function getTeamMetrics(teamId: string): Promise<TeamMetrics> {
+  return request<TeamMetrics>(`/teams/${teamId}/metrics`);
+}
+ 
+/**
+ * Get recent collaboration events
+ */
+export async function getTeamEvents(
+  teamId: string,
+  limit?: number
+): Promise<{ events: CollaborationEvent[]; total: number }> {
+  const query = limit ? `?limit=${limit}` : '';
+  return request<{ events: CollaborationEvent[]; total: number }>(
+    `/teams/${teamId}/events${query}`
+  );
+}
+ 
+// === WebSocket Event Subscription ===
+ 
+export type TeamEventType =
+  | 'team.created'
+  | 'team.updated'
+  | 'team.deleted'
+  | 'member.added'
+  | 'member.removed'
+  | 'member.status_changed'
+  | 'task.created'
+  | 'task.assigned'
+  | 'task.status_changed'
+  | 'task.completed'
+  | 'loop.started'
+  | 'loop.state_changed'
+  | 'loop.completed'
+  | 'review.submitted';
+ 
+export interface TeamEventMessage {
+  type: 'team_event';
+  eventType: TeamEventType;
+  teamId: string;
+  payload: Record<string, unknown>;
+  timestamp: string;
+}
+ 
+/**
+ * Subscribe to team events via WebSocket
+ * Returns an unsubscribe function
+ */
+export function subscribeToTeamEvents(
+  teamId: string | null,  // null = all teams
+  callback: (event: TeamEventMessage) => void,
+  ws: WebSocket
+): () => void {
+  const handleMessage = (event: MessageEvent) => {
+    try {
+      const data = JSON.parse(event.data);
+      if (data.type === 'team_event') {
+        // Filter by teamId if specified
+        if (teamId === null || data.teamId === teamId) {
+          callback(data as TeamEventMessage);
+        }
+      }
+    } catch {
+      // Ignore non-JSON messages
+    }
+  };
+ 
+  ws.addEventListener('message', handleMessage);
+ 
+  // Send subscription message
+  if (ws.readyState === WebSocket.OPEN) {
+    ws.send(JSON.stringify({
+      type: 'subscribe',
+      topic: teamId ? `team:${teamId}` : 'teams',
+    }));
+  }
+ 
+  // Return unsubscribe function
+  return () => {
+    ws.removeEventListener('message', handleMessage);
+    if (ws.readyState === WebSocket.OPEN) {
+      ws.send(JSON.stringify({
+        type: 'unsubscribe',
+        topic: teamId ? `team:${teamId}` : 'teams',
+      }));
+    }
+  };
+}
+ 
+// === Export singleton client ===
+ 
+export const teamClient = {
+  // Teams
+  listTeams,
+  getTeam,
+  createTeam,
+  updateTeam,
+  deleteTeam,
+ 
+  // Members
+  addTeamMember,
+  removeTeamMember,
+  updateMemberRole,
+ 
+  // Tasks
+  addTeamTask,
+  updateTaskStatus,
+  assignTask,
+  submitDeliverable,
+ 
+  // Dev↔QA Loops
+  startDevQALoop,
+  submitReview,
+  updateLoopState,
+ 
+  // Metrics & Events
+  getTeamMetrics,
+  getTeamEvents,
+  subscribeToTeamEvents,
+};
+ 
+export default teamClient;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/toml-utils.ts.html b/desktop/coverage/src/lib/toml-utils.ts.html new file mode 100644 index 0000000..e0f713a --- /dev/null +++ b/desktop/coverage/src/lib/toml-utils.ts.html @@ -0,0 +1,643 @@ + + + + + + Code coverage report for src/lib/toml-utils.ts + + + + + + + + + +
+
+

All files / src/lib toml-utils.ts

+
+ +
+ 100% + Statements + 76/76 +
+ + +
+ 82.35% + Branches + 14/17 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 100% + Lines + 76/76 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +1871x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +8x +8x +8x +1x +1x +1x +1x +1x +1x +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +3x +3x +3x +1x +1x +1x +1x +1x +1x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +7x +7x +7x +7x +  +5x +4x +4x +  +  +  +1x +1x +1x +1x +7x +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +4x +4x +  +  +  +  +  +  +  +1x +4x +4x +4x +4x +4x +4x +4x +1x +  +1x + 
/**
+ * TOML Utility Functions
+ *
+ * Provides TOML parsing and serialization capabilities for OpenFang configuration files.
+ * Supports environment variable interpolation in the format ${VAR_NAME}.
+ *
+ * @module toml-utils
+ */
+ 
+import TOML from 'smol-toml';
+ 
+/**
+ * Error class for TOML parsing errors
+ */
+export class TomlParseError extends Error {
+  constructor(
+    message: string,
+    public readonly cause?: unknown
+  ) {
+    super(message);
+    this.name = 'TomlParseError';
+  }
+}
+ 
+/**
+ * Error class for TOML serialization errors
+ */
+export class TomlStringifyError extends Error {
+  constructor(
+    message: string,
+    public readonly cause?: unknown
+  ) {
+    super(message);
+    this.name = 'TomlStringifyError';
+  }
+}
+ 
+/**
+ * TOML utility functions for parsing and serializing configuration files
+ */
+export const tomlUtils = {
+  /**
+   * Parse a TOML string into a JavaScript object
+   *
+   * @param content - The TOML string to parse
+   * @returns The parsed JavaScript object
+   * @throws TomlParseError if the TOML content is invalid
+   *
+   * @example
+   * ```typescript
+   * const config = tomlUtils.parse(`
+   *   [server]
+   *   host = "127.0.0.1"
+   *   port = 4200
+   * `);
+   * // config = { server: { host: "127.0.0.1", port: 4200 } }
+   * ```
+   */
+  parse: <T = Record<string, unknown>>(content: string): T => {
+    try {
+      return TOML.parse(content) as T;
+    } catch (error) {
+      console.error('[TOML] Parse error:', error);
+      throw new TomlParseError(
+        `TOML parse error: ${error instanceof Error ? error.message : String(error)}`,
+        error
+      );
+    }
+  },
+ 
+  /**
+   * Serialize a JavaScript object to a TOML string
+   *
+   * @param data - The JavaScript object to serialize
+   * @returns The TOML string representation
+   * @throws TomlStringifyError if the object cannot be serialized to TOML
+   *
+   * @example
+   * ```typescript
+   * const toml = tomlUtils.stringify({
+   *   server: { host: "127.0.0.1", port: 4200 }
+   * });
+   * ```
+   */
+  stringify: (data: Record<string, unknown>): string => {
+    try {
+      return TOML.stringify(data);
+    } catch (error) {
+      console.error('[TOML] Stringify error:', error);
+      throw new TomlStringifyError(
+        `TOML stringify error: ${error instanceof Error ? error.message : String(error)}`,
+        error
+      );
+    }
+  },
+ 
+  /**
+   * Resolve environment variables in TOML content
+   *
+   * Replaces ${VAR_NAME} patterns with the corresponding environment variable values.
+   * If the environment variable is not set, it's replaced with an empty string.
+   *
+   * Note: In browser/Tauri context, this function has limited access to environment
+   * variables. For full resolution, use the Tauri backend to read env vars.
+   *
+   * @param content - The TOML content with potential ${VAR_NAME} patterns
+   * @param envVars - Optional object containing environment variables (for testing or Tauri-provided values)
+   * @returns The content with environment variables resolved
+   *
+   * @example
+   * ```typescript
+   * const content = 'api_key = "${OPENAI_API_KEY}"';
+   * const resolved = tomlUtils.resolveEnvVars(content, { OPENAI_API_KEY: 'sk-...' });
+   * // resolved = 'api_key = "sk-..."'
+   * ```
+   */
+  resolveEnvVars: (
+    content: string,
+    envVars?: Record<string, string | undefined>
+  ): string => {
+    return content.replace(/\$\{([^}]+)\}/g, (_, varName: string) => {
+      // If envVars provided, use them; otherwise try to access from window or return empty
+      if (envVars) {
+        return envVars[varName] ?? '';
+      }
+ 
+      // In browser context, we can't access process.env directly
+      // This will be handled by passing envVars from Tauri backend
+      console.warn(
+        `[TOML] Environment variable ${varName} not resolved - no envVars provided`
+      );
+      return '';
+    });
+  },
+ 
+  /**
+   * Parse TOML content with environment variable resolution
+   *
+   * Convenience method that combines resolveEnvVars and parse.
+   *
+   * @param content - The TOML content with potential ${VAR_NAME} patterns
+   * @param envVars - Optional object containing environment variables
+   * @returns The parsed and resolved JavaScript object
+   *
+   * @example
+   * ```typescript
+   * const config = tomlUtils.parseWithEnvVars(tomlContent, {
+   *   ZHIPU_API_KEY: 'your-api-key'
+   * });
+   * ```
+   */
+  parseWithEnvVars: <T = Record<string, unknown>>(
+    content: string,
+    envVars?: Record<string, string | undefined>
+  ): T => {
+    const resolved = tomlUtils.resolveEnvVars(content, envVars);
+    return tomlUtils.parse<T>(resolved);
+  },
+ 
+  /**
+   * Check if a string contains unresolved environment variable placeholders
+   *
+   * @param content - The content to check
+   * @returns true if there are unresolved ${VAR_NAME} patterns
+   */
+  hasUnresolvedEnvVars: (content: string): boolean => {
+    return /\$\{[^}]+\}/.test(content);
+  },
+ 
+  /**
+   * Extract environment variable names from TOML content
+   *
+   * @param content - The TOML content to scan
+   * @returns Array of environment variable names found
+   */
+  extractEnvVarNames: (content: string): string[] => {
+    const matches = content.matchAll(/\$\{([^}]+)\}/g);
+    const names = new Set<string>();
+    for (const match of matches) {
+      names.add(match[1]);
+    }
+    return Array.from(names);
+  },
+};
+ 
+export default tomlUtils;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/use-onboarding.ts.html b/desktop/coverage/src/lib/use-onboarding.ts.html new file mode 100644 index 0000000..e25e0de --- /dev/null +++ b/desktop/coverage/src/lib/use-onboarding.ts.html @@ -0,0 +1,469 @@ + + + + + + Code coverage report for src/lib/use-onboarding.ts + + + + + + + + + +
+
+

All files / src/lib use-onboarding.ts

+
+ +
+ 0% + Statements + 0/74 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * useOnboarding - Hook for detecting and managing first-time user onboarding
+ *
+ * Determines if user needs to go through the onboarding wizard.
+ * Stores completion status in localStorage.
+ */
+ 
+import { useState, useEffect, useCallback } from 'react';
+ 
+const ONBOARDING_COMPLETED_KEY = 'zclaw-onboarding-completed';
+const USER_PROFILE_KEY = 'zclaw-user-profile';
+ 
+export interface UserProfile {
+  userName: string;
+  userRole?: string;
+  completedAt: string;
+}
+ 
+export interface OnboardingState {
+  isNeeded: boolean;
+  isLoading: boolean;
+  userProfile: UserProfile | null;
+  markCompleted: (profile: Omit<UserProfile, 'completedAt'>) => void;
+  resetOnboarding: () => void;
+}
+ 
+/**
+ * Hook to manage first-time user onboarding
+ *
+ * Usage:
+ * ```tsx
+ * const { isNeeded, isLoading, markCompleted } = useOnboarding();
+ *
+ * if (isNeeded) {
+ *   return <OnboardingWizard onComplete={markCompleted} />;
+ * }
+ * ```
+ */
+export function useOnboarding(): OnboardingState {
+  const [isNeeded, setIsNeeded] = useState(false);
+  const [isLoading, setIsLoading] = useState(true);
+  const [userProfile, setUserProfile] = useState<UserProfile | null>(null);
+ 
+  // Check onboarding status on mount
+  useEffect(() => {
+    try {
+      const completed = localStorage.getItem(ONBOARDING_COMPLETED_KEY);
+      const profileStr = localStorage.getItem(USER_PROFILE_KEY);
+ 
+      if (completed === 'true' && profileStr) {
+        const profile = JSON.parse(profileStr) as UserProfile;
+        setUserProfile(profile);
+        setIsNeeded(false);
+      } else {
+        // No onboarding record - first time user
+        setIsNeeded(true);
+      }
+    } catch (err) {
+      console.warn('[useOnboarding] Failed to check onboarding status:', err);
+      setIsNeeded(true);
+    } finally {
+      setIsLoading(false);
+    }
+  }, []);
+ 
+  // Mark onboarding as completed
+  const markCompleted = useCallback((profile: Omit<UserProfile, 'completedAt'>) => {
+    const fullProfile: UserProfile = {
+      ...profile,
+      completedAt: new Date().toISOString(),
+    };
+ 
+    try {
+      localStorage.setItem(ONBOARDING_COMPLETED_KEY, 'true');
+      localStorage.setItem(USER_PROFILE_KEY, JSON.stringify(fullProfile));
+      setUserProfile(fullProfile);
+      setIsNeeded(false);
+      console.log('[useOnboarding] Onboarding completed for user:', profile.userName);
+    } catch (err) {
+      console.error('[useOnboarding] Failed to save onboarding status:', err);
+    }
+  }, []);
+ 
+  // Reset onboarding (for testing or user request)
+  const resetOnboarding = useCallback(() => {
+    try {
+      localStorage.removeItem(ONBOARDING_COMPLETED_KEY);
+      localStorage.removeItem(USER_PROFILE_KEY);
+      setUserProfile(null);
+      setIsNeeded(true);
+      console.log('[useOnboarding] Onboarding reset');
+    } catch (err) {
+      console.error('[useOnboarding] Failed to reset onboarding:', err);
+    }
+  }, []);
+ 
+  return {
+    isNeeded,
+    isLoading,
+    userProfile,
+    markCompleted,
+    resetOnboarding,
+  };
+}
+ 
+/**
+ * Get stored user profile without hook (for use outside React components)
+ */
+export function getStoredUserProfile(): UserProfile | null {
+  try {
+    const profileStr = localStorage.getItem(USER_PROFILE_KEY);
+    if (profileStr) {
+      return JSON.parse(profileStr) as UserProfile;
+    }
+  } catch (err) {
+    console.warn('[useOnboarding] Failed to get user profile:', err);
+  }
+  return null;
+}
+ 
+/**
+ * Check if onboarding is completed (for use outside React components)
+ */
+export function isOnboardingCompleted(): boolean {
+  return localStorage.getItem(ONBOARDING_COMPLETED_KEY) === 'true';
+}
+ 
+export default useOnboarding;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/useProposalNotifications.ts.html b/desktop/coverage/src/lib/useProposalNotifications.ts.html new file mode 100644 index 0000000..b31c000 --- /dev/null +++ b/desktop/coverage/src/lib/useProposalNotifications.ts.html @@ -0,0 +1,634 @@ + + + + + + Code coverage report for src/lib/useProposalNotifications.ts + + + + + + + + + +
+
+

All files / src/lib useProposalNotifications.ts

+
+ +
+ 0% + Statements + 0/100 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Proposal Notifications Hook
+ *
+ * Periodically polls for pending identity change proposals and shows
+ * notifications when new proposals are available.
+ *
+ * Usage:
+ * ```tsx
+ * // In App.tsx or a top-level component
+ * useProposalNotifications();
+ * ```
+ */
+ 
+import { useEffect, useRef, useCallback } from 'react';
+import { useChatStore } from '../store/chatStore';
+import { intelligenceClient, type IdentityChangeProposal } from './intelligence-client';
+ 
+// Configuration
+const POLL_INTERVAL_MS = 60_000; // 1 minute
+const NOTIFICATION_COOLDOWN_MS = 300_000; // 5 minutes - don't spam notifications
+ 
+// Storage key for tracking notified proposals
+const NOTIFIED_PROPOSALS_KEY = 'zclaw-notified-proposals';
+ 
+/**
+ * Get set of already notified proposal IDs
+ */
+function getNotifiedProposals(): Set<string> {
+  try {
+    const stored = localStorage.getItem(NOTIFIED_PROPOSALS_KEY);
+    if (stored) {
+      return new Set(JSON.parse(stored) as string[]);
+    }
+  } catch {
+    // Ignore errors
+  }
+  return new Set();
+}
+ 
+/**
+ * Save notified proposal IDs
+ */
+function saveNotifiedProposals(ids: Set<string>): void {
+  try {
+    // Keep only last 100 IDs to prevent storage bloat
+    const arr = Array.from(ids).slice(-100);
+    localStorage.setItem(NOTIFIED_PROPOSALS_KEY, JSON.stringify(arr));
+  } catch {
+    // Ignore errors
+  }
+}
+ 
+/**
+ * Hook for showing proposal notifications
+ *
+ * This hook:
+ * 1. Polls for pending proposals every minute
+ * 2. Shows a toast notification when new proposals are found
+ * 3. Tracks which proposals have already been notified to avoid spam
+ */
+export function useProposalNotifications(): {
+  pendingCount: number;
+  refresh: () => Promise<void>;
+} {
+  const { currentAgent } = useChatStore();
+  const agentId = currentAgent?.id;
+ 
+  const pendingCountRef = useRef(0);
+  const lastNotificationTimeRef = useRef(0);
+  const notifiedProposalsRef = useRef(getNotifiedProposals());
+  const isPollingRef = useRef(false);
+ 
+  const checkForNewProposals = useCallback(async () => {
+    if (!agentId || isPollingRef.current) return;
+ 
+    isPollingRef.current = true;
+ 
+    try {
+      const proposals = await intelligenceClient.identity.getPendingProposals(agentId);
+      pendingCountRef.current = proposals.length;
+ 
+      // Find proposals we haven't notified about
+      const newProposals = proposals.filter(
+        (p: IdentityChangeProposal) => !notifiedProposalsRef.current.has(p.id)
+      );
+ 
+      if (newProposals.length > 0) {
+        const now = Date.now();
+ 
+        // Check cooldown to avoid spam
+        if (now - lastNotificationTimeRef.current >= NOTIFICATION_COOLDOWN_MS) {
+          // Dispatch custom event for the app to handle
+          // This allows the app to show toast, play sound, etc.
+          const event = new CustomEvent('zclaw:proposal-available', {
+            detail: {
+              count: newProposals.length,
+              proposals: newProposals,
+            },
+          });
+          window.dispatchEvent(event);
+ 
+          lastNotificationTimeRef.current = now;
+        }
+ 
+        // Mark these proposals as notified
+        for (const p of newProposals) {
+          notifiedProposalsRef.current.add(p.id);
+        }
+        saveNotifiedProposals(notifiedProposalsRef.current);
+      }
+    } catch (err) {
+      console.warn('[ProposalNotifications] Failed to check proposals:', err);
+    } finally {
+      isPollingRef.current = false;
+    }
+  }, [agentId]);
+ 
+  // Set up polling
+  useEffect(() => {
+    if (!agentId) return;
+ 
+    // Initial check
+    checkForNewProposals();
+ 
+    // Set up interval
+    const intervalId = setInterval(checkForNewProposals, POLL_INTERVAL_MS);
+ 
+    return () => {
+      clearInterval(intervalId);
+    };
+  }, [agentId, checkForNewProposals]);
+ 
+  // Listen for visibility change to refresh when app becomes visible
+  useEffect(() => {
+    const handleVisibilityChange = () => {
+      if (document.visibilityState === 'visible') {
+        checkForNewProposals();
+      }
+    };
+ 
+    document.addEventListener('visibilitychange', handleVisibilityChange);
+ 
+    return () => {
+      document.removeEventListener('visibilitychange', handleVisibilityChange);
+    };
+  }, [checkForNewProposals]);
+ 
+  return {
+    pendingCount: pendingCountRef.current,
+    refresh: checkForNewProposals,
+  };
+}
+ 
+/**
+ * Component that sets up proposal notification handling
+ *
+ * Place this near the root of the app to enable proposal notifications
+ */
+export function ProposalNotificationHandler(): null {
+  // This effect sets up the global event listener for proposal notifications
+  useEffect(() => {
+    const handleProposalAvailable = (event: Event) => {
+      const customEvent = event as CustomEvent<{ count: number }>;
+      const { count } = customEvent.detail;
+ 
+      // You can integrate with a toast system here
+      console.log(`[ProposalNotifications] ${count} new proposal(s) available`);
+ 
+      // If using the Toast system from Toast.tsx, you would do:
+      // toast(`${count} 个新的人格变更提案待审批`, 'info');
+    };
+ 
+    window.addEventListener('zclaw:proposal-available', handleProposalAvailable);
+ 
+    return () => {
+      window.removeEventListener('zclaw:proposal-available', handleProposalAvailable);
+    };
+  }, []);
+ 
+  return null;
+}
+ 
+export default useProposalNotifications;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/useTeamEvents.ts.html b/desktop/coverage/src/lib/useTeamEvents.ts.html new file mode 100644 index 0000000..da6f04c --- /dev/null +++ b/desktop/coverage/src/lib/useTeamEvents.ts.html @@ -0,0 +1,691 @@ + + + + + + Code coverage report for src/lib/useTeamEvents.ts + + + + + + + + + +
+
+

All files / src/lib useTeamEvents.ts

+
+ +
+ 0% + Statements + 0/135 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/135 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * useTeamEvents - WebSocket Real-time Event Sync Hook
+ *
+ * Subscribes to team collaboration events via WebSocket
+ * and updates the team store in real-time.
+ *
+ * @module lib/useTeamEvents
+ */
+ 
+import { useEffect, useRef, useCallback } from 'react';
+import { useTeamStore } from '../store/teamStore';
+import { useGatewayStore } from '../store/gatewayStore';
+import type { TeamEventMessage, TeamEventType, CollaborationEvent } from '../lib/team-client';
+import { silentErrorHandler } from './error-utils';
+ 
+interface UseTeamEventsOptions {
+  /** Subscribe to specific team only, or null for all teams */
+  teamId?: string | null;
+  /** Event types to subscribe to (default: all) */
+  eventTypes?: TeamEventType[];
+  /** Maximum events to keep in history (default: 100) */
+  maxEvents?: number;
+}
+ 
+/**
+ * Hook for subscribing to real-time team collaboration events
+ */
+export function useTeamEvents(options: UseTeamEventsOptions = {}) {
+  const { teamId = null, eventTypes } = options;
+  const unsubscribeRef = useRef<(() => void) | null>(null);
+ 
+  const {
+    addEvent,
+    updateTaskStatus,
+    updateLoopState,
+    loadTeams,
+  } = useTeamStore();
+ 
+  const { connectionState } = useGatewayStore();
+ 
+  const handleTeamEvent = useCallback(
+    (message: TeamEventMessage) => {
+      // Filter by event types if specified
+      if (eventTypes && !eventTypes.includes(message.eventType)) {
+        return;
+      }
+ 
+      // Create collaboration event for store
+      const event = {
+        type: mapEventType(message.eventType),
+        teamId: message.teamId,
+        sourceAgentId: (message.payload.sourceAgentId as string) || 'system',
+        payload: message.payload,
+        timestamp: message.timestamp,
+      };
+ 
+      // Add to event history
+      addEvent(event);
+ 
+      // Handle specific event types
+      switch (message.eventType) {
+        case 'task.status_changed':
+          if (message.payload.taskId && message.payload.status) {
+            updateTaskStatus(
+              message.teamId,
+              message.payload.taskId as string,
+              message.payload.status as any
+            );
+          }
+          break;
+ 
+        case 'loop.state_changed':
+          if (message.payload.loopId && message.payload.state) {
+            updateLoopState(
+              message.teamId,
+              message.payload.loopId as string,
+              message.payload.state as any
+            );
+          }
+          break;
+ 
+        case 'team.updated':
+        case 'member.added':
+        case 'member.removed':
+          // Reload teams to get updated data
+          loadTeams().catch(silentErrorHandler('useTeamEvents'));
+          break;
+      }
+    },
+    [eventTypes, addEvent, updateTaskStatus, updateLoopState, loadTeams]
+  );
+ 
+  useEffect(() => {
+    // Only subscribe when connected
+    if (connectionState !== 'connected') {
+      return;
+    }
+ 
+    // Get WebSocket from gateway client
+    const client = getGatewayClientSafe();
+    if (!client || !client.ws) {
+      return;
+    }
+ 
+    const ws = client.ws;
+ 
+    // Subscribe to team events
+    const handleMessage = (event: MessageEvent) => {
+      try {
+        const data = JSON.parse(event.data);
+        if (data.type === 'team_event') {
+          handleTeamEvent(data as TeamEventMessage);
+        }
+      } catch {
+        // Ignore non-JSON messages
+      }
+    };
+ 
+    ws.addEventListener('message', handleMessage);
+ 
+    // Send subscription message
+    if (ws.readyState === WebSocket.OPEN) {
+      ws.send(
+        JSON.stringify({
+          type: 'subscribe',
+          topic: teamId ? `team:${teamId}` : 'teams',
+        })
+      );
+    }
+ 
+    unsubscribeRef.current = () => {
+      ws.removeEventListener('message', handleMessage);
+      if (ws.readyState === WebSocket.OPEN) {
+        ws.send(
+          JSON.stringify({
+            type: 'unsubscribe',
+            topic: teamId ? `team:${teamId}` : 'teams',
+          })
+        );
+      }
+    };
+ 
+    return () => {
+      if (unsubscribeRef.current) {
+        unsubscribeRef.current();
+        unsubscribeRef.current = null;
+      }
+    };
+  }, [connectionState, teamId, handleTeamEvent]);
+ 
+  return {
+    isConnected: connectionState === 'connected',
+  };
+}
+ 
+/**
+ * Hook for subscribing to a specific team's events
+ */
+export function useTeamEventStream(teamId: string) {
+  return useTeamEvents({ teamId });
+}
+ 
+/**
+ * Hook for subscribing to all team events
+ */
+export function useAllTeamEvents(options: Omit<UseTeamEventsOptions, 'teamId'> = {}) {
+  return useTeamEvents({ ...options, teamId: null });
+}
+ 
+// === Helper Functions ===
+ 
+function mapEventType(eventType: TeamEventType): CollaborationEvent['type'] {
+  const mapping: Record<TeamEventType, CollaborationEvent['type']> = {
+    'team.created': 'member_status_change',
+    'team.updated': 'member_status_change',
+    'team.deleted': 'member_status_change',
+    'member.added': 'member_status_change',
+    'member.removed': 'member_status_change',
+    'member.status_changed': 'member_status_change',
+    'task.created': 'task_assigned',
+    'task.assigned': 'task_assigned',
+    'task.status_changed': 'task_started',
+    'task.completed': 'task_completed',
+    'loop.started': 'loop_state_change',
+    'loop.state_changed': 'loop_state_change',
+    'loop.completed': 'loop_state_change',
+    'review.submitted': 'review_submitted',
+  };
+  return mapping[eventType] || 'task_started';
+}
+ 
+function getGatewayClientSafe() {
+  try {
+    // Dynamic import to avoid circular dependency
+    const { getClient } = require('../store/connectionStore');
+    return getClient();
+  } catch {
+    return null;
+  }
+}
+ 
+export default useTeamEvents;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/utils.ts.html b/desktop/coverage/src/lib/utils.ts.html new file mode 100644 index 0000000..a6df104 --- /dev/null +++ b/desktop/coverage/src/lib/utils.ts.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for src/lib/utils.ts + + + + + + + + + +
+
+

All files / src/lib utils.ts

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
import { clsx, type ClassValue } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+ 
+export function cn(...inputs: ClassValue[]) {
+  return twMerge(clsx(inputs));
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/viking-client.ts.html b/desktop/coverage/src/lib/viking-client.ts.html new file mode 100644 index 0000000..55abe24 --- /dev/null +++ b/desktop/coverage/src/lib/viking-client.ts.html @@ -0,0 +1,607 @@ + + + + + + Code coverage report for src/lib/viking-client.ts + + + + + + + + + +
+
+

All files / src/lib viking-client.ts

+
+ +
+ 0% + Statements + 0/66 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * OpenViking Client - Semantic Memory Operations
+ *
+ * Client for interacting with OpenViking CLI sidecar.
+ * Provides semantic search, resource management, and knowledge base operations.
+ */
+ 
+import { invoke } from '@tauri-apps/api/core';
+ 
+// === Types ===
+ 
+export interface VikingStatus {
+  available: boolean;
+  version?: string;
+  dataDir?: string;
+  error?: string;
+}
+ 
+export interface VikingResource {
+  uri: string;
+  name: string;
+  resourceType: string;
+  size?: number;
+  modifiedAt?: string;
+}
+ 
+export interface VikingFindResult {
+  uri: string;
+  score: number;
+  content: string;
+  level: string;
+  overview?: string;
+}
+ 
+export interface VikingGrepResult {
+  uri: string;
+  line: number;
+  content: string;
+  matchStart: number;
+  matchEnd: number;
+}
+ 
+export interface VikingAddResult {
+  uri: string;
+  status: string;
+}
+ 
+// === Client Functions ===
+ 
+/**
+ * Check if OpenViking CLI is available
+ */
+export async function getVikingStatus(): Promise<VikingStatus> {
+  return invoke<VikingStatus>('viking_status');
+}
+ 
+/**
+ * Add a resource to OpenViking from file
+ */
+export async function addVikingResource(
+  uri: string,
+  content: string
+): Promise<VikingAddResult> {
+  return invoke<VikingAddResult>('viking_add', { uri, content });
+}
+ 
+/**
+ * Add a resource with inline content
+ */
+export async function addVikingResourceInline(
+  uri: string,
+  content: string
+): Promise<VikingAddResult> {
+  return invoke<VikingAddResult>('viking_add_inline', { uri, content });
+}
+ 
+/**
+ * Find resources by semantic search
+ */
+export async function findVikingResources(
+  query: string,
+  scope?: string,
+  limit?: number
+): Promise<VikingFindResult[]> {
+  return invoke<VikingFindResult[]>('viking_find', { query, scope, limit });
+}
+ 
+/**
+ * Grep resources by pattern
+ */
+export async function grepVikingResources(
+  pattern: string,
+  uri?: string,
+  caseSensitive?: boolean,
+  limit?: number
+): Promise<VikingGrepResult[]> {
+  return invoke<VikingGrepResult[]>('viking_grep', {
+    pattern,
+    uri,
+    caseSensitive,
+    limit,
+  });
+}
+ 
+/**
+ * List resources at a path
+ */
+export async function listVikingResources(path: string): Promise<VikingResource[]> {
+  return invoke<VikingResource[]>('viking_ls', { path });
+}
+ 
+/**
+ * Read resource content
+ */
+export async function readVikingResource(
+  uri: string,
+  level?: string
+): Promise<string> {
+  return invoke<string>('viking_read', { uri, level });
+}
+ 
+/**
+ * Remove a resource
+ */
+export async function removeVikingResource(uri: string): Promise<void> {
+  return invoke<void>('viking_remove', { uri });
+}
+ 
+/**
+ * Get resource tree
+ */
+export async function getVikingTree(
+  path: string,
+  depth?: number
+): Promise<Record<string, unknown>> {
+  return invoke<Record<string, unknown>>('viking_tree', { path, depth });
+}
+ 
+// === Server Functions ===
+ 
+export interface VikingServerStatus {
+  running: boolean;
+  port?: number;
+  pid?: number;
+  error?: string;
+}
+ 
+/**
+ * Get Viking server status
+ */
+export async function getVikingServerStatus(): Promise<VikingServerStatus> {
+  return invoke<VikingServerStatus>('viking_server_status');
+}
+ 
+/**
+ * Start Viking server
+ */
+export async function startVikingServer(): Promise<void> {
+  return invoke<void>('viking_server_start');
+}
+ 
+/**
+ * Stop Viking server
+ */
+export async function stopVikingServer(): Promise<void> {
+  return invoke<void>('viking_server_stop');
+}
+ 
+/**
+ * Restart Viking server
+ */
+export async function restartVikingServer(): Promise<void> {
+  return invoke<void>('viking_server_restart');
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/workflow-builder/index.html b/desktop/coverage/src/lib/workflow-builder/index.html new file mode 100644 index 0000000..8c44a02 --- /dev/null +++ b/desktop/coverage/src/lib/workflow-builder/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/lib/workflow-builder + + + + + + + + + +
+
+

All files src/lib/workflow-builder

+
+ +
+ 0% + Statements + 0/620 +
+ + +
+ 33.33% + Branches + 1/3 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 0% + Lines + 0/620 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.ts +
+
0%0/30%0/10%0/10%0/3
types.ts +
+
0%0/00%1/10%1/10%0/0
yaml-converter.ts +
+
0%0/6170%0/10%0/10%0/617
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/workflow-builder/index.ts.html b/desktop/coverage/src/lib/workflow-builder/index.ts.html new file mode 100644 index 0000000..4205c38 --- /dev/null +++ b/desktop/coverage/src/lib/workflow-builder/index.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/lib/workflow-builder/index.ts + + + + + + + + + +
+
+

All files / src/lib/workflow-builder index.ts

+
+ +
+ 0% + Statements + 0/3 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Builder Library
+ *
+ * Provides types, converters, and utilities for building visual workflow editors.
+ */
+ 
+export * from './types';
+export * from './yaml-converter';
+ 
+// Re-export commonly used types from @xyflow/react
+export type { Node, Edge, Connection } from '@xyflow/react';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/workflow-builder/types.ts.html b/desktop/coverage/src/lib/workflow-builder/types.ts.html new file mode 100644 index 0000000..a3baddd --- /dev/null +++ b/desktop/coverage/src/lib/workflow-builder/types.ts.html @@ -0,0 +1,1072 @@ + + + + + + Code coverage report for src/lib/workflow-builder/types.ts + + + + + + + + + +
+
+

All files / src/lib/workflow-builder types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Builder Types
+ *
+ * Core types for the visual workflow builder that creates Pipeline DSL
+ * configurations through drag-and-drop node composition.
+ */
+ 
+import type { Node, Edge } from '@xyflow/react';
+ 
+// =============================================================================
+// Node Types
+// =============================================================================
+ 
+export type WorkflowNodeType =
+  | 'input'
+  | 'llm'
+  | 'skill'
+  | 'hand'
+  | 'orchestration'
+  | 'condition'
+  | 'parallel'
+  | 'loop'
+  | 'export'
+  | 'http'
+  | 'setVar'
+  | 'delay';
+ 
+// =============================================================================
+// Node Data Types
+// =============================================================================
+ 
+// Base node data that satisfies Record<string, unknown>
+export interface BaseNodeData extends Record<string, unknown> {
+  label: string;
+  description?: string;
+}
+ 
+export interface InputNodeData extends BaseNodeData {
+  type: 'input';
+  /** Input variable name */
+  variableName: string;
+  /** Default value for testing */
+  defaultValue?: unknown;
+  /** JSON schema for validation */
+  schema?: Record<string, unknown>;
+}
+ 
+export interface LlmNodeData extends BaseNodeData {
+  type: 'llm';
+  /** Template path or inline prompt */
+  template: string;
+  /** Whether template is a file path */
+  isTemplateFile: boolean;
+  /** Model override */
+  model?: string;
+  /** Temperature override */
+  temperature?: number;
+  /** Max tokens override */
+  maxTokens?: number;
+  /** JSON mode for structured output */
+  jsonMode: boolean;
+}
+ 
+export interface SkillNodeData extends BaseNodeData {
+  type: 'skill';
+  /** Skill ID to execute */
+  skillId: string;
+  /** Skill name for display */
+  skillName?: string;
+  /** Input variable mappings */
+  inputMappings: Record<string, string>;
+}
+ 
+export interface HandNodeData extends BaseNodeData {
+  type: 'hand';
+  /** Hand ID */
+  handId: string;
+  /** Hand name for display */
+  handName?: string;
+  /** Action to perform */
+  action: string;
+  /** Action parameters */
+  params: Record<string, string>;
+}
+ 
+export interface OrchestrationNodeData extends BaseNodeData {
+  type: 'orchestration';
+  /** Graph ID reference */
+  graphId?: string;
+  /** Inline graph definition */
+  graph?: Record<string, unknown>;
+  /** Input mappings */
+  inputMappings: Record<string, string>;
+}
+ 
+export interface ConditionNodeData extends BaseNodeData {
+  type: 'condition';
+  /** Condition expression */
+  condition: string;
+  /** Branch definitions */
+  branches: ConditionBranch[];
+  /** Has default branch */
+  hasDefault: boolean;
+}
+ 
+export interface ConditionBranch {
+  /** Condition expression for this branch */
+  when: string;
+  /** Label for display */
+  label: string;
+}
+ 
+export interface ParallelNodeData extends BaseNodeData {
+  type: 'parallel';
+  /** Expression to iterate over */
+  each: string;
+  /** Max concurrent workers */
+  maxWorkers: number;
+}
+ 
+export interface LoopNodeData extends BaseNodeData {
+  type: 'loop';
+  /** Expression to iterate over */
+  each: string;
+  /** Variable name for current item */
+  itemVar: string;
+  /** Variable name for index */
+  indexVar: string;
+}
+ 
+export interface ExportNodeData extends BaseNodeData {
+  type: 'export';
+  /** Export formats */
+  formats: ExportFormat[];
+  /** Output directory */
+  outputDir?: string;
+}
+ 
+export interface HttpNodeData extends BaseNodeData {
+  type: 'http';
+  /** URL */
+  url: string;
+  /** HTTP method */
+  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
+  /** Headers */
+  headers: Record<string, string>;
+  /** Request body expression */
+  body?: string;
+}
+ 
+export interface SetVarNodeData extends BaseNodeData {
+  type: 'setVar';
+  /** Variable name */
+  variableName: string;
+  /** Value expression */
+  value: string;
+}
+ 
+export interface DelayNodeData extends BaseNodeData {
+  type: 'delay';
+  /** Delay in milliseconds */
+  ms: number;
+}
+ 
+export type WorkflowNodeData =
+  | InputNodeData
+  | LlmNodeData
+  | SkillNodeData
+  | HandNodeData
+  | OrchestrationNodeData
+  | ConditionNodeData
+  | ParallelNodeData
+  | LoopNodeData
+  | ExportNodeData
+  | HttpNodeData
+  | SetVarNodeData
+  | DelayNodeData;
+ 
+// =============================================================================
+// Canvas Types
+// =============================================================================
+ 
+// Use Record<string, unknown> as base to satisfy React Flow constraints
+// The actual data will be one of the WorkflowNodeData union types
+export type WorkflowNode = Node<Record<string, unknown>, string>;
+export type WorkflowEdge = Edge;
+ 
+export interface WorkflowCanvas {
+  /** Unique canvas ID */
+  id: string;
+  /** Canvas name */
+  name: string;
+  /** Canvas description */
+  description?: string;
+  /** Category for organization */
+  category?: string;
+  /** Nodes in the canvas */
+  nodes: WorkflowNode[];
+  /** Edges connecting nodes */
+  edges: WorkflowEdge[];
+  /** Viewport state */
+  viewport: {
+    x: number;
+    y: number;
+    zoom: number;
+  };
+  /** Canvas metadata */
+  metadata: WorkflowMetadata;
+}
+ 
+export interface WorkflowMetadata {
+  /** Created timestamp */
+  createdAt: string;
+  /** Updated timestamp */
+  updatedAt: string;
+  /** Author */
+  author?: string;
+  /** Tags for search */
+  tags: string[];
+  /** Version */
+  version: string;
+}
+ 
+// =============================================================================
+// Export Types
+// =============================================================================
+ 
+export type ExportFormat = 'pptx' | 'html' | 'pdf' | 'markdown' | 'json';
+ 
+// =============================================================================
+// Palette Types
+// =============================================================================
+ 
+export interface NodePaletteItem {
+  type: WorkflowNodeType;
+  label: string;
+  description: string;
+  icon: string;
+  category: NodeCategory;
+  defaultData: Partial<WorkflowNodeData>;
+}
+ 
+export type NodeCategory =
+  | 'input'
+  | 'ai'
+  | 'action'
+  | 'control'
+  | 'output';
+ 
+// =============================================================================
+// Conversion Types
+// =============================================================================
+ 
+export interface PipelineYaml {
+  apiVersion: 'zclaw/v1';
+  kind: 'Pipeline';
+  metadata: {
+    name: string;
+    description?: string;
+    tags?: string[];
+  };
+  spec: {
+    input?: Record<string, unknown>;
+    steps: PipelineStepYaml[];
+    output?: Record<string, string>;
+  };
+}
+ 
+export interface PipelineStepYaml {
+  id: string;
+  name?: string;
+  action: Record<string, unknown>;
+  when?: string;
+}
+ 
+// =============================================================================
+// Validation Types
+// =============================================================================
+ 
+export interface ValidationError {
+  nodeId: string;
+  field?: string;
+  message: string;
+  severity: 'error' | 'warning';
+}
+ 
+export interface ValidationResult {
+  valid: boolean;
+  errors: ValidationError[];
+  warnings: ValidationError[];
+}
+ 
+// =============================================================================
+// Template Types
+// =============================================================================
+ 
+export interface WorkflowTemplate {
+  id: string;
+  name: string;
+  description: string;
+  category: string;
+  thumbnail?: string;
+  canvas: WorkflowCanvas;
+}
+ 
+// =============================================================================
+// Store Types
+// =============================================================================
+ 
+export interface WorkflowBuilderState {
+  /** Current canvas */
+  canvas: WorkflowCanvas | null;
+  /** All saved workflows */
+  workflows: WorkflowCanvas[];
+  /** Selected node ID */
+  selectedNodeId: string | null;
+  /** Is dragging from palette */
+  isDragging: boolean;
+  /** Is canvas dirty (unsaved changes) */
+  isDirty: boolean;
+  /** Validation result */
+  validation: ValidationResult | null;
+  /** Templates */
+  templates: WorkflowTemplate[];
+  /** Available skills for palette */
+  availableSkills: Array<{ id: string; name: string; description: string }>;
+  /** Available hands for palette */
+  availableHands: Array<{ id: string; name: string; actions: string[] }>;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/lib/workflow-builder/yaml-converter.ts.html b/desktop/coverage/src/lib/workflow-builder/yaml-converter.ts.html new file mode 100644 index 0000000..ade0fa6 --- /dev/null +++ b/desktop/coverage/src/lib/workflow-builder/yaml-converter.ts.html @@ -0,0 +1,2494 @@ + + + + + + Code coverage report for src/lib/workflow-builder/yaml-converter.ts + + + + + + + + + +
+
+

All files / src/lib/workflow-builder yaml-converter.ts

+
+ +
+ 0% + Statements + 0/617 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/617 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * YAML Converter for Workflow Builder
+ *
+ * Bidirectional conversion between WorkflowCanvas (visual representation)
+ * and Pipeline YAML (execution format).
+ */
+ 
+import * as yaml from 'js-yaml';
+import type { Edge } from '@xyflow/react';
+import dagre from '@dagrejs/dagre';
+import type {
+  WorkflowCanvas,
+  WorkflowNode,
+  WorkflowNodeData,
+  InputNodeData,
+  LlmNodeData,
+  SkillNodeData,
+  HandNodeData,
+  ConditionNodeData,
+  ParallelNodeData,
+  ExportNodeData,
+  PipelineYaml,
+  PipelineStepYaml,
+  ValidationError,
+  ValidationResult,
+} from './types';
+ 
+// =============================================================================
+// Canvas to YAML Conversion
+// =============================================================================
+ 
+/**
+ * Convert a WorkflowCanvas to Pipeline YAML string
+ */
+export function canvasToYaml(canvas: WorkflowCanvas): string {
+  const pipeline: PipelineYaml = {
+    apiVersion: 'zclaw/v1',
+    kind: 'Pipeline',
+    metadata: {
+      name: canvas.name,
+      description: canvas.description,
+      tags: canvas.metadata.tags,
+    },
+    spec: {
+      input: extractInputs(canvas.nodes),
+      steps: nodesToSteps(canvas.nodes, canvas.edges),
+      output: extractOutputs(canvas.nodes),
+    },
+  };
+ 
+  return yaml.dump(pipeline, {
+    indent: 2,
+    lineWidth: -1,
+    noRefs: true,
+    sortKeys: false,
+  });
+}
+ 
+/**
+ * Extract input definitions from input nodes
+ */
+function extractInputs(nodes: WorkflowNode[]): Record<string, unknown> | undefined {
+  const inputs: Record<string, unknown> = {};
+ 
+  for (const node of nodes) {
+    if (node.data.type === 'input') {
+      const data = node.data as InputNodeData;
+      inputs[data.variableName] = data.defaultValue ?? null;
+    }
+  }
+ 
+  return Object.keys(inputs).length > 0 ? inputs : undefined;
+}
+ 
+/**
+ * Extract output mappings from the last nodes or explicit output nodes
+ */
+function extractOutputs(nodes: WorkflowNode[]): Record<string, string> | undefined {
+  const outputs: Record<string, string> = {};
+ 
+  for (const node of nodes) {
+    if (node.data.type === 'export') {
+      // Export nodes define outputs
+      outputs[`${node.id}_export`] = `\${steps.${node.id}.output}`;
+    }
+  }
+ 
+  return Object.keys(outputs).length > 0 ? outputs : undefined;
+}
+ 
+/**
+ * Convert nodes and edges to pipeline steps
+ */
+function nodesToSteps(nodes: WorkflowNode[], edges: Edge[]): PipelineStepYaml[] {
+  // Topological sort to get execution order
+  const sortedNodes = topologicalSort(nodes, edges);
+ 
+  return sortedNodes
+    .filter(node => node.data.type !== 'input') // Skip input nodes
+    .map(node => nodeToStep(node))
+    .filter((step): step is PipelineStepYaml => step !== null);
+}
+ 
+/**
+ * Convert a single node to a pipeline step
+ */
+function nodeToStep(node: WorkflowNode): PipelineStepYaml | null {
+  const data = node.data;
+  const label = data.label as string | undefined;
+  const base: PipelineStepYaml = {
+    id: node.id,
+    name: label,
+    action: {},
+  };
+ 
+  const nodeType = data.type as string;
+ 
+  switch (nodeType) {
+    case 'llm': {
+      const llmData = data as LlmNodeData;
+      base.action = {
+        llm_generate: {
+          template: llmData.template,
+          input: mapExpressionsToObject(llmData.template),
+          model: llmData.model,
+          temperature: llmData.temperature,
+          max_tokens: llmData.maxTokens,
+          json_mode: llmData.jsonMode,
+        },
+      };
+      break;
+    }
+ 
+    case 'skill': {
+      const skillData = data as SkillNodeData;
+      base.action = {
+        skill: {
+          skill_id: skillData.skillId,
+          input: skillData.inputMappings,
+        },
+      };
+      break;
+    }
+ 
+    case 'hand': {
+      const handData = data as HandNodeData;
+      base.action = {
+        hand: {
+          hand_id: handData.handId,
+          hand_action: handData.action,
+          params: handData.params,
+        },
+      };
+      break;
+    }
+ 
+    case 'orchestration': {
+      const orchData = data as { graphId?: string; graph?: Record<string, unknown>; inputMappings?: Record<string, string> };
+      base.action = {
+        skill_orchestration: {
+          graph_id: orchData.graphId,
+          graph: orchData.graph,
+          input: orchData.inputMappings,
+        },
+      };
+      break;
+    }
+ 
+    case 'condition': {
+      const condData = data as ConditionNodeData;
+      base.action = {
+        condition: {
+          condition: condData.condition,
+          branches: condData.branches.map((b: { when: string }) => ({
+            when: b.when,
+            then: { /* Will be filled by connected nodes */ },
+          })),
+        },
+      };
+      break;
+    }
+ 
+    case 'parallel': {
+      const parData = data as ParallelNodeData;
+      base.action = {
+        parallel: {
+          each: parData.each,
+          step: { /* Will be filled by child nodes */ },
+          max_workers: parData.maxWorkers,
+        },
+      };
+      break;
+    }
+ 
+    case 'loop': {
+      const loopData = data as { each: string; itemVar: string; indexVar: string };
+      base.action = {
+        loop: {
+          each: loopData.each,
+          item_var: loopData.itemVar,
+          index_var: loopData.indexVar,
+          step: { /* Will be filled by child nodes */ },
+        },
+      };
+      break;
+    }
+ 
+    case 'export': {
+      const exportData = data as ExportNodeData;
+      base.action = {
+        file_export: {
+          formats: exportData.formats,
+          input: `\${steps.${node.id}.input}`,
+          output_dir: exportData.outputDir,
+        },
+      };
+      break;
+    }
+ 
+    case 'http': {
+      const httpData = data as { url: string; method: string; headers: Record<string, string>; body?: string };
+      base.action = {
+        http_request: {
+          url: httpData.url,
+          method: httpData.method,
+          headers: httpData.headers,
+          body: httpData.body,
+        },
+      };
+      break;
+    }
+ 
+    case 'setVar': {
+      const varData = data as { variableName: string; value: string };
+      base.action = {
+        set_var: {
+          name: varData.variableName,
+          value: varData.value,
+        },
+      };
+      break;
+    }
+ 
+    case 'delay': {
+      const delayData = data as { ms: number };
+      base.action = {
+        delay: {
+          ms: delayData.ms,
+        },
+      };
+      break;
+    }
+ 
+    case 'input':
+      // Input nodes don't become steps
+      return null;
+ 
+    default:
+      console.warn(`Unknown node type: ${nodeType}`);
+      return null;
+  }
+ 
+  return base;
+}
+ 
+/**
+ * Topological sort of nodes based on edges
+ */
+function topologicalSort(nodes: WorkflowNode[], edges: Edge[]): WorkflowNode[] {
+  const nodeMap = new Map(nodes.map(n => [n.id, n]));
+  const inDegree = new Map<string, number>();
+  const adjacency = new Map<string, string[]>();
+ 
+  // Initialize
+  for (const node of nodes) {
+    inDegree.set(node.id, 0);
+    adjacency.set(node.id, []);
+  }
+ 
+  // Build graph
+  for (const edge of edges) {
+    const current = adjacency.get(edge.source) || [];
+    current.push(edge.target);
+    adjacency.set(edge.source, current);
+ 
+    inDegree.set(edge.target, (inDegree.get(edge.target) || 0) + 1);
+  }
+ 
+  // Kahn's algorithm
+  const queue: string[] = [];
+  const result: WorkflowNode[] = [];
+ 
+  for (const [nodeId, degree] of inDegree) {
+    if (degree === 0) {
+      queue.push(nodeId);
+    }
+  }
+ 
+  while (queue.length > 0) {
+    const nodeId = queue.shift()!;
+    const node = nodeMap.get(nodeId);
+    if (node) {
+      result.push(node);
+    }
+ 
+    const neighbors = adjacency.get(nodeId) || [];
+    for (const neighbor of neighbors) {
+      const newDegree = (inDegree.get(neighbor) || 0) - 1;
+      inDegree.set(neighbor, newDegree);
+      if (newDegree === 0) {
+        queue.push(neighbor);
+      }
+    }
+  }
+ 
+  return result;
+}
+ 
+/**
+ * Extract variable references from a template string
+ */
+function mapExpressionsToObject(template: string): Record<string, string> {
+  const regex = /\$\{([^}]+)\}/g;
+  const matches = template.match(regex) || [];
+  const result: Record<string, string> = {};
+ 
+  for (const match of matches) {
+    const expr = match.slice(2, -1); // Remove ${ and }
+    const parts = expr.split('.');
+    if (parts.length >= 2) {
+      result[parts[parts.length - 1]] = match;
+    }
+  }
+ 
+  return result;
+}
+ 
+// =============================================================================
+// YAML to Canvas Conversion
+// =============================================================================
+ 
+/**
+ * Parse Pipeline YAML string to WorkflowCanvas
+ */
+export function yamlToCanvas(yamlString: string): WorkflowCanvas {
+  const pipeline = yaml.load(yamlString) as PipelineYaml;
+ 
+  const nodes: WorkflowNode[] = [];
+  const edges: Edge[] = [];
+ 
+  // Create input nodes from spec.input
+  if (pipeline.spec.input) {
+    let y = 50;
+    for (const [varName, defaultValue] of Object.entries(pipeline.spec.input)) {
+      nodes.push({
+        id: `input_${varName}`,
+        type: 'input',
+        position: { x: 50, y },
+        data: {
+          type: 'input',
+          label: varName,
+          variableName: varName,
+          defaultValue,
+        },
+      });
+      y += 100;
+    }
+  }
+ 
+  // Convert steps to nodes
+  if (pipeline.spec.steps) {
+    let x = 300;
+    let y = 50;
+ 
+    for (const step of pipeline.spec.steps) {
+      const node = stepToNode(step, x, y);
+      if (node) {
+        nodes.push(node);
+        y += 150;
+      }
+    }
+  }
+ 
+  // Auto-layout with dagre
+  const layoutedNodes = applyDagreLayout(nodes, edges);
+ 
+  return {
+    id: `workflow_${Date.now()}`,
+    name: pipeline.metadata?.name || 'Imported Workflow',
+    description: pipeline.metadata?.description,
+    category: 'imported',
+    nodes: layoutedNodes,
+    edges,
+    viewport: { x: 0, y: 0, zoom: 1 },
+    metadata: {
+      createdAt: new Date().toISOString(),
+      updatedAt: new Date().toISOString(),
+      tags: pipeline.metadata?.tags || [],
+      version: '1.0.0',
+    },
+  };
+}
+ 
+/**
+ * Convert a pipeline step to a workflow node
+ */
+function stepToNode(step: PipelineStepYaml, x: number, y: number): WorkflowNode | null {
+  const action = step.action;
+  const actionType = Object.keys(action)[0];
+  const actionData = action[actionType];
+ 
+  const baseData = {
+    label: step.name || step.id,
+  };
+ 
+  switch (actionType) {
+    case 'llm_generate':
+      return {
+        id: step.id,
+        type: 'llm',
+        position: { x, y },
+        data: {
+          type: 'llm',
+          ...baseData,
+          template: (actionData as { template?: string }).template || '',
+          isTemplateFile: false,
+          model: (actionData as { model?: string }).model,
+          temperature: (actionData as { temperature?: number }).temperature,
+          maxTokens: (actionData as { max_tokens?: number }).max_tokens,
+          jsonMode: (actionData as { json_mode?: boolean }).json_mode || false,
+        } as WorkflowNodeData,
+      };
+ 
+    case 'skill':
+      return {
+        id: step.id,
+        type: 'skill',
+        position: { x, y },
+        data: {
+          type: 'skill',
+          ...baseData,
+          skillId: (actionData as { skill_id?: string }).skill_id || '',
+          inputMappings: (actionData as { input?: Record<string, string> }).input || {},
+        } as WorkflowNodeData,
+      };
+ 
+    case 'hand':
+      return {
+        id: step.id,
+        type: 'hand',
+        position: { x, y },
+        data: {
+          type: 'hand',
+          ...baseData,
+          handId: (actionData as { hand_id?: string }).hand_id || '',
+          action: (actionData as { hand_action?: string }).hand_action || '',
+          params: (actionData as { params?: Record<string, string> }).params || {},
+        } as WorkflowNodeData,
+      };
+ 
+    case 'skill_orchestration':
+      return {
+        id: step.id,
+        type: 'orchestration',
+        position: { x, y },
+        data: {
+          type: 'orchestration',
+          ...baseData,
+          graphId: (actionData as { graph_id?: string }).graph_id,
+          graph: (actionData as { graph?: Record<string, unknown> }).graph,
+          inputMappings: (actionData as { input?: Record<string, string> }).input || {},
+        } as WorkflowNodeData,
+      };
+ 
+    case 'condition':
+      return {
+        id: step.id,
+        type: 'condition',
+        position: { x, y },
+        data: {
+          type: 'condition',
+          ...baseData,
+          condition: (actionData as { condition?: string }).condition || '',
+          branches: ((actionData as { branches?: Array<{ when: string }> }).branches || []).map(b => ({
+            when: b.when,
+            label: b.when.slice(0, 20),
+          })),
+          hasDefault: true,
+        } as WorkflowNodeData,
+      };
+ 
+    case 'parallel':
+      return {
+        id: step.id,
+        type: 'parallel',
+        position: { x, y },
+        data: {
+          type: 'parallel',
+          ...baseData,
+          each: (actionData as { each?: string }).each || '',
+          maxWorkers: (actionData as { max_workers?: number }).max_workers || 4,
+        } as WorkflowNodeData,
+      };
+ 
+    case 'file_export':
+      return {
+        id: step.id,
+        type: 'export',
+        position: { x, y },
+        data: {
+          type: 'export',
+          ...baseData,
+          formats: (actionData as { formats?: string[] }).formats || [],
+          outputDir: (actionData as { output_dir?: string }).output_dir,
+        } as WorkflowNodeData,
+      };
+ 
+    case 'http_request':
+      return {
+        id: step.id,
+        type: 'http',
+        position: { x, y },
+        data: {
+          type: 'http',
+          ...baseData,
+          url: (actionData as { url?: string }).url || '',
+          method: ((actionData as { method?: string }).method || 'GET') as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',
+          headers: (actionData as { headers?: Record<string, string> }).headers || {},
+          body: (actionData as { body?: string }).body,
+        } as WorkflowNodeData,
+      };
+ 
+    case 'set_var':
+      return {
+        id: step.id,
+        type: 'setVar',
+        position: { x, y },
+        data: {
+          type: 'setVar',
+          ...baseData,
+          variableName: (actionData as { name?: string }).name || '',
+          value: (actionData as { value?: string }).value || '',
+        } as WorkflowNodeData,
+      };
+ 
+    case 'delay':
+      return {
+        id: step.id,
+        type: 'delay',
+        position: { x, y },
+        data: {
+          type: 'delay',
+          ...baseData,
+          ms: (actionData as { ms?: number }).ms || 0,
+        } as WorkflowNodeData,
+      };
+ 
+    default:
+      console.warn(`Unknown action type: ${actionType}`);
+      return null;
+  }
+}
+ 
+// =============================================================================
+// Layout Utilities
+// =============================================================================
+ 
+/**
+ * Apply dagre layout to nodes
+ */
+export function applyDagreLayout(nodes: WorkflowNode[], edges: Edge[]): WorkflowNode[] {
+  const dagreGraph = new dagre.graphlib.Graph();
+  dagreGraph.setDefaultEdgeLabel(() => ({}));
+ 
+  dagreGraph.setGraph({
+    rankdir: 'LR',
+    nodesep: 100,
+    ranksep: 150,
+    marginx: 50,
+    marginy: 50,
+  });
+ 
+  // Add nodes to dagre
+  for (const node of nodes) {
+    dagreGraph.setNode(node.id, {
+      width: 250,
+      height: 100,
+    });
+  }
+ 
+  // Add edges to dagre
+  for (const edge of edges) {
+    dagreGraph.setEdge(edge.source, edge.target);
+  }
+ 
+  // Apply layout
+  dagre.layout(dagreGraph);
+ 
+  // Update node positions
+  return nodes.map(node => {
+    const dagreNode = dagreGraph.node(node.id);
+    if (dagreNode) {
+      return {
+        ...node,
+        position: {
+          x: dagreNode.x - dagreNode.width / 2,
+          y: dagreNode.y - dagreNode.height / 2,
+        },
+      };
+    }
+    return node;
+  });
+}
+ 
+// =============================================================================
+// Validation
+// =============================================================================
+ 
+/**
+ * Validate a workflow canvas
+ */
+export function validateCanvas(canvas: WorkflowCanvas): ValidationResult {
+  const errors: ValidationError[] = [];
+  const warnings: ValidationError[] = [];
+ 
+  // Check for empty canvas
+  if (canvas.nodes.length === 0) {
+    errors.push({
+      nodeId: 'canvas',
+      message: 'Workflow is empty',
+      severity: 'error',
+    });
+    return { valid: false, errors, warnings };
+  }
+ 
+  // Check for input nodes
+  const hasInput = canvas.nodes.some(n => n.data.type === 'input');
+  if (!hasInput) {
+    warnings.push({
+      nodeId: 'canvas',
+      message: 'No input nodes defined',
+      severity: 'warning',
+    });
+  }
+ 
+  // Check for disconnected nodes
+  const connectedNodeIds = new Set<string>();
+  for (const edge of canvas.edges) {
+    connectedNodeIds.add(edge.source);
+    connectedNodeIds.add(edge.target);
+  }
+ 
+  for (const node of canvas.nodes) {
+    if (canvas.nodes.length > 1 && !connectedNodeIds.has(node.id) && node.data.type !== 'input') {
+      warnings.push({
+        nodeId: node.id,
+        message: `Node "${node.data.label}" is not connected`,
+        severity: 'warning',
+      });
+    }
+  }
+ 
+  // Validate individual nodes
+  for (const node of canvas.nodes) {
+    const nodeErrors = validateNode(node);
+    errors.push(...nodeErrors);
+  }
+ 
+  // Check for cycles (basic check)
+  if (hasCycle(canvas.nodes, canvas.edges)) {
+    errors.push({
+      nodeId: 'canvas',
+      message: 'Workflow contains a cycle',
+      severity: 'error',
+    });
+  }
+ 
+  return {
+    valid: errors.length === 0,
+    errors,
+    warnings,
+  };
+}
+ 
+/**
+ * Validate a single node
+ */
+function validateNode(node: WorkflowNode): ValidationError[] {
+  const errors: ValidationError[] = [];
+  const data = node.data;
+ 
+  switch (data.type) {
+    case 'llm':
+      if (!data.template) {
+        errors.push({
+          nodeId: node.id,
+          field: 'template',
+          message: 'Template is required',
+          severity: 'error',
+        });
+      }
+      break;
+ 
+    case 'skill':
+      if (!data.skillId) {
+        errors.push({
+          nodeId: node.id,
+          field: 'skillId',
+          message: 'Skill ID is required',
+          severity: 'error',
+        });
+      }
+      break;
+ 
+    case 'hand':
+      if (!data.handId) {
+        errors.push({
+          nodeId: node.id,
+          field: 'handId',
+          message: 'Hand ID is required',
+          severity: 'error',
+        });
+      }
+      if (!data.action) {
+        errors.push({
+          nodeId: node.id,
+          field: 'action',
+          message: 'Action is required',
+          severity: 'error',
+        });
+      }
+      break;
+ 
+    case 'http':
+      if (!data.url) {
+        errors.push({
+          nodeId: node.id,
+          field: 'url',
+          message: 'URL is required',
+          severity: 'error',
+        });
+      }
+      break;
+ 
+    case 'input':
+      if (!data.variableName) {
+        errors.push({
+          nodeId: node.id,
+          field: 'variableName',
+          message: 'Variable name is required',
+          severity: 'error',
+        });
+      }
+      break;
+  }
+ 
+  return errors;
+}
+ 
+/**
+ * Check if the graph has a cycle
+ */
+function hasCycle(nodes: WorkflowNode[], edges: Edge[]): boolean {
+  const adjacency = new Map<string, string[]>();
+  const visited = new Set<string>();
+  const recStack = new Set<string>();
+ 
+  // Build adjacency list
+  for (const node of nodes) {
+    adjacency.set(node.id, []);
+  }
+  for (const edge of edges) {
+    const neighbors = adjacency.get(edge.source) || [];
+    neighbors.push(edge.target);
+    adjacency.set(edge.source, neighbors);
+  }
+ 
+  // DFS cycle detection
+  function dfs(nodeId: string): boolean {
+    visited.add(nodeId);
+    recStack.add(nodeId);
+ 
+    const neighbors = adjacency.get(nodeId) || [];
+    for (const neighbor of neighbors) {
+      if (!visited.has(neighbor)) {
+        if (dfs(neighbor)) return true;
+      } else if (recStack.has(neighbor)) {
+        return true;
+      }
+    }
+ 
+    recStack.delete(nodeId);
+    return false;
+  }
+ 
+  for (const node of nodes) {
+    if (!visited.has(node.id)) {
+      if (dfs(node.id)) return true;
+    }
+  }
+ 
+  return false;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/shared/error-handling.ts.html b/desktop/coverage/src/shared/error-handling.ts.html new file mode 100644 index 0000000..17e0bda --- /dev/null +++ b/desktop/coverage/src/shared/error-handling.ts.html @@ -0,0 +1,400 @@ + + + + + + Code coverage report for src/shared/error-handling.ts + + + + + + + + + +
+
+

All files / src/shared error-handling.ts

+
+ +
+ 0% + Statements + 0/61 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Shared Error Handling
+ *
+ * Unified error handling utilities.
+ */
+ 
+/**
+ * Application error class with error code.
+ */
+export class AppError extends Error {
+  constructor(
+    message: string,
+    public readonly code: string,
+    public readonly cause?: Error
+  ) {
+    super(message);
+    this.name = 'AppError';
+  }
+ 
+  /**
+   * Create a AppError from an unknown error.
+   */
+  static fromUnknown(error: unknown, code: string): AppError {
+    if (error instanceof AppError) {
+      return error;
+    }
+    return new AppError(getErrorMessage(error), code, isError(error) ? error : undefined);
+  }
+}
+ 
+/**
+ * Network error class.
+ */
+export class NetworkError extends AppError {
+  constructor(message: string, public readonly statusCode?: number, cause?: Error) {
+    super(message, 'NETWORK_ERROR', cause);
+    this.name = 'NetworkError';
+  }
+}
+ 
+/**
+ * Validation error class.
+ */
+export class ValidationError extends AppError {
+  constructor(message: string, public readonly field?: string, cause?: Error) {
+    super(message, 'VALIDATION_ERROR', cause);
+    this.name = 'ValidationError';
+  }
+}
+ 
+/**
+ * Authentication error class.
+ */
+export class AuthError extends AppError {
+  constructor(message: string = 'Authentication required', cause?: Error) {
+    super(message, 'AUTH_ERROR', cause);
+    this.name = 'AuthError';
+  }
+}
+ 
+/**
+ * Type guard for Error.
+ */
+export function isError(error: unknown): error is Error {
+  return error instanceof Error;
+}
+ 
+/**
+ * Get error message from unknown error.
+ */
+export function getErrorMessage(error: unknown): string {
+  if (isError(error)) {
+    return error.message;
+  }
+  if (typeof error === 'string') {
+    return error;
+  }
+  return String(error);
+}
+ 
+/**
+ * Wrap error with code.
+ */
+export function wrapError(error: unknown, code: string): AppError {
+  return AppError.fromUnknown(error, code);
+}
+ 
+/**
+ * Check if error is a specific error class.
+ */
+export function isAppError(error: unknown): error is AppError {
+  return error instanceof AppError;
+}
+ 
+export function isNetworkError(error: unknown): error is NetworkError {
+  return error instanceof NetworkError;
+}
+ 
+export function isValidationError(error: unknown): error is ValidationError {
+  return error instanceof ValidationError;
+}
+ 
+export function isAuthError(error: unknown): error is AuthError {
+  return error instanceof AuthError;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/shared/index.html b/desktop/coverage/src/shared/index.html new file mode 100644 index 0000000..18cd7a7 --- /dev/null +++ b/desktop/coverage/src/shared/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/shared + + + + + + + + + +
+
+

All files src/shared

+
+ +
+ 0% + Statements + 0/62 +
+ + +
+ 66.66% + Branches + 2/3 +
+ + +
+ 66.66% + Functions + 2/3 +
+ + +
+ 0% + Lines + 0/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
error-handling.ts +
+
0%0/61100%1/1100%1/10%0/61
index.ts +
+
0%0/10%0/10%0/10%0/1
types.ts +
+
0%0/00%1/10%1/10%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/shared/index.ts.html b/desktop/coverage/src/shared/index.ts.html new file mode 100644 index 0000000..e6f25ae --- /dev/null +++ b/desktop/coverage/src/shared/index.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/shared/index.ts + + + + + + + + + +
+
+

All files / src/shared index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Shared Module
+ *
+ * Common utilities, types, and error handling.
+ */
+ 
+// Types
+export type {
+  Result,
+  AsyncResult,
+  PaginatedResponse,
+  AsyncStatus,
+  AsyncState,
+  Entity,
+  NamedEntity,
+} from './types';
+ 
+// Errors
+export {
+  AppError,
+  NetworkError,
+  ValidationError,
+  AuthError,
+  isError,
+  getErrorMessage,
+  wrapError,
+  isAppError,
+  isNetworkError,
+  isValidationError,
+  isAuthError,
+} from './error-handling';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/shared/types.ts.html b/desktop/coverage/src/shared/types.ts.html new file mode 100644 index 0000000..00f9caa --- /dev/null +++ b/desktop/coverage/src/shared/types.ts.html @@ -0,0 +1,259 @@ + + + + + + Code coverage report for src/shared/types.ts + + + + + + + + + +
+
+

All files / src/shared types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Shared Types
+ *
+ * Common types used across domains.
+ */
+ 
+/**
+ * Result type for functional error handling.
+ */
+export type Result<T, E = Error> =
+  | { ok: true; value: T }
+  | { ok: false; error: E };
+ 
+/**
+ * Async result for promises.
+ */
+export type AsyncResult<T, E = Error> = Promise<Result<T, E>>;
+ 
+/**
+ * Paginated response for list endpoints.
+ */
+export interface PaginatedResponse<T> {
+  items: T[];
+  total: number;
+  page: number;
+  pageSize: number;
+  hasMore: boolean;
+}
+ 
+/**
+ * Common status for async operations.
+ */
+export type AsyncStatus = 'idle' | 'loading' | 'success' | 'error';
+ 
+/**
+ * Generic async state wrapper.
+ */
+export interface AsyncState<T, E = Error> {
+  status: AsyncStatus;
+  data: T | null;
+  error: E | null;
+}
+ 
+/**
+ * Entity with common fields.
+ */
+export interface Entity {
+  id: string;
+  createdAt: Date;
+  updatedAt: Date;
+}
+ 
+/**
+ * Named entity with name field.
+ */
+export interface NamedEntity extends Entity {
+  name: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/activeLearningStore.ts.html b/desktop/coverage/src/store/activeLearningStore.ts.html new file mode 100644 index 0000000..207fdd1 --- /dev/null +++ b/desktop/coverage/src/store/activeLearningStore.ts.html @@ -0,0 +1,1360 @@ + + + + + + Code coverage report for src/store/activeLearningStore.ts + + + + + + + + + +
+
+

All files / src/store activeLearningStore.ts

+
+ +
+ 0% + Statements + 0/310 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * ActiveLearningStore - 主动学习状态管理
+ *
+ * 猡久学习事件和学习模式,学习建议的状态。
+ */
+ 
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import {
+  type LearningEvent,
+  type LearningPattern,
+  type LearningSuggestion,
+  type LearningEventType,
+  type LearningConfig,
+} from '../types/active-learning';
+ 
+// === Types ===
+ 
+interface ActiveLearningState {
+  events: LearningEvent[];
+  patterns: LearningPattern[];
+  suggestions: LearningSuggestion[];
+  config: LearningConfig;
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+interface ActiveLearningActions {
+  recordEvent: (event: Omit<LearningEvent, 'id' | 'timestamp' | 'acknowledged'>) => Promise<LearningEvent>;
+  recordFeedback: (agentId: string, messageId: string, feedback: string, context?: string) => Promise<LearningEvent | null>;
+  acknowledgeEvent: (eventId: string) => void;
+  getPatterns: (agentId: string) => LearningPattern[];
+  getSuggestions: (agentId: string) => LearningSuggestion[];
+  applySuggestion: (suggestionId: string) => void;
+  dismissSuggestion: (suggestionId: string) => void;
+  getStats: (agentId: string) => ActiveLearningStats;
+  setConfig: (config: Partial<LearningConfig>) => void;
+  clearEvents: (agentId: string) => void;
+  exportLearningData: (agentId: string) => Promise<string>;
+  importLearningData: (agentId: string, data: string) => Promise<void>;
+}
+ 
+interface ActiveLearningStats {
+  totalEvents: number;
+  eventsByType: Record<LearningEventType, number>;
+  totalPatterns: number;
+  avgConfidence: number;
+}
+ 
+export type ActiveLearningStore = ActiveLearningState & ActiveLearningActions;
+ 
+const STORAGE_KEY = 'zclaw-active-learning';
+const MAX_EVENTS = 1000;
+ 
+// === Helper Functions ===
+ 
+function generateEventId(): string {
+  return `le-${Date.now()}-${Math.random().toString(36).slice(2)}`;
+}
+ 
+function analyzeSentiment(text: string): 'positive' | 'negative' | 'neutral' {
+  const positive = ['好的', '很棒', '谢谢', '完美', 'excellent', '喜欢', '爱了', 'good', 'great', 'nice', '满意'];
+  const negative = ['不好', '差', '糟糕', '错误', 'wrong', 'bad', '不喜欢', '讨厌', '问题', '失败', 'fail', 'error'];
+ 
+  const lowerText = text.toLowerCase();
+ 
+  if (positive.some(w => lowerText.includes(w))) return 'positive';
+  if (negative.some(w => lowerText.includes(w))) return 'negative';
+  return 'neutral';
+}
+ 
+function analyzeEventType(text: string): LearningEventType {
+  const lowerText = text.toLowerCase();
+ 
+  if (lowerText.includes('纠正') || lowerText.includes('不对') || lowerText.includes('修改')) {
+    return 'correction';
+  }
+  if (lowerText.includes('喜欢') || lowerText.includes('偏好') || lowerText.includes('风格')) {
+    return 'preference';
+  }
+  if (lowerText.includes('场景') || lowerText.includes('上下文') || lowerText.includes('情况')) {
+    return 'context';
+  }
+  if (lowerText.includes('总是') || lowerText.includes('经常') || lowerText.includes('习惯')) {
+    return 'behavior';
+  }
+  return 'feedback';
+}
+ 
+function inferPreference(feedback: string, sentiment: string): string {
+  if (sentiment === 'positive') {
+    if (feedback.includes('简洁')) return '用户偏好简洁的回复';
+    if (feedback.includes('详细')) return '用户偏好详细的回复';
+    if (feedback.includes('快速')) return '用户偏好快速响应';
+    return '用户对当前回复风格满意';
+  }
+  if (sentiment === 'negative') {
+    if (feedback.includes('太长')) return '用户偏好更短的回复';
+    if (feedback.includes('太短')) return '用户偏好更详细的回复';
+    if (feedback.includes('不准确')) return '用户偏好更准确的信息';
+    return '用户对当前回复风格不满意';
+  }
+  return '用户反馈中性';
+}
+ 
+// === Store ===
+ 
+export const useActiveLearningStore = create<ActiveLearningStore>()(
+  persist(
+    (set, get) => ({
+      events: [],
+      patterns: [],
+      suggestions: [],
+      config: {
+        enabled: true,
+        minConfidence: 0.5,
+        maxEvents: MAX_EVENTS,
+        suggestionCooldown: 2,
+      },
+      isLoading: false,
+      error: null,
+ 
+      recordEvent: async (event) => {
+        const { events, config } = get();
+        if (!config.enabled) throw new Error('Learning is disabled');
+ 
+        // 检查重复事件
+        const existing = events.find(e =>
+          e.agentId === event.agentId &&
+          e.messageId === event.messageId &&
+          e.type === event.type
+        );
+ 
+        if (existing) {
+          // 更新现有事件
+          const updated = events.map(e =>
+            e.id === existing.id
+              ? {
+                  ...e,
+                  observation: e.observation + ' | ' + event.observation,
+                  confidence: (e.confidence + event.confidence) / 2,
+                  appliedCount: e.appliedCount + 1,
+                }
+              : e
+          );
+          set({ events: updated });
+          return existing;
+        }
+ 
+        // 创建新事件
+        const newEvent: LearningEvent = {
+          ...event,
+          id: generateEventId(),
+          timestamp: Date.now(),
+          acknowledged: false,
+          appliedCount: 0,
+        };
+ 
+        // 提取模式
+        const newPatterns = extractPatterns(newEvent, get().patterns);
+        const newSuggestions = generateSuggestions(newEvent, newPatterns);
+ 
+        // 保持事件数量限制
+        const updatedEvents = [newEvent, ...events].slice(0, config.maxEvents);
+ 
+        set({
+          events: updatedEvents,
+          patterns: [...get().patterns, ...newPatterns],
+          suggestions: [...get().suggestions, ...newSuggestions],
+        });
+ 
+        return newEvent;
+      },
+ 
+      recordFeedback: async (agentId, messageId, feedback, context) => {
+        const { config } = get();
+        if (!config.enabled) return null;
+ 
+        const sentiment = analyzeSentiment(feedback);
+        const type = analyzeEventType(feedback);
+ 
+        return get().recordEvent({
+          type,
+          agentId,
+          messageId,
+          trigger: context || 'User feedback',
+          observation: feedback,
+          context,
+          inferredPreference: inferPreference(feedback, sentiment),
+          confidence: sentiment === 'positive' ? 0.8 : sentiment === 'negative' ? 0.5 : 0.3,
+          appliedCount: 0,
+        });
+      },
+ 
+      acknowledgeEvent: (eventId) => {
+        const { events } = get();
+        set({
+          events: events.map(e =>
+            e.id === eventId ? { ...e, acknowledged: true } : e
+          ),
+        });
+      },
+ 
+      getPatterns: (agentId) => {
+        return get().patterns.filter(p => p.agentId === agentId);
+      },
+ 
+      getSuggestions: (agentId) => {
+        const now = Date.now();
+        return get().suggestions.filter(s =>
+          s.agentId === agentId &&
+          !s.dismissed &&
+          (!s.expiresAt || s.expiresAt.getTime() > now)
+        );
+      },
+ 
+      applySuggestion: (suggestionId) => {
+        const { suggestions, patterns } = get();
+        const suggestion = suggestions.find(s => s.id === suggestionId);
+ 
+        if (suggestion) {
+          // 更新模式置信度
+          const updatedPatterns = patterns.map(p =>
+            p.pattern === suggestion.pattern
+              ? { ...p, confidence: Math.min(1, p.confidence + 0.1) }
+              : p
+          );
+ 
+          set({
+            suggestions: suggestions.map(s =>
+              s.id === suggestionId ? { ...s, dismissed: false } : s
+            ),
+            patterns: updatedPatterns,
+          });
+        }
+      },
+ 
+      dismissSuggestion: (suggestionId) => {
+        const { suggestions } = get();
+        set({
+          suggestions: suggestions.map(s =>
+            s.id === suggestionId ? { ...s, dismissed: true } : s
+          ),
+        });
+      },
+ 
+      getStats: (agentId) => {
+        const { events, patterns } = get();
+        const agentEvents = events.filter(e => e.agentId === agentId);
+        const agentPatterns = patterns.filter(p => p.agentId === agentId);
+ 
+        const eventsByType: Record<LearningEventType, number> = {
+          preference: 0,
+          correction: 0,
+          context: 0,
+          feedback: 0,
+          behavior: 0,
+          implicit: 0,
+        };
+ 
+        for (const event of agentEvents) {
+          eventsByType[event.type]++;
+        }
+ 
+        return {
+          totalEvents: agentEvents.length,
+          eventsByType,
+          totalPatterns: agentPatterns.length,
+          avgConfidence: agentPatterns.length > 0
+            ? agentPatterns.reduce((sum, p) => sum + p.confidence, 0) / agentPatterns.length
+            : 0,
+        };
+      },
+ 
+      setConfig: (config) => {
+        set(state => ({
+          config: { ...state.config, ...config },
+        }));
+      },
+ 
+      clearEvents: (agentId) => {
+        const { events, patterns, suggestions } = get();
+        set({
+          events: events.filter(e => e.agentId !== agentId),
+          patterns: patterns.filter(p => p.agentId !== agentId),
+          suggestions: suggestions.filter(s => s.agentId !== agentId),
+        });
+      },
+ 
+      exportLearningData: async (agentId) => {
+        const { events, patterns, config } = get();
+        const data = {
+          events: events.filter(e => e.agentId === agentId),
+          patterns: patterns.filter(p => p.agentId === agentId),
+          config,
+          exportedAt: new Date().toISOString(),
+        };
+        return JSON.stringify(data, null, 2);
+      },
+ 
+      importLearningData: async (agentId, data) => {
+        try {
+          const parsed = JSON.parse(data);
+          const { events, patterns } = get();
+ 
+          // 合并导入的数据
+          const mergedEvents = [
+            ...events,
+            ...parsed.events.map((e: LearningEvent) => ({
+              ...e,
+              id: generateEventId(),
+              agentId,
+            })),
+          ].slice(0, MAX_EVENTS);
+ 
+          const mergedPatterns = [
+            ...patterns,
+            ...parsed.patterns.map((p: LearningPattern) => ({
+              ...p,
+              agentId,
+            })),
+          ];
+ 
+          set({
+            events: mergedEvents,
+            patterns: mergedPatterns,
+          });
+        } catch (err) {
+          throw new Error(`Failed to import learning data: ${err}`);
+        }
+      },
+    }),
+    {
+      name: STORAGE_KEY,
+    }
+  )
+);
+ 
+// === Pattern Extraction ===
+ 
+function extractPatterns(
+  event: LearningEvent,
+  existingPatterns: LearningPattern[]
+): LearningPattern[] {
+  const patterns: LearningPattern[] = [];
+ 
+  // 偏好模式
+  if (event.observation.includes('谢谢') || event.observation.includes('好的')) {
+    patterns.push({
+      type: 'preference',
+      pattern: 'positive_response_preference',
+      description: '用户偏好正面回复风格',
+      examples: [event.observation],
+      confidence: 0.8,
+      agentId: event.agentId,
+    });
+  }
+ 
+  // 精确性模式
+  if (event.type === 'correction') {
+    patterns.push({
+      type: 'rule',
+      pattern: 'precision_preference',
+      description: '用户对精确性有更高要求',
+      examples: [event.observation],
+      confidence: 0.9,
+      agentId: event.agentId,
+    });
+  }
+ 
+  // 上下文模式
+  if (event.context) {
+    patterns.push({
+      type: 'context',
+      pattern: 'context_aware',
+      description: 'Agent 需要关注上下文',
+      examples: [event.context],
+      confidence: 0.6,
+      agentId: event.agentId,
+    });
+  }
+ 
+  return patterns.filter(p =>
+    !existingPatterns.some(ep => ep.pattern === p.pattern && ep.agentId === p.agentId)
+  );
+}
+ 
+// === Suggestion Generation ===
+ 
+function generateSuggestions(
+  event: LearningEvent,
+  patterns: LearningPattern[]
+): LearningSuggestion[] {
+  const suggestions: LearningSuggestion[] = [];
+  const now = Date.now();
+ 
+  for (const pattern of patterns) {
+    const template = SUGGESTION_TEMPLATES[pattern.pattern];
+ 
+    if (template) {
+      suggestions.push({
+        id: `sug-${Date.now()}-${Math.random().toString(36).slice(2)}`,
+        agentId: event.agentId,
+        type: pattern.type,
+        pattern: pattern.pattern,
+        suggestion: template,
+        confidence: pattern.confidence,
+        createdAt: now,
+        expiresAt: new Date(now + 7 * 24 * 60 * 60 * 1000),
+        dismissed: false,
+      });
+    }
+  }
+ 
+  return suggestions;
+}
+ 
+const SUGGESTION_TEMPLATES: Record<string, string> = {
+  positive_response_preference:
+    '用户似乎偏好正面回复。建议在回复时保持积极和确认的语气。',
+  precision_preference:
+    '用户对精确性有更高要求。建议在提供信息时更加详细和准确。',
+  context_aware:
+    'Agent 需要关注上下文。建议在回复时考虑对话的背景和历史。',
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/agentStore.ts.html b/desktop/coverage/src/store/agentStore.ts.html new file mode 100644 index 0000000..5a20c85 --- /dev/null +++ b/desktop/coverage/src/store/agentStore.ts.html @@ -0,0 +1,886 @@ + + + + + + Code coverage report for src/store/agentStore.ts + + + + + + + + + +
+
+

All files / src/store agentStore.ts

+
+ +
+ 0% + Statements + 0/120 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/120 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Agent Store - Manages clones/agents, usage statistics, and plugin status
+ *
+ * Extracted from gatewayStore.ts for Phase 11 Store Refactoring.
+ * This store focuses on agent/clone CRUD operations and related metadata.
+ */
+import { create } from 'zustand';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Types ===
+ 
+export interface Clone {
+  id: string;
+  name: string;
+  role?: string;
+  nickname?: string;
+  scenarios?: string[];
+  model?: string;
+  workspaceDir?: string;
+  workspaceResolvedPath?: string;
+  restrictFiles?: boolean;
+  privacyOptIn?: boolean;
+  userName?: string;
+  userRole?: string;
+  createdAt: string;
+  bootstrapReady?: boolean;
+  bootstrapFiles?: Array<{ name: string; path: string; exists: boolean }>;
+  updatedAt?: string;
+  // 人格相关字段
+  emoji?: string; // Agent emoji, e.g., "🦞", "🤖", "💻"
+  personality?: string; // 人格风格: professional, friendly, creative, concise
+  communicationStyle?: string; // 沟通风格描述
+  notes?: string; // 用户备注
+  onboardingCompleted?: boolean; // 是否完成首次引导
+}
+ 
+export interface UsageStats {
+  totalSessions: number;
+  totalMessages: number;
+  totalTokens: number;
+  byModel: Record<string, { messages: number; inputTokens: number; outputTokens: number }>;
+}
+ 
+export interface PluginStatus {
+  id: string;
+  name?: string;
+  status: 'active' | 'inactive' | 'error' | 'loading';
+  version?: string;
+  description?: string;
+}
+ 
+export interface CloneCreateOptions {
+  name: string;
+  role?: string;
+  nickname?: string;
+  scenarios?: string[];
+  model?: string;
+  workspaceDir?: string;
+  restrictFiles?: boolean;
+  privacyOptIn?: boolean;
+  userName?: string;
+  userRole?: string;
+  // 人格相关字段
+  emoji?: string;
+  personality?: string;
+  communicationStyle?: string;
+  notes?: string;
+}
+ 
+// === Store State ===
+ 
+export interface AgentStateSlice {
+  clones: Clone[];
+  usageStats: UsageStats | null;
+  pluginStatus: PluginStatus[];
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+// === Store Actions ===
+ 
+export interface AgentActionsSlice {
+  loadClones: () => Promise<void>;
+  createClone: (opts: CloneCreateOptions) => Promise<Clone | undefined>;
+  updateClone: (id: string, updates: Partial<Clone>) => Promise<Clone | undefined>;
+  deleteClone: (id: string) => Promise<void>;
+  loadUsageStats: () => Promise<void>;
+  loadPluginStatus: () => Promise<void>;
+  setError: (error: string | null) => void;
+  clearError: () => void;
+}
+ 
+// === Store Interface ===
+ 
+export type AgentStore = AgentStateSlice & AgentActionsSlice;
+ 
+// === Client Injection ===
+ 
+// For coordinator to inject client - avoids direct import coupling
+let _client: GatewayClient | null = null;
+ 
+/**
+ * Sets the gateway client for the agent store.
+ * Called by the coordinator during initialization.
+ */
+export const setAgentStoreClient = (client: unknown): void => {
+  _client = client as GatewayClient;
+};
+ 
+/**
+ * Gets the gateway client.
+ * Returns null if not set (coordinator must initialize first).
+ */
+const getClient = (): GatewayClient | null => _client;
+ 
+// === Store Implementation ===
+ 
+export const useAgentStore = create<AgentStore>((set, get) => ({
+  // Initial state
+  clones: [],
+  usageStats: null,
+  pluginStatus: [],
+  isLoading: false,
+  error: null,
+ 
+  // Actions
+  loadClones: async () => {
+    const client = getClient();
+    if (!client) {
+      console.warn('[AgentStore] Client not initialized, skipping loadClones');
+      return;
+    }
+ 
+    try {
+      set({ isLoading: true, error: null });
+      const result = await client.listClones();
+      const clones = result?.clones || result?.agents || [];
+      set({ clones, isLoading: false });
+ 
+      // Set default agent ID if we have agents and none is set
+      if (clones.length > 0 && clones[0].id) {
+        const currentDefault = client.getDefaultAgentId();
+        // Only set if the default doesn't exist in the list
+        const defaultExists = clones.some((c: Clone) => c.id === currentDefault);
+        if (!defaultExists) {
+          client.setDefaultAgentId(clones[0].id);
+        }
+      }
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      set({ error: errorMessage, isLoading: false });
+      // Don't throw - clone loading is non-critical
+    }
+  },
+ 
+  createClone: async (opts: CloneCreateOptions) => {
+    const client = getClient();
+    if (!client) {
+      console.warn('[AgentStore] Client not initialized');
+      return undefined;
+    }
+ 
+    try {
+      set({ isLoading: true, error: null });
+      const result = await client.createClone(opts);
+      await get().loadClones(); // Refresh the list
+      return result?.clone;
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      set({ error: errorMessage, isLoading: false });
+      return undefined;
+    }
+  },
+ 
+  updateClone: async (id: string, updates: Partial<Clone>) => {
+    const client = getClient();
+    if (!client) {
+      console.warn('[AgentStore] Client not initialized');
+      return undefined;
+    }
+ 
+    try {
+      set({ isLoading: true, error: null });
+      const result = await client.updateClone(id, updates);
+      await get().loadClones(); // Refresh the list
+      return result?.clone;
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      set({ error: errorMessage, isLoading: false });
+      return undefined;
+    }
+  },
+ 
+  deleteClone: async (id: string) => {
+    const client = getClient();
+    if (!client) {
+      console.warn('[AgentStore] Client not initialized');
+      return;
+    }
+ 
+    try {
+      set({ isLoading: true, error: null });
+      await client.deleteClone(id);
+      await get().loadClones(); // Refresh the list
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : String(err);
+      set({ error: errorMessage, isLoading: false });
+    }
+  },
+ 
+  loadUsageStats: async () => {
+    const client = getClient();
+    if (!client) {
+      console.warn('[AgentStore] Client not initialized, skipping loadUsageStats');
+      return;
+    }
+ 
+    try {
+      const stats = await client.getUsageStats();
+      set({ usageStats: stats });
+    } catch {
+      // Usage stats are non-critical, ignore errors silently
+    }
+  },
+ 
+  loadPluginStatus: async () => {
+    const client = getClient();
+    if (!client) {
+      console.warn('[AgentStore] Client not initialized, skipping loadPluginStatus');
+      return;
+    }
+ 
+    try {
+      const result = await client.getPluginStatus();
+      set({ pluginStatus: result?.plugins || [] });
+    } catch {
+      // Plugin status is non-critical, ignore errors silently
+    }
+  },
+ 
+  setError: (error: string | null) => {
+    set({ error });
+  },
+ 
+  clearError: () => {
+    set({ error: null });
+  },
+}));
+ 
+// === Selectors ===
+ 
+/**
+ * Get a clone by ID
+ */
+export const selectCloneById = (id: string) => (state: AgentStore): Clone | undefined =>
+  state.clones.find((clone) => clone.id === id);
+ 
+/**
+ * Get all active plugins
+ */
+export const selectActivePlugins = (state: AgentStore): PluginStatus[] =>
+  state.pluginStatus.filter((plugin) => plugin.status === 'active');
+ 
+/**
+ * Check if any operation is in progress
+ */
+export const selectIsLoading = (state: AgentStore): boolean => state.isLoading;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/browserHandStore.ts.html b/desktop/coverage/src/store/browserHandStore.ts.html new file mode 100644 index 0000000..a25ee32 --- /dev/null +++ b/desktop/coverage/src/store/browserHandStore.ts.html @@ -0,0 +1,1573 @@ + + + + + + Code coverage report for src/store/browserHandStore.ts + + + + + + + + + +
+
+

All files / src/store browserHandStore.ts

+
+ +
+ 0% + Statements + 0/309 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/309 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Browser Hand State Management
+ *
+ * Zustand store for managing browser automation state, sessions, and execution.
+ */
+ 
+import { create } from 'zustand';
+import { v4 as uuidv4 } from 'uuid';
+import Browser, {
+  createSession,
+  closeSession,
+  listSessions,
+} from '../lib/browser-client';
+import {
+  BUILTIN_TEMPLATES,
+  validateTemplateParams,
+  mergeParamsWithDefaults,
+  type TaskTemplate,
+  type ExecutionState,
+  type BrowserSession,
+  type BrowserLog,
+  type RecentTask,
+  type SessionOptions,
+  type LogLevel,
+  type SessionStatus,
+} from '../components/BrowserHand/templates';
+ 
+// ============================================================================
+// Store State Interface
+// ============================================================================
+ 
+interface BrowserHandState {
+  // Sessions
+  sessions: BrowserSession[];
+  activeSessionId: string | null;
+ 
+  // Execution
+  execution: ExecutionState;
+ 
+  // Logs
+  logs: BrowserLog[];
+  maxLogs: number;
+ 
+  // Templates
+  templates: TaskTemplate[];
+  recentTasks: RecentTask[];
+  maxRecentTasks: number;
+ 
+  // UI State
+  isTemplateModalOpen: boolean;
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+interface BrowserHandActions {
+  // Session Management
+  createSession: (options?: SessionOptions) => Promise<string>;
+  closeSession: (sessionId: string) => Promise<void>;
+  listSessions: () => Promise<void>;
+  setActiveSession: (sessionId: string | null) => void;
+ 
+  // Template Execution
+  executeTemplate: (templateId: string, params: Record<string, unknown>) => Promise<unknown>;
+  executeScript: (script: string, args?: unknown[]) => Promise<unknown>;
+ 
+  // State Updates
+  updateExecutionState: (state: Partial<ExecutionState>) => void;
+  addLog: (log: Omit<BrowserLog, 'id' | 'timestamp'>) => void;
+  clearLogs: () => void;
+ 
+  // Screenshot
+  takeScreenshot: () => Promise<string>;
+ 
+  // UI Control
+  openTemplateModal: () => void;
+  closeTemplateModal: () => void;
+  setLoading: (loading: boolean) => void;
+  setError: (error: string | null) => void;
+  clearError: () => void;
+ 
+  // Recent Tasks
+  addRecentTask: (task: Omit<RecentTask, 'id' | 'executedAt'>) => void;
+  clearRecentTasks: () => void;
+}
+ 
+// ============================================================================
+// Initial State
+// ============================================================================
+ 
+const initialExecutionState: ExecutionState = {
+  isRunning: false,
+  currentAction: null,
+  currentUrl: null,
+  lastScreenshot: null,
+  progress: 0,
+  startTime: null,
+  status: 'idle',
+  error: null,
+};
+ 
+const initialState: BrowserHandState = {
+  sessions: [],
+  activeSessionId: null,
+  execution: initialExecutionState,
+  logs: [],
+  maxLogs: 100,
+  templates: BUILTIN_TEMPLATES,
+  recentTasks: [],
+  maxRecentTasks: 50,
+  isTemplateModalOpen: false,
+  isLoading: false,
+  error: null,
+};
+ 
+// ============================================================================
+// Store Implementation
+// ============================================================================
+ 
+export const useBrowserHandStore = create<BrowserHandState & BrowserHandActions>((set, get) => ({
+  // State
+  ...initialState,
+ 
+  // Session Management
+  createSession: async (options?: SessionOptions) => {
+    const store = get();
+    store.setLoading(true);
+    store.clearError();
+ 
+    try {
+      store.addLog({ level: 'info', message: '正在创建浏览器会话...' });
+ 
+      const result = await createSession({
+        webdriverUrl: options?.webdriverUrl,
+        headless: options?.headless ?? true,
+        browserType: options?.browserType ?? 'chrome',
+        windowWidth: options?.windowWidth,
+        windowHeight: options?.windowHeight,
+      });
+ 
+      const sessionId = result.session_id;
+ 
+      // Fetch session info
+      const sessions = await listSessions();
+      const sessionInfo = sessions.find(s => s.id === sessionId);
+ 
+      const newSession: BrowserSession = {
+        id: sessionId,
+        name: `Browser ${sessionId.substring(0, 8)}`,
+        currentUrl: sessionInfo?.current_url ?? null,
+        title: sessionInfo?.title ?? null,
+        status: (sessionInfo?.status as SessionStatus) ?? 'connected',
+        createdAt: sessionInfo?.created_at ?? new Date().toISOString(),
+        lastActivity: sessionInfo?.last_activity ?? new Date().toISOString(),
+      };
+ 
+      set((state) => ({
+        sessions: [...state.sessions, newSession],
+        activeSessionId: sessionId,
+        isLoading: false,
+      }));
+ 
+      store.addLog({ level: 'info', message: `会话已创建: ${sessionId}` });
+ 
+      return sessionId;
+    } catch (error) {
+      const errorMsg = error instanceof Error ? error.message : String(error);
+      store.addLog({ level: 'error', message: `创建会话失败: ${errorMsg}` });
+      set({ isLoading: false, error: errorMsg });
+      throw error;
+    }
+  },
+ 
+  closeSession: async (sessionId: string) => {
+    const store = get();
+    store.setLoading(true);
+ 
+    try {
+      await closeSession(sessionId);
+ 
+      set((state) => ({
+        sessions: state.sessions.filter(s => s.id !== sessionId),
+        activeSessionId: state.activeSessionId === sessionId ? null : state.activeSessionId,
+        isLoading: false,
+      }));
+ 
+      store.addLog({ level: 'info', message: `会话已关闭: ${sessionId}` });
+    } catch (error) {
+      const errorMsg = error instanceof Error ? error.message : String(error);
+      store.addLog({ level: 'error', message: `关闭会话失败: ${errorMsg}` });
+      set({ isLoading: false, error: errorMsg });
+      throw error;
+    }
+  },
+ 
+  listSessions: async () => {
+    try {
+      const sessions = await listSessions();
+ 
+      const mappedSessions: BrowserSession[] = sessions.map(s => ({
+        id: s.id,
+        name: `Browser ${s.id.substring(0, 8)}`,
+        currentUrl: s.current_url,
+        title: s.title,
+        status: s.status as SessionStatus,
+        createdAt: s.created_at,
+        lastActivity: s.last_activity,
+      }));
+ 
+      set({ sessions: mappedSessions });
+    } catch (error) {
+      console.error('[BrowserHand] Failed to list sessions:', error);
+    }
+  },
+ 
+  setActiveSession: (sessionId: string | null) => {
+    set({ activeSessionId: sessionId });
+  },
+ 
+  // Template Execution
+  executeTemplate: async (templateId: string, params: Record<string, unknown>) => {
+    const store = get();
+ 
+    // Find template
+    const template = store.templates.find(t => t.id === templateId);
+    if (!template) {
+      throw new Error(`Template not found: ${templateId}`);
+    }
+ 
+    // Validate params
+    const validation = validateTemplateParams(template.params, params);
+    if (!validation.valid) {
+      const errorMessages = validation.errors.map(e => e.message).join(', ');
+      throw new Error(`Invalid parameters: ${errorMessages}`);
+    }
+ 
+    // Merge with defaults
+    const mergedParams = mergeParamsWithDefaults(template.params, params);
+ 
+    // Initialize execution state
+    const startTime = new Date().toISOString();
+    set({
+      execution: {
+        ...initialExecutionState,
+        isRunning: true,
+        startTime,
+        status: 'running',
+      },
+    });
+ 
+    // Create browser instance
+    const browser = new Browser();
+ 
+    try {
+      store.addLog({ level: 'info', message: `开始执行模板: ${template.name}` });
+ 
+      // Start browser session
+      await browser.start({ headless: true });
+ 
+      // Create execution context
+      const context = {
+        browser,
+        onProgress: (action: string, progress: number) => {
+          store.updateExecutionState({ currentAction: action, progress });
+          store.addLog({ level: 'action', message: action });
+        },
+        onLog: (level: LogLevel, message: string, details?: Record<string, unknown>) => {
+          store.addLog({ level, message, details });
+        },
+      };
+ 
+      // Execute template
+      const result = await template.execute(mergedParams, context);
+ 
+      // Update state on success
+      set((state) => ({
+        execution: {
+          ...state.execution,
+          isRunning: false,
+          progress: 100,
+          status: 'success',
+        },
+      }));
+ 
+      // Add to recent tasks
+      const duration = Date.now() - new Date(startTime).getTime();
+      store.addRecentTask({
+        templateId: template.id,
+        templateName: template.name,
+        params: mergedParams,
+        status: 'success',
+        duration,
+        result,
+      });
+ 
+      store.addLog({ level: 'info', message: `模板执行完成: ${template.name}` });
+ 
+      return result;
+    } catch (error) {
+      const errorMsg = error instanceof Error ? error.message : String(error);
+ 
+      set((state) => ({
+        execution: {
+          ...state.execution,
+          isRunning: false,
+          status: 'error',
+          error: errorMsg,
+        },
+      }));
+ 
+      // Add failed task
+      const duration = Date.now() - new Date(startTime).getTime();
+      store.addRecentTask({
+        templateId: template.id,
+        templateName: template.name,
+        params: mergedParams,
+        status: 'failed',
+        duration,
+        error: errorMsg,
+      });
+ 
+      store.addLog({ level: 'error', message: `模板执行失败: ${errorMsg}` });
+ 
+      throw error;
+    } finally {
+      await browser.close();
+    }
+  },
+ 
+  executeScript: async (script: string, args?: unknown[]) => {
+    const store = get();
+ 
+    if (!store.activeSessionId) {
+      throw new Error('No active browser session');
+    }
+ 
+    store.updateExecutionState({
+      isRunning: true,
+      currentAction: 'Executing script...',
+      status: 'running',
+    });
+ 
+    try {
+      const browser = new Browser();
+      await browser.start();
+ 
+      const result = await browser.eval(script, args);
+ 
+      store.updateExecutionState({
+        isRunning: false,
+        status: 'success',
+      });
+ 
+      return result;
+    } catch (error) {
+      const errorMsg = error instanceof Error ? error.message : String(error);
+      store.updateExecutionState({
+        isRunning: false,
+        status: 'error',
+        error: errorMsg,
+      });
+      throw error;
+    }
+  },
+ 
+  // State Updates
+  updateExecutionState: (state: Partial<ExecutionState>) => {
+    set((prev) => ({
+      execution: { ...prev.execution, ...state },
+    }));
+  },
+ 
+  addLog: (log: Omit<BrowserLog, 'id' | 'timestamp'>) => {
+    const newLog: BrowserLog = {
+      ...log,
+      id: uuidv4(),
+      timestamp: new Date().toISOString(),
+    };
+ 
+    set((state) => {
+      const logs = [...state.logs, newLog];
+      // Trim logs if exceeding max
+      if (logs.length > state.maxLogs) {
+        return { logs: logs.slice(-state.maxLogs) };
+      }
+      return { logs };
+    });
+  },
+ 
+  clearLogs: () => {
+    set({ logs: [] });
+  },
+ 
+  // Screenshot
+  takeScreenshot: async () => {
+    const store = get();
+ 
+    if (!store.activeSessionId) {
+      throw new Error('No active browser session');
+    }
+ 
+    try {
+      const browser = new Browser();
+      await browser.start();
+ 
+      const result = await browser.screenshot();
+ 
+      set((state) => ({
+        execution: {
+          ...state.execution,
+          lastScreenshot: result.base64,
+        },
+      }));
+ 
+      store.addLog({ level: 'info', message: 'Screenshot captured' });
+ 
+      return result.base64;
+    } catch (error) {
+      const errorMsg = error instanceof Error ? error.message : String(error);
+      store.addLog({ level: 'error', message: `Screenshot failed: ${errorMsg}` });
+      throw error;
+    }
+  },
+ 
+  // UI Control
+  openTemplateModal: () => {
+    set({ isTemplateModalOpen: true });
+  },
+ 
+  closeTemplateModal: () => {
+    set({ isTemplateModalOpen: false });
+  },
+ 
+  setLoading: (loading: boolean) => {
+    set({ isLoading: loading });
+  },
+ 
+  setError: (error: string | null) => {
+    set({ error });
+  },
+ 
+  clearError: () => {
+    set({ error: null });
+  },
+ 
+  // Recent Tasks
+  addRecentTask: (task: Omit<RecentTask, 'id' | 'executedAt'>) => {
+    const newTask: RecentTask = {
+      ...task,
+      id: uuidv4(),
+      executedAt: new Date().toISOString(),
+    };
+ 
+    set((state) => {
+      const recentTasks = [newTask, ...state.recentTasks];
+      // Trim if exceeding max
+      if (recentTasks.length > state.maxRecentTasks) {
+        return { recentTasks: recentTasks.slice(0, state.maxRecentTasks) };
+      }
+      return { recentTasks };
+    });
+  },
+ 
+  clearRecentTasks: () => {
+    set({ recentTasks: [] });
+  },
+}));
+ 
+// ============================================================================
+// Selector Hooks
+// ============================================================================
+ 
+export const useActiveSession = () =>
+  useBrowserHandStore((state) => {
+    if (!state.activeSessionId) return null;
+    return state.sessions.find(s => s.id === state.activeSessionId) ?? null;
+  });
+ 
+export const useExecutionState = () =>
+  useBrowserHandStore((state) => state.execution);
+ 
+export const useIsRunning = () =>
+  useBrowserHandStore((state) => state.execution.isRunning);
+ 
+export const useTemplates = () =>
+  useBrowserHandStore((state) => state.templates);
+ 
+export const useTemplatesByCategory = (category: string) =>
+  useBrowserHandStore((state) =>
+    state.templates.filter(t => t.category === category)
+  );
+ 
+export const useRecentTasks = () =>
+  useBrowserHandStore((state) => state.recentTasks);
+ 
+export const useLogs = () =>
+  useBrowserHandStore((state) => state.logs);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/chatStore.ts.html b/desktop/coverage/src/store/chatStore.ts.html new file mode 100644 index 0000000..43223a9 --- /dev/null +++ b/desktop/coverage/src/store/chatStore.ts.html @@ -0,0 +1,2260 @@ + + + + + + Code coverage report for src/store/chatStore.ts + + + + + + + + + +
+
+

All files / src/store chatStore.ts

+
+ +
+ 49.62% + Statements + 263/530 +
+ + +
+ 66.25% + Branches + 53/80 +
+ + +
+ 78.57% + Functions + 22/28 +
+ + +
+ 49.62% + Lines + 263/530 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +7261x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +7x +  +7x +7x +7x +7x +7x +7x +  +  +  +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +7x +7x +7x +7x +  +  +  +2x +2x +2x +2x +  +  +  +1x +1x +1x +1x +  +1x +  +8x +8x +8x +8x +8x +1x +1x +  +7x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +  +8x +  +  +  +  +7x +7x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +26x +  +1x +5x +5x +5x +5x +5x +  +1x +  +1x +2x +2x +  +  +  +  +2x +  +  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +1x +2x +2x +2x +  +  +  +  +2x +2x +  +2x +2x +  +1x +  +1x +5x +5x +  +5x +5x +5x +5x +5x +5x +5x +5x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +2x +2x +2x +1x +1x +1x +1x +2x +  +1x +2x +2x +2x +2x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +2x +2x +  +  +2x +  +  +  +  +2x +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +  +2x +  +  +2x +  +2x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +2x +2x +2x +4x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +1x +2x +2x +2x +2x +2x +  +  +2x +  +  +  +  +2x +  +2x +  +  +2x +2x +2x +2x +2x +2x +2x +  +2x +2x +  +  +  +2x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +2x +  +  +2x +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +2x +1x +1x +1x +1x +90x +90x +90x +90x +90x +1x +  +1x +1x +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x +1x +1x +1x + 
import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import type { AgentStreamDelta } from '../lib/gateway-client';
+import { getClient } from './connectionStore';
+import { intelligenceClient } from '../lib/intelligence-client';
+import { getMemoryExtractor } from '../lib/memory-extractor';
+import { getAgentSwarm } from '../lib/agent-swarm';
+import { getSkillDiscovery } from '../lib/skill-discovery';
+import { useOfflineStore, isOffline } from './offlineStore';
+import { useConnectionStore } from './connectionStore';
+ 
+export interface MessageFile {
+  name: string;
+  path?: string;
+  size?: number;
+  type?: string;
+}
+ 
+export interface CodeBlock {
+  language?: string;
+  filename?: string;
+  content?: string;
+}
+ 
+export interface Message {
+  id: string;
+  role: 'user' | 'assistant' | 'tool' | 'hand' | 'workflow' | 'system';
+  content: string;
+  timestamp: Date;
+  runId?: string;
+  streaming?: boolean;
+  toolName?: string;
+  toolInput?: string;
+  toolOutput?: string;
+  error?: string;
+  // Hand event fields
+  handName?: string;
+  handStatus?: string;
+  handResult?: unknown;
+  // Workflow event fields
+  workflowId?: string;
+  workflowStep?: string;
+  workflowStatus?: string;
+  workflowResult?: unknown;
+  // Output files and code blocks
+  files?: MessageFile[];
+  codeBlocks?: CodeBlock[];
+}
+ 
+export interface Conversation {
+  id: string;
+  title: string;
+  messages: Message[];
+  sessionKey: string | null;
+  agentId: string | null;
+  createdAt: Date;
+  updatedAt: Date;
+}
+ 
+export interface Agent {
+  id: string;
+  name: string;
+  icon: string;
+  color: string;
+  lastMessage: string;
+  time: string;
+}
+ 
+export interface AgentProfileLike {
+  id: string;
+  name: string;
+  nickname?: string;
+  role?: string;
+}
+ 
+interface ChatState {
+  messages: Message[];
+  conversations: Conversation[];
+  currentConversationId: string | null;
+  agents: Agent[];
+  currentAgent: Agent | null;
+  isStreaming: boolean;
+  isLoading: boolean;
+  currentModel: string;
+  sessionKey: string | null;
+ 
+  addMessage: (message: Message) => void;
+  updateMessage: (id: string, updates: Partial<Message>) => void;
+  setIsLoading: (loading: boolean) => void;
+  setCurrentAgent: (agent: Agent) => void;
+  syncAgents: (profiles: AgentProfileLike[]) => void;
+  setCurrentModel: (model: string) => void;
+  sendMessage: (content: string) => Promise<void>;
+  initStreamListener: () => () => void;
+  newConversation: () => void;
+  switchConversation: (id: string) => void;
+  deleteConversation: (id: string) => void;
+  dispatchSwarmTask: (description: string, style?: 'sequential' | 'parallel' | 'debate') => Promise<string | null>;
+  searchSkills: (query: string) => { results: Array<{ id: string; name: string; description: string }>; totalAvailable: number };
+}
+ 
+function generateConvId(): string {
+  return `conv_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
+}
+ 
+function deriveTitle(messages: Message[]): string {
+  const firstUser = messages.find(m => m.role === 'user');
+  if (firstUser) {
+    const text = firstUser.content.trim();
+    return text.length > 30 ? text.slice(0, 30) + '...' : text;
+  }
+  return '新对话';
+}
+ 
+const DEFAULT_AGENT: Agent = {
+  id: '1',
+  name: 'ZCLAW',
+  icon: '🦞',
+  color: 'bg-gradient-to-br from-orange-500 to-red-500',
+  lastMessage: '发送消息开始对话',
+  time: '',
+};
+ 
+export function toChatAgent(profile: AgentProfileLike): Agent {
+  return {
+    id: profile.id,
+    name: profile.name,
+    icon: profile.nickname?.slice(0, 1) || '🦞',
+    color: 'bg-gradient-to-br from-orange-500 to-red-500',
+    lastMessage: profile.role || '新分身',
+    time: '',
+  };
+}
+ 
+function resolveConversationAgentId(agent: Agent | null): string | null {
+  if (!agent || agent.id === DEFAULT_AGENT.id) {
+    return null;
+  }
+  return agent.id;
+}
+ 
+function resolveGatewayAgentId(agent: Agent | null): string | undefined {
+  if (!agent || agent.id === DEFAULT_AGENT.id || agent.id.startsWith('clone_')) {
+    return undefined;
+  }
+  return agent.id;
+}
+ 
+function resolveAgentForConversation(agentId: string | null, agents: Agent[]): Agent {
+  if (!agentId) {
+    return DEFAULT_AGENT;
+  }
+  return agents.find((agent) => agent.id === agentId) || DEFAULT_AGENT;
+}
+ 
+function upsertActiveConversation(
+  conversations: Conversation[],
+  state: Pick<ChatState, 'messages' | 'sessionKey' | 'currentConversationId' | 'currentAgent'>
+): Conversation[] {
+  if (state.messages.length === 0) {
+    return conversations;
+  }
+ 
+  const currentId = state.currentConversationId || generateConvId();
+  const existingIdx = conversations.findIndex((conversation) => conversation.id === currentId);
+  const nextConversation: Conversation = {
+    id: currentId,
+    title: deriveTitle(state.messages),
+    messages: [...state.messages],
+    sessionKey: state.sessionKey,
+    agentId: resolveConversationAgentId(state.currentAgent),
+    createdAt: existingIdx >= 0 ? conversations[existingIdx].createdAt : new Date(),
+    updatedAt: new Date(),
+  };
+ 
+  if (existingIdx >= 0) {
+    conversations[existingIdx] = nextConversation;
+    return conversations;
+  }
+ 
+  return [nextConversation, ...conversations];
+}
+ 
+export const useChatStore = create<ChatState>()(
+  persist(
+    (set, get) => ({
+  messages: [],
+  conversations: [],
+  currentConversationId: null,
+  agents: [DEFAULT_AGENT],
+  currentAgent: DEFAULT_AGENT,
+  isStreaming: false,
+  isLoading: false,
+  currentModel: 'glm-4-flash',
+  sessionKey: null,
+ 
+  addMessage: (message) =>
+    set((state) => ({ messages: [...state.messages, message] })),
+ 
+  updateMessage: (id, updates) =>
+    set((state) => ({
+      messages: state.messages.map((m) =>
+        m.id === id ? { ...m, ...updates } : m
+      ),
+    })),
+ 
+  setIsLoading: (loading) => set({ isLoading: loading }),
+ 
+  setCurrentAgent: (agent) =>
+    set((state) => {
+      if (state.currentAgent?.id === agent.id) {
+        return { currentAgent: agent };
+      }
+ 
+      // Save current conversation before switching
+      const conversations = upsertActiveConversation([...state.conversations], state);
+ 
+      // Try to find existing conversation for this agent
+      const agentConversation = conversations.find(c => c.agentId === agent.id);
+ 
+      if (agentConversation) {
+        // Restore the agent's previous conversation
+        return {
+          conversations,
+          currentAgent: agent,
+          messages: [...agentConversation.messages],
+          sessionKey: agentConversation.sessionKey,
+          isStreaming: false,
+          currentConversationId: agentConversation.id,
+        };
+      }
+ 
+      // No existing conversation, start fresh
+      return {
+        conversations,
+        currentAgent: agent,
+        messages: [],
+        sessionKey: null,
+        isStreaming: false,
+        currentConversationId: null,
+      };
+    }),
+ 
+  syncAgents: (profiles) =>
+    set((state) => {
+      const agents = profiles.length > 0 ? profiles.map(toChatAgent) : [DEFAULT_AGENT];
+      const currentAgent = state.currentConversationId
+        ? resolveAgentForConversation(
+            state.conversations.find((conversation) => conversation.id === state.currentConversationId)?.agentId || null,
+            agents
+          )
+        : state.currentAgent
+          ? agents.find((agent) => agent.id === state.currentAgent?.id) || agents[0]
+          : agents[0];
+      return { agents, currentAgent };
+    }),
+ 
+  setCurrentModel: (model) => set({ currentModel: model }),
+ 
+  newConversation: () => {
+    const state = get();
+    const conversations = upsertActiveConversation([...state.conversations], state);
+ 
+    set({
+      conversations,
+      messages: [],
+      sessionKey: null,
+      isStreaming: false,
+      currentConversationId: null,
+    });
+  },
+ 
+  switchConversation: (id: string) => {
+    const state = get();
+    const conversations = upsertActiveConversation([...state.conversations], state);
+ 
+    const target = conversations.find(c => c.id === id);
+    if (target) {
+      set({
+        conversations,
+        messages: [...target.messages],
+        sessionKey: target.sessionKey,
+        currentAgent: resolveAgentForConversation(target.agentId, state.agents),
+        currentConversationId: target.id,
+        isStreaming: false,
+      });
+    }
+  },
+ 
+  deleteConversation: (id: string) => {
+    const state = get();
+    const conversations = state.conversations.filter(c => c.id !== id);
+    if (state.currentConversationId === id) {
+      set({ conversations, messages: [], sessionKey: null, currentConversationId: null, isStreaming: false });
+    } else {
+      set({ conversations });
+    }
+  },
+ 
+  sendMessage: async (content: string) => {
+    const { addMessage, currentAgent, sessionKey } = get();
+    const effectiveSessionKey = sessionKey || `session_${Date.now()}`;
+    const effectiveAgentId = resolveGatewayAgentId(currentAgent);
+    const agentId = currentAgent?.id || 'zclaw-main';
+ 
+    // Check if offline - queue message instead of sending
+    if (isOffline()) {
+      const { queueMessage } = useOfflineStore.getState();
+      const queueId = queueMessage(content, effectiveAgentId, effectiveSessionKey);
+      console.log(`[Chat] Offline - message queued: ${queueId}`);
+ 
+      // Show a system message about offline queueing
+      const systemMsg: Message = {
+        id: `system_${Date.now()}`,
+        role: 'system',
+        content: `后端服务不可用,消息已保存到本地队列。恢复连接后将自动发送。`,
+        timestamp: new Date(),
+      };
+      addMessage(systemMsg);
+ 
+      // Add user message for display
+      const userMsg: Message = {
+        id: `user_${Date.now()}`,
+        role: 'user',
+        content,
+        timestamp: new Date(),
+      };
+      addMessage(userMsg);
+      return;
+    }
+ 
+    // Check context compaction threshold before adding new message
+    try {
+      const messages = get().messages.map(m => ({ role: m.role, content: m.content }));
+      const check = await intelligenceClient.compactor.checkThreshold(messages);
+      if (check.should_compact) {
+        console.log(`[Chat] Context compaction triggered (${check.urgency}): ${check.current_tokens} tokens`);
+        const result = await intelligenceClient.compactor.compact(
+          get().messages.map(m => ({
+            role: m.role,
+            content: m.content,
+            id: m.id,
+            timestamp: m.timestamp instanceof Date ? m.timestamp.toISOString() : m.timestamp
+          })),
+          agentId,
+          get().currentConversationId ?? undefined
+        );
+        // Replace messages with compacted version
+        const compactedMsgs: Message[] = result.compacted_messages.map((m, i) => ({
+          id: m.id || `compacted_${i}_${Date.now()}`,
+          role: m.role as Message['role'],
+          content: m.content,
+          timestamp: m.timestamp ? new Date(m.timestamp) : new Date(),
+        }));
+        set({ messages: compactedMsgs });
+      }
+    } catch (err) {
+      console.warn('[Chat] Context compaction check failed:', err);
+    }
+ 
+    // Build memory-enhanced content
+    let enhancedContent = content;
+    try {
+      const relevantMemories = await intelligenceClient.memory.search({
+        agentId,
+        query: content,
+        limit: 8,
+        minImportance: 3,
+      });
+      const memoryContext = relevantMemories.length > 0
+        ? `\n\n## 相关记忆\n${relevantMemories.map(m => `- [${m.type}] ${m.content}`).join('\n')}`
+        : '';
+      const systemPrompt = await intelligenceClient.identity.buildPrompt(agentId, memoryContext);
+      if (systemPrompt) {
+        enhancedContent = `<context>\n${systemPrompt}\n</context>\n\n${content}`;
+      }
+    } catch (err) {
+      console.warn('[Chat] Memory enhancement failed, proceeding without:', err);
+    }
+ 
+    // Add user message (original content for display)
+    const userMsg: Message = {
+      id: `user_${Date.now()}`,
+      role: 'user',
+      content,
+      timestamp: new Date(),
+    };
+    addMessage(userMsg);
+ 
+    // Create placeholder assistant message for streaming
+    const assistantId = `assistant_${Date.now()}`;
+    const assistantMsg: Message = {
+      id: assistantId,
+      role: 'assistant',
+      content: '',
+      timestamp: new Date(),
+      streaming: true,
+    };
+    addMessage(assistantMsg);
+    set({ isStreaming: true });
+ 
+    try {
+      // Use the connected client from connectionStore (supports both GatewayClient and KernelClient)
+      const client = getClient();
+ 
+      // Check connection state first
+      const connectionState = useConnectionStore.getState().connectionState;
+ 
+      if (connectionState !== 'connected') {
+        // Connection lost during send - update error
+        throw new Error(`Not connected (state: ${connectionState})`);
+      }
+ 
+      // Declare runId before chatStream so callbacks can access it
+      let runId = `run_${Date.now()}`;
+ 
+      // Try streaming first (OpenFang WebSocket)
+      const result = await client.chatStream(
+        enhancedContent,
+        {
+          onDelta: (delta: string) => {
+            // Update message content directly (works for both KernelClient and GatewayClient)
+            set((s) => ({
+              messages: s.messages.map((m) =>
+                m.id === assistantId
+                  ? { ...m, content: m.content + delta }
+                  : m
+              ),
+            }));
+          },
+          onTool: (tool: string, input: string, output: string) => {
+            const toolMsg: Message = {
+              id: `tool_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
+              role: 'tool',
+              content: output || input,
+              timestamp: new Date(),
+              runId,
+              toolName: tool,
+              toolInput: input,
+              toolOutput: output,
+            };
+            set((state) => ({ messages: [...state.messages, toolMsg] }));
+          },
+          onHand: (name: string, status: string, result?: unknown) => {
+            const handMsg: Message = {
+              id: `hand_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
+              role: 'hand',
+              content: result
+                ? (typeof result === 'string' ? result : JSON.stringify(result, null, 2))
+                : `Hand: ${name} - ${status}`,
+              timestamp: new Date(),
+              runId,
+              handName: name,
+              handStatus: status,
+              handResult: result,
+            };
+            set((state) => ({ messages: [...state.messages, handMsg] }));
+          },
+          onComplete: () => {
+            const state = get();
+ 
+            // Save conversation to persist across refresh
+            const conversations = upsertActiveConversation([...state.conversations], state);
+            const currentConvId = state.currentConversationId || conversations[0]?.id;
+ 
+            set({
+              isStreaming: false,
+              conversations,
+              currentConversationId: currentConvId,
+              messages: state.messages.map((m) =>
+                m.id === assistantId ? { ...m, streaming: false, runId } : m
+              ),
+            });
+ 
+            // Async memory extraction after stream completes
+            const msgs = get().messages
+              .filter(m => m.role === 'user' || m.role === 'assistant')
+              .map(m => ({ role: m.role, content: m.content }));
+            getMemoryExtractor().extractFromConversation(msgs, agentId, get().currentConversationId ?? undefined).catch(err => {
+              console.warn('[Chat] Memory extraction failed:', err);
+            });
+            // Track conversation for reflection trigger
+            intelligenceClient.reflection.recordConversation().catch(err => {
+              console.warn('[Chat] Recording conversation failed:', err);
+            });
+            intelligenceClient.reflection.shouldReflect().then(shouldReflect => {
+              if (shouldReflect) {
+                intelligenceClient.reflection.reflect(agentId, []).catch(err => {
+                  console.warn('[Chat] Reflection failed:', err);
+                });
+              }
+            });
+          },
+          onError: (error: string) => {
+            set((state) => ({
+              isStreaming: false,
+              messages: state.messages.map((m) =>
+                m.id === assistantId
+                  ? { ...m, content: `⚠️ ${error}`, streaming: false, error }
+                  : m
+              ),
+            }));
+          },
+        },
+        {
+          sessionKey: effectiveSessionKey,
+          agentId: effectiveAgentId,
+        }
+      );
+ 
+      // Update runId from the result if available
+      if (result?.runId) {
+        runId = result.runId;
+      }
+ 
+      if (!sessionKey) {
+        set({ sessionKey: effectiveSessionKey });
+      }
+ 
+      // Store runId on the message for correlation
+      set((state) => ({
+        messages: state.messages.map((m) =>
+          m.id === assistantId ? { ...m, runId } : m
+        ),
+      }));
+    } catch (err: unknown) {
+      // Gateway not connected — show error in the assistant bubble
+      const errorMessage = err instanceof Error ? err.message : '无法连接 Gateway';
+      set((state) => ({
+        isStreaming: false,
+        messages: state.messages.map((m) =>
+          m.id === assistantId
+            ? {
+                ...m,
+                content: `⚠️ ${errorMessage}`,
+                streaming: false,
+                error: errorMessage,
+              }
+            : m
+        ),
+      }));
+    }
+  },
+ 
+  dispatchSwarmTask: async (description: string, style?: 'sequential' | 'parallel' | 'debate') => {
+    try {
+      const swarm = getAgentSwarm();
+      const task = swarm.createTask(description, {
+        communicationStyle: style || 'parallel',
+      });
+ 
+      // Set up executor that uses the connected client
+      swarm.setExecutor(async (agentId: string, prompt: string, context?: string) => {
+        const client = getClient();
+        const fullPrompt = context ? `${context}\n\n${prompt}` : prompt;
+        const result = await client.chat(fullPrompt, { agentId: agentId.startsWith('clone_') ? undefined : agentId });
+        return result?.response || '(无响应)';
+      });
+ 
+      const result = await swarm.execute(task);
+ 
+      // Add swarm result as assistant message
+      const swarmMsg: Message = {
+        id: `swarm_${Date.now()}`,
+        role: 'assistant',
+        content: result.summary || '协作任务完成',
+        timestamp: new Date(),
+      };
+      get().addMessage(swarmMsg);
+ 
+      return result.task.id;
+    } catch (err) {
+      console.warn('[Chat] Swarm dispatch failed:', err);
+      return null;
+    }
+  },
+ 
+  searchSkills: (query: string) => {
+    const discovery = getSkillDiscovery();
+    const result = discovery.searchSkills(query);
+    return {
+      results: result.results.map(s => ({ id: s.id, name: s.name, description: s.description })),
+      totalAvailable: result.totalAvailable,
+    };
+  },
+ 
+  initStreamListener: () => {
+    const client = getClient();
+ 
+    // Check if client supports onAgentStream (GatewayClient does, KernelClient doesn't)
+    if (!('onAgentStream' in client)) {
+      // KernelClient handles streaming via chatStream callbacks, no separate listener needed
+      return () => {};
+    }
+ 
+    const unsubscribe = client.onAgentStream((delta: AgentStreamDelta) => {
+      const state = get();
+ 
+      const streamingMsg = [...state.messages]
+        .reverse()
+        .find((m) => (
+          m.role === 'assistant'
+          && m.streaming
+          && (
+            (delta.runId && m.runId === delta.runId)
+            || (!delta.runId && m.runId == null)
+          )
+        ))
+        || [...state.messages]
+          .reverse()
+          .find((m) => m.role === 'assistant' && m.streaming);
+ 
+      if (!streamingMsg) return;
+ 
+      if (delta.stream === 'assistant' && (delta.delta || delta.content)) {
+        set((s) => ({
+          messages: s.messages.map((m) =>
+            m.id === streamingMsg.id
+              ? { ...m, content: m.content + (delta.delta || delta.content || '') }
+              : m
+          ),
+        }));
+      } else if (delta.stream === 'tool') {
+        const toolMsg: Message = {
+          id: `tool_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
+          role: 'tool',
+          content: delta.toolOutput || '',
+          timestamp: new Date(),
+          runId: delta.runId,
+          toolName: delta.tool,
+          toolInput: delta.toolInput,
+          toolOutput: delta.toolOutput,
+        };
+        set((s) => ({ messages: [...s.messages, toolMsg] }));
+      } else if (delta.stream === 'lifecycle') {
+        if (delta.phase === 'end' || delta.phase === 'error') {
+          set((s) => ({
+            isStreaming: false,
+            messages: s.messages.map((m) =>
+              m.id === streamingMsg.id
+                ? {
+                    ...m,
+                    streaming: false,
+                    error: delta.phase === 'error' ? delta.error : undefined,
+                  }
+                : m
+            ),
+          }));
+        }
+      } else if (delta.stream === 'hand') {
+        // Handle Hand trigger events from OpenFang
+        const handMsg: Message = {
+          id: `hand_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
+          role: 'hand',
+          content: delta.handResult
+            ? (typeof delta.handResult === 'string' ? delta.handResult : JSON.stringify(delta.handResult, null, 2))
+            : `Hand: ${delta.handName || 'unknown'} - ${delta.handStatus || 'triggered'}`,
+          timestamp: new Date(),
+          runId: delta.runId,
+          handName: delta.handName,
+          handStatus: delta.handStatus,
+          handResult: delta.handResult,
+        };
+        set((s) => ({ messages: [...s.messages, handMsg] }));
+      } else if (delta.stream === 'workflow') {
+        // Handle Workflow execution events from OpenFang
+        const workflowMsg: Message = {
+          id: `workflow_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
+          role: 'workflow',
+          content: delta.workflowResult
+            ? (typeof delta.workflowResult === 'string' ? delta.workflowResult : JSON.stringify(delta.workflowResult, null, 2))
+            : `Workflow: ${delta.workflowId || 'unknown'} step ${delta.workflowStep || '?'} - ${delta.workflowStatus || 'running'}`,
+          timestamp: new Date(),
+          runId: delta.runId,
+          workflowId: delta.workflowId,
+          workflowStep: delta.workflowStep,
+          workflowStatus: delta.workflowStatus,
+          workflowResult: delta.workflowResult,
+        };
+        set((s) => ({ messages: [...s.messages, workflowMsg] }));
+      }
+    });
+ 
+    return unsubscribe;
+  },
+}),
+    {
+      name: 'zclaw-chat-storage',
+      partialize: (state) => ({
+        conversations: state.conversations,
+        currentModel: state.currentModel,
+        currentAgentId: state.currentAgent?.id,
+        currentConversationId: state.currentConversationId,
+      }),
+      onRehydrateStorage: () => (state) => {
+        // Rehydrate Date objects from JSON strings
+        if (state?.conversations) {
+          for (const conv of state.conversations) {
+            conv.createdAt = new Date(conv.createdAt);
+            conv.updatedAt = new Date(conv.updatedAt);
+            for (const msg of conv.messages) {
+              msg.timestamp = new Date(msg.timestamp);
+              msg.streaming = false; // Never restore streaming state
+            }
+          }
+        }
+ 
+        // Restore messages from current conversation if exists
+        if (state?.currentConversationId && state.conversations) {
+          const currentConv = state.conversations.find(c => c.id === state.currentConversationId);
+          if (currentConv) {
+            state.messages = [...currentConv.messages];
+            state.sessionKey = currentConv.sessionKey;
+          }
+        }
+      },
+    },
+  ),
+);
+ 
+// Dev-only: Expose chatStore to window for E2E testing
+if (import.meta.env.DEV && typeof window !== 'undefined') {
+  (window as any).__ZCLAW_STORES__ = (window as any).__ZCLAW_STORES__ || {};
+  (window as any).__ZCLAW_STORES__.chat = useChatStore;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/configStore.ts.html b/desktop/coverage/src/store/configStore.ts.html new file mode 100644 index 0000000..3334f56 --- /dev/null +++ b/desktop/coverage/src/store/configStore.ts.html @@ -0,0 +1,2233 @@ + + + + + + Code coverage report for src/store/configStore.ts + + + + + + + + + +
+
+

All files / src/store configStore.ts

+
+ +
+ 8% + Statements + 33/412 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 0% + Functions + 0/21 +
+ + +
+ 8% + Lines + 33/412 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +7171x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * configStore.ts - Configuration Management Store
+ *
+ * Extracted from gatewayStore.ts for Phase 11 Store Refactoring.
+ * Manages settings, workspace, channels, skills, and models.
+ */
+import { create } from 'zustand';
+import type { GatewayModelChoice } from '../lib/gateway-config';
+import { setStoredGatewayUrl, setStoredGatewayToken } from '../lib/gateway-client';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Types ===
+ 
+export interface QuickConfig {
+  agentName?: string;
+  agentRole?: string;
+  userName?: string;
+  userRole?: string;
+  agentNickname?: string;
+  scenarios?: string[];
+  workspaceDir?: string;
+  gatewayUrl?: string;
+  gatewayToken?: string;
+  skillsExtraDirs?: string[];
+  mcpServices?: Array<{ id: string; name: string; enabled: boolean }>;
+  theme?: 'light' | 'dark';
+  autoStart?: boolean;
+  showToolCalls?: boolean;
+  restrictFiles?: boolean;
+  autoSaveContext?: boolean;
+  fileWatching?: boolean;
+  privacyOptIn?: boolean;
+}
+ 
+export interface WorkspaceInfo {
+  path: string;
+  resolvedPath: string;
+  exists: boolean;
+  fileCount: number;
+  totalSize: number;
+}
+ 
+export interface ChannelInfo {
+  id: string;
+  type: string;
+  name: string;
+  label: string;
+  status: 'active' | 'inactive' | 'error';
+  enabled?: boolean;
+  accounts?: number;
+  error?: string;
+  config?: Record<string, string>;
+}
+ 
+export interface ScheduledTask {
+  id: string;
+  name: string;
+  schedule: string;
+  status: 'active' | 'paused' | 'completed' | 'error';
+  lastRun?: string;
+  nextRun?: string;
+  description?: string;
+}
+ 
+export interface SkillInfo {
+  id: string;
+  name: string;
+  path?: string;
+  source?: 'builtin' | 'extra';
+  description?: string;
+  version?: string;
+  capabilities?: string[];
+  tags?: string[];
+  mode?: string;
+  triggers?: Array<{ type: string; pattern?: string }>;
+  actions?: Array<{ type: string; params?: Record<string, unknown> }>;
+  enabled?: boolean;
+}
+ 
+// === Client Interface ===
+ 
+export interface ConfigStoreClient {
+  getWorkspaceInfo(): Promise<WorkspaceInfo | null>;
+  getQuickConfig(): Promise<{ quickConfig?: QuickConfig } | null>;
+  saveQuickConfig(config: QuickConfig): Promise<{ quickConfig?: QuickConfig } | null>;
+  listSkills(): Promise<{ skills?: SkillInfo[]; extraDirs?: string[] } | null>;
+  getSkill(id: string): Promise<{ skill?: SkillInfo } | null>;
+  createSkill(skill: {
+    name: string;
+    description?: string;
+    triggers: Array<{ type: string; pattern?: string }>;
+    actions: Array<{ type: string; params?: Record<string, unknown> }>;
+    enabled?: boolean;
+  }): Promise<{ skill?: SkillInfo } | null>;
+  updateSkill(id: string, updates: {
+    name?: string;
+    description?: string;
+    triggers?: Array<{ type: string; pattern?: string }>;
+    actions?: Array<{ type: string; params?: Record<string, unknown> }>;
+    enabled?: boolean;
+  }): Promise<{ skill?: SkillInfo } | null>;
+  deleteSkill(id: string): Promise<void>;
+  listChannels(): Promise<{ channels?: ChannelInfo[] } | null>;
+  getChannel(id: string): Promise<{ channel?: ChannelInfo } | null>;
+  createChannel(channel: {
+    type: string;
+    name: string;
+    config: Record<string, unknown>;
+    enabled?: boolean;
+  }): Promise<{ channel?: ChannelInfo } | null>;
+  updateChannel(id: string, updates: {
+    name?: string;
+    config?: Record<string, unknown>;
+    enabled?: boolean;
+  }): Promise<{ channel?: ChannelInfo } | null>;
+  deleteChannel(id: string): Promise<void>;
+  listScheduledTasks(): Promise<{ tasks?: ScheduledTask[] } | null>;
+  createScheduledTask(task: {
+    name: string;
+    schedule: string;
+    scheduleType: 'cron' | 'interval' | 'once';
+    target?: {
+      type: 'agent' | 'hand' | 'workflow';
+      id: string;
+    };
+    description?: string;
+    enabled?: boolean;
+  }): Promise<ScheduledTask>;
+  listModels(): Promise<{ models: GatewayModelChoice[] }>;
+  getFeishuStatus(): Promise<{ configured?: boolean; accounts?: number } | null>;
+}
+ 
+// === Store State Slice ===
+ 
+export interface ConfigStateSlice {
+  quickConfig: QuickConfig;
+  workspaceInfo: WorkspaceInfo | null;
+  channels: ChannelInfo[];
+  scheduledTasks: ScheduledTask[];
+  skillsCatalog: SkillInfo[];
+  models: GatewayModelChoice[];
+  modelsLoading: boolean;
+  modelsError: string | null;
+  error: string | null;
+  client: ConfigStoreClient | null;
+  isLoading: boolean;
+}
+ 
+// === Store Actions Slice ===
+ 
+export interface ConfigActionsSlice {
+  setConfigStoreClient: (client: ConfigStoreClient) => void;
+  loadQuickConfig: () => Promise<void>;
+  saveQuickConfig: (updates: Partial<QuickConfig>) => Promise<void>;
+  loadWorkspaceInfo: () => Promise<void>;
+  loadChannels: () => Promise<void>;
+  getChannel: (id: string) => Promise<ChannelInfo | undefined>;
+  createChannel: (channel: {
+    type: string;
+    name: string;
+    config: Record<string, unknown>;
+    enabled?: boolean;
+  }) => Promise<ChannelInfo | undefined>;
+  updateChannel: (id: string, updates: {
+    name?: string;
+    config?: Record<string, unknown>;
+    enabled?: boolean;
+  }) => Promise<ChannelInfo | undefined>;
+  deleteChannel: (id: string) => Promise<void>;
+  loadScheduledTasks: () => Promise<void>;
+  createScheduledTask: (task: {
+    name: string;
+    schedule: string;
+    scheduleType: 'cron' | 'interval' | 'once';
+    target?: {
+      type: 'agent' | 'hand' | 'workflow';
+      id: string;
+    };
+    description?: string;
+    enabled?: boolean;
+  }) => Promise<ScheduledTask | undefined>;
+  loadSkillsCatalog: () => Promise<void>;
+  getSkill: (id: string) => Promise<SkillInfo | undefined>;
+  createSkill: (skill: {
+    name: string;
+    description?: string;
+    triggers: Array<{ type: string; pattern?: string }>;
+    actions: Array<{ type: string; params?: Record<string, unknown> }>;
+    enabled?: boolean;
+  }) => Promise<SkillInfo | undefined>;
+  updateSkill: (id: string, updates: {
+    name?: string;
+    description?: string;
+    triggers?: Array<{ type: string; pattern?: string }>;
+    actions?: Array<{ type: string; params?: Record<string, unknown> }>;
+    enabled?: boolean;
+  }) => Promise<SkillInfo | undefined>;
+  deleteSkill: (id: string) => Promise<void>;
+  loadModels: () => Promise<void>;
+  clearError: () => void;
+}
+ 
+// === Combined Store Type ===
+ 
+export type ConfigStore = ConfigStateSlice & ConfigActionsSlice;
+ 
+export const useConfigStore = create<ConfigStateSlice & ConfigActionsSlice>((set, get) => ({
+  // Initial State
+  quickConfig: {},
+  workspaceInfo: null,
+  channels: [],
+  scheduledTasks: [],
+  skillsCatalog: [],
+  models: [],
+  modelsLoading: false,
+  modelsError: null,
+  error: null,
+  client: null,
+  isLoading: false,
+ 
+  // Client Injection
+  setConfigStoreClient: (client: ConfigStoreClient) => {
+    set({ client });
+  },
+ 
+  // === Quick Config Actions ===
+ 
+  loadQuickConfig: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const result = await client.getQuickConfig();
+      set({ quickConfig: result?.quickConfig || {} });
+    } catch {
+      // Ignore if quick config not available
+    }
+  },
+ 
+  saveQuickConfig: async (updates: Partial<QuickConfig>) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const nextConfig = { ...get().quickConfig, ...updates };
+      // Persist gateway URL/token to localStorage for reconnection
+      if (nextConfig.gatewayUrl) {
+        setStoredGatewayUrl(nextConfig.gatewayUrl);
+      }
+      if (Object.prototype.hasOwnProperty.call(updates, 'gatewayToken')) {
+        setStoredGatewayToken(nextConfig.gatewayToken || '');
+      }
+      const result = await client.saveQuickConfig(nextConfig);
+      set({ quickConfig: result?.quickConfig || nextConfig });
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+    }
+  },
+ 
+  // === Workspace Actions ===
+ 
+  loadWorkspaceInfo: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const info = await client.getWorkspaceInfo();
+      set({ workspaceInfo: info });
+    } catch {
+      // Ignore if workspace info not available
+    }
+  },
+ 
+  // === Channel Actions ===
+ 
+  loadChannels: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    const channels: ChannelInfo[] = [];
+    try {
+      // Try listing channels from Gateway
+      const result = await client.listChannels();
+      if (result?.channels) {
+        set({ channels: result.channels });
+        return;
+      }
+    } catch {
+      // channels.list may not be available, fallback to probing
+    }
+ 
+    // Fallback: probe known channels individually
+    try {
+      const feishu = await client.getFeishuStatus();
+      channels.push({
+        id: 'feishu',
+        type: 'feishu',
+        name: 'feishu',
+        label: '飞书 (Feishu)',
+        status: feishu?.configured ? 'active' : 'inactive',
+        accounts: feishu?.accounts || 0,
+      });
+    } catch {
+      channels.push({ id: 'feishu', type: 'feishu', name: 'feishu', label: '飞书 (Feishu)', status: 'inactive' });
+    }
+ 
+    set({ channels });
+  },
+ 
+  getChannel: async (id: string) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.getChannel(id);
+      if (result?.channel) {
+        // Update the channel in the local state if it exists
+        const currentChannels = get().channels;
+        const existingIndex = currentChannels.findIndex(c => c.id === id);
+        if (existingIndex >= 0) {
+          const updatedChannels = [...currentChannels];
+          updatedChannels[existingIndex] = result.channel;
+          set({ channels: updatedChannels });
+        }
+        return result.channel as ChannelInfo;
+      }
+      return undefined;
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  createChannel: async (channel) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.createChannel(channel);
+      if (result?.channel) {
+        // Add the new channel to local state
+        const currentChannels = get().channels;
+        set({ channels: [...currentChannels, result.channel as ChannelInfo] });
+        return result.channel as ChannelInfo;
+      }
+      return undefined;
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  updateChannel: async (id, updates) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.updateChannel(id, updates);
+      if (result?.channel) {
+        // Update the channel in local state
+        const currentChannels = get().channels;
+        const updatedChannels = currentChannels.map(c =>
+          c.id === id ? (result.channel as ChannelInfo) : c
+        );
+        set({ channels: updatedChannels });
+        return result.channel as ChannelInfo;
+      }
+      return undefined;
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  deleteChannel: async (id) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.deleteChannel(id);
+      // Remove the channel from local state
+      const currentChannels = get().channels;
+      set({ channels: currentChannels.filter(c => c.id !== id) });
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+    }
+  },
+ 
+  // === Scheduled Task Actions ===
+ 
+  loadScheduledTasks: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const result = await client.listScheduledTasks();
+      set({ scheduledTasks: result?.tasks || [] });
+    } catch {
+      // Ignore if heartbeat.tasks not available
+    }
+  },
+ 
+  createScheduledTask: async (task) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.createScheduledTask(task);
+      const newTask: ScheduledTask = {
+        id: result.id,
+        name: result.name,
+        schedule: result.schedule,
+        status: result.status as 'active' | 'paused' | 'completed' | 'error',
+        lastRun: result.lastRun,
+        nextRun: result.nextRun,
+        description: result.description,
+      };
+      set((state) => ({
+        scheduledTasks: [...state.scheduledTasks, newTask],
+      }));
+      return newTask;
+    } catch (err: unknown) {
+      const errorMessage = err instanceof Error ? err.message : 'Failed to create scheduled task';
+      set({ error: errorMessage });
+      return undefined;
+    }
+  },
+ 
+  // === Skill Actions ===
+ 
+  loadSkillsCatalog: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const result = await client.listSkills();
+      set({ skillsCatalog: result?.skills || [] });
+      if (result?.extraDirs) {
+        set((state) => ({
+          quickConfig: {
+            ...state.quickConfig,
+            skillsExtraDirs: result.extraDirs,
+          },
+        }));
+      }
+    } catch {
+      // Ignore if skills list not available
+    }
+  },
+ 
+  getSkill: async (id: string) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.getSkill(id);
+      return result?.skill as SkillInfo | undefined;
+    } catch {
+      return undefined;
+    }
+  },
+ 
+  createSkill: async (skill) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.createSkill(skill);
+      const newSkill = result?.skill as SkillInfo | undefined;
+      if (newSkill) {
+        set((state) => ({
+          skillsCatalog: [...state.skillsCatalog, newSkill],
+        }));
+      }
+      return newSkill;
+    } catch {
+      return undefined;
+    }
+  },
+ 
+  updateSkill: async (id, updates) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.updateSkill(id, updates);
+      const updatedSkill = result?.skill as SkillInfo | undefined;
+      if (updatedSkill) {
+        set((state) => ({
+          skillsCatalog: state.skillsCatalog.map((s) =>
+            s.id === id ? updatedSkill : s
+          ),
+        }));
+      }
+      return updatedSkill;
+    } catch {
+      return undefined;
+    }
+  },
+ 
+  deleteSkill: async (id) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.deleteSkill(id);
+      set((state) => ({
+        skillsCatalog: state.skillsCatalog.filter((s) => s.id !== id),
+      }));
+    } catch {
+      // Ignore deletion errors
+    }
+  },
+ 
+  // === Model Actions ===
+ 
+  loadModels: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      set({ modelsLoading: true, modelsError: null });
+      const result = await client.listModels();
+      const models: GatewayModelChoice[] = result?.models || [];
+      set({ models, modelsLoading: false });
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to load models';
+      set({ modelsError: message, modelsLoading: false });
+    }
+  },
+ 
+  // === Utility ===
+ 
+  clearError: () => {
+    set({ error: null });
+  },
+}));
+ 
+// Re-export types for convenience
+export type {
+  QuickConfig as QuickConfigType,
+  WorkspaceInfo as WorkspaceInfoType,
+  ChannelInfo as ChannelInfoType,
+  ScheduledTask as ScheduledTaskType,
+  SkillInfo as SkillInfoType,
+};
+ 
+// === Client Injection ===
+ 
+import type { KernelClient } from '../lib/kernel-client';
+ 
+/**
+ * Helper to create a ConfigStoreClient adapter from a GatewayClient.
+ */
+function createConfigClientFromGateway(client: GatewayClient): ConfigStoreClient {
+  return {
+    getWorkspaceInfo: () => client.getWorkspaceInfo(),
+    getQuickConfig: () => client.getQuickConfig(),
+    saveQuickConfig: (config) => client.saveQuickConfig(config),
+    listSkills: () => client.listSkills(),
+    getSkill: (id) => client.getSkill(id),
+    createSkill: (skill) => client.createSkill(skill),
+    updateSkill: (id, updates) => client.updateSkill(id, updates),
+    deleteSkill: (id) => client.deleteSkill(id),
+    listChannels: () => client.listChannels(),
+    getChannel: (id) => client.getChannel(id),
+    createChannel: (channel) => client.createChannel(channel),
+    updateChannel: (id, updates) => client.updateChannel(id, updates),
+    deleteChannel: (id) => client.deleteChannel(id),
+    listScheduledTasks: () => client.listScheduledTasks(),
+    createScheduledTask: async (task) => {
+      const result = await client.createScheduledTask(task);
+      return {
+        id: result.id,
+        name: result.name,
+        schedule: result.schedule,
+        status: result.status as 'active' | 'paused' | 'completed' | 'error',
+      };
+    },
+    listModels: () => client.listModels(),
+    getFeishuStatus: () => client.getFeishuStatus(),
+  };
+}
+ 
+/**
+ * Helper to create a ConfigStoreClient adapter from a KernelClient.
+ */
+function createConfigClientFromKernel(client: KernelClient): ConfigStoreClient {
+  return {
+    getWorkspaceInfo: async () => {
+      try {
+        const status = await client.status();
+        return {
+          path: '',
+          resolvedPath: '',
+          exists: status.initialized as boolean,
+          fileCount: 0,
+          totalSize: 0,
+        };
+      } catch {
+        return null;
+      }
+    },
+    getQuickConfig: async () => ({ quickConfig: {} }),
+    saveQuickConfig: async () => null,
+    listSkills: async () => {
+      try {
+        const result = await client.listSkills();
+        if (result?.skills) {
+          return {
+            skills: result.skills.map((s) => ({
+              id: s.id,
+              name: s.name,
+              description: s.description || '',
+              version: s.version,
+              // Use capabilities directly
+              capabilities: s.capabilities || [],
+              tags: s.tags || [],
+              mode: s.mode,
+              // Map triggers to the expected format
+              triggers: (s.triggers || []).map((t: string) => ({
+                type: 'keyword',
+                pattern: t,
+              })),
+              // Create actions from capabilities for UI display
+              actions: (s.capabilities || []).map((cap: string) => ({
+                type: cap,
+                params: undefined,
+              })),
+              enabled: s.enabled ?? true,
+              category: s.category,
+            })),
+          };
+        }
+        return { skills: [] };
+      } catch {
+        return { skills: [] };
+      }
+    },
+    getSkill: async (id: string) => {
+      return { skill: { id, name: id, description: '' } };
+    },
+    createSkill: async () => {
+      throw new Error('Skill creation not supported in KernelClient');
+    },
+    updateSkill: async () => {
+      throw new Error('Skill update not supported in KernelClient');
+    },
+    deleteSkill: async () => {
+      throw new Error('Skill deletion not supported in KernelClient');
+    },
+    listChannels: async () => ({ channels: [] }),
+    getChannel: async () => null,
+    createChannel: async () => null,
+    updateChannel: async () => null,
+    deleteChannel: async () => {},
+    listScheduledTasks: async () => ({ tasks: [] }),
+    createScheduledTask: async () => {
+      throw new Error('Scheduled tasks not supported in KernelClient');
+    },
+    listModels: async () => {
+      try {
+        const status = await client.status();
+        return {
+          models: status.defaultModel ? [{
+            id: status.defaultModel as string,
+            name: status.defaultModel as string,
+            provider: (status.defaultProvider as string) || 'default',
+          }] : [],
+        };
+      } catch {
+        return { models: [] };
+      }
+    },
+    getFeishuStatus: async () => null,
+  };
+}
+ 
+/**
+ * Sets the client for the config store.
+ * Called by the coordinator during initialization.
+ */
+export function setConfigStoreClient(client: unknown): void {
+  let configClient: ConfigStoreClient;
+ 
+  // Check if it's a KernelClient (has listHands method)
+  if (client && typeof client === 'object' && 'listHands' in client) {
+    configClient = createConfigClientFromKernel(client as KernelClient);
+  } else if (client && typeof client === 'object') {
+    // It's GatewayClient
+    configClient = createConfigClientFromGateway(client as GatewayClient);
+  } else {
+    // Fallback stub client
+    configClient = {
+      getWorkspaceInfo: async () => null,
+      getQuickConfig: async () => null,
+      saveQuickConfig: async () => null,
+      listSkills: async () => ({ skills: [] }),
+      getSkill: async () => null,
+      createSkill: async () => null,
+      updateSkill: async () => null,
+      deleteSkill: async () => {},
+      listChannels: async () => ({ channels: [] }),
+      getChannel: async () => null,
+      createChannel: async () => null,
+      updateChannel: async () => null,
+      deleteChannel: async () => {},
+      listScheduledTasks: async () => ({ tasks: [] }),
+      createScheduledTask: async () => { throw new Error('Not implemented'); },
+      listModels: async () => ({ models: [] }),
+      getFeishuStatus: async () => null,
+    };
+  }
+ 
+  useConfigStore.getState().setConfigStoreClient(configClient);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/connectionStore.ts.html b/desktop/coverage/src/store/connectionStore.ts.html new file mode 100644 index 0000000..a51c4d9 --- /dev/null +++ b/desktop/coverage/src/store/connectionStore.ts.html @@ -0,0 +1,1573 @@ + + + + + + Code coverage report for src/store/connectionStore.ts + + + + + + + + + +
+
+

All files / src/store connectionStore.ts

+
+ +
+ 11.07% + Statements + 32/289 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 5.55% + Functions + 1/18 +
+ + +
+ 11.07% + Lines + 32/289 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +4971x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +1x +  +  +  +  +1x +  +  +  +  +  +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x + 
import { create } from 'zustand';
+import {
+  DEFAULT_GATEWAY_URL,
+  FALLBACK_GATEWAY_URLS,
+  GatewayClient,
+  ConnectionState,
+  getGatewayClient,
+  getStoredGatewayToken,
+  getStoredGatewayUrl,
+  setStoredGatewayUrl,
+} from '../lib/gateway-client';
+import {
+  isTauriRuntime,
+  getLocalGatewayStatus as fetchLocalGatewayStatus,
+  startLocalGateway as startLocalGatewayCommand,
+  stopLocalGateway as stopLocalGatewayCommand,
+  restartLocalGateway as restartLocalGatewayCommand,
+  getUnsupportedLocalGatewayStatus,
+  type LocalGatewayStatus,
+} from '../lib/tauri-gateway';
+import {
+  KernelClient,
+  getKernelClient,
+} from '../lib/kernel-client';
+import {
+  type HealthCheckResult,
+  type HealthStatus,
+} from '../lib/health-check';
+import { useConfigStore } from './configStore';
+ 
+// === Mode Selection ===
+// IMPORTANT: Check isTauriRuntime() at RUNTIME (inside functions), not at module load time.
+// At module load time, window.__TAURI_INTERNALS__ may not be set yet by Tauri.
+ 
+// === Custom Models Helpers ===
+ 
+const CUSTOM_MODELS_STORAGE_KEY = 'zclaw-custom-models';
+ 
+interface CustomModel {
+  id: string;
+  name: string;
+  provider: string;
+  apiKey?: string;
+  apiProtocol: 'openai' | 'anthropic' | 'custom';
+  baseUrl?: string;
+  isDefault?: boolean;
+  createdAt: string;
+}
+ 
+/**
+ * Get custom models from localStorage
+ */
+function loadCustomModels(): CustomModel[] {
+  try {
+    const stored = localStorage.getItem(CUSTOM_MODELS_STORAGE_KEY);
+    if (stored) {
+      return JSON.parse(stored);
+    }
+  } catch (err) {
+    console.error('[connectionStore] Failed to parse models:', err);
+  }
+  return [];
+}
+ 
+/**
+ * Get the default model configuration
+ *
+ * Priority:
+ * 1. Model with isDefault: true
+ * 2. Model matching chatStore's currentModel
+ * 3. First model in the list
+ */
+export function getDefaultModelConfig(): { provider: string; model: string; apiKey: string; baseUrl: string; apiProtocol: string } | null {
+  const models = loadCustomModels();
+ 
+  // Priority 1: Find model with isDefault: true
+  let defaultModel = models.find(m => m.isDefault === true);
+ 
+  // Priority 2: Find model matching chatStore's currentModel
+  if (!defaultModel) {
+    try {
+      const chatStoreData = localStorage.getItem('zclaw-chat-storage');
+      if (chatStoreData) {
+        const parsed = JSON.parse(chatStoreData);
+        const currentModelId = parsed?.state?.currentModel;
+        if (currentModelId) {
+          defaultModel = models.find(m => m.id === currentModelId);
+        }
+      }
+    } catch (err) {
+      console.warn('[connectionStore] Failed to read chatStore:', err);
+    }
+  }
+ 
+  // Priority 3: First model
+  if (!defaultModel) {
+    defaultModel = models[0];
+  }
+ 
+  if (defaultModel) {
+    return {
+      provider: defaultModel.provider,
+      model: defaultModel.id,
+      apiKey: defaultModel.apiKey || '',
+      baseUrl: defaultModel.baseUrl || '',
+      apiProtocol: defaultModel.apiProtocol || 'openai',
+    };
+  }
+ 
+  return null;
+}
+ 
+// === Types ===
+ 
+export interface GatewayLog {
+  timestamp: number;
+  level: string;
+  message: string;
+}
+ 
+// === Helper Functions ===
+ 
+/**
+ * Check if an error indicates we connection should retry with another candidate.
+ */
+function shouldRetryGatewayCandidate(error: unknown): boolean {
+  const message = error instanceof Error ? error.message : String(error || '');
+  return (
+    message === 'WebSocket connection failed'
+    || message.startsWith('Gateway handshake timed out')
+    || message.startsWith('WebSocket closed before handshake completed')
+  || message.startsWith('Connection refused')
+    || message.includes('ECONNREFUSED')
+  || message.includes('Failed to fetch')
+  || message.includes('Network error')
+  || message.includes('pairing required')
+  );
+}
+ 
+/**
+ * Normalize a gateway URL candidate.
+ */
+function normalizeGatewayUrlCandidate(url: string): string {
+  return url.trim().replace(/\/+$/, '');
+}
+ 
+// === Store Interface ===
+ 
+export interface ConnectionStateSlice {
+  connectionState: ConnectionState;
+  gatewayVersion: string | null;
+  error: string | null;
+  logs: GatewayLog[];
+  localGateway: LocalGatewayStatus;
+  localGatewayBusy: boolean;
+  isLoading: boolean;
+  healthStatus: HealthStatus;
+  healthCheckResult: HealthCheckResult | null;
+}
+ 
+export interface ConnectionActionsSlice {
+  connect: (url?: string, token?: string) => Promise<void>;
+  disconnect: () => void;
+  clearLogs: () => void;
+  refreshLocalGateway: () => Promise<LocalGatewayStatus>;
+  startLocalGateway: () => Promise<LocalGatewayStatus | undefined>;
+  stopLocalGateway: () => Promise<LocalGatewayStatus | undefined>;
+  restartLocalGateway: () => Promise<LocalGatewayStatus | undefined>;
+}
+ 
+export interface ConnectionStore extends ConnectionStateSlice, ConnectionActionsSlice {
+  client: GatewayClient | KernelClient;
+}
+ 
+// === Store Implementation ===
+ 
+export const useConnectionStore = create<ConnectionStore>((set, get) => {
+  // Initialize with external gateway client by default.
+  // Will switch to internal kernel client at connect time if in Tauri.
+  const client: GatewayClient | KernelClient = getGatewayClient();
+ 
+  // Wire up state change callback
+  client.onStateChange = (state: ConnectionState) => {
+    set({ connectionState: state });
+  };
+ 
+  // Wire up log callback
+  client.onLog = (level, message) => {
+    set((s) => ({
+      logs: [...s.logs.slice(-99), { timestamp: Date.now(), level, message }],
+    }));
+  };
+ 
+  return {
+    // === Initial State ===
+    connectionState: 'disconnected',
+    gatewayVersion: null,
+    error: null,
+    logs: [],
+    localGateway: getUnsupportedLocalGatewayStatus(),
+    localGatewayBusy: false,
+    isLoading: false,
+    healthStatus: 'unknown',
+    healthCheckResult: null,
+    client,
+ 
+    // === Actions ===
+ 
+    connect: async (url?: string, token?: string) => {
+      try {
+        set({ error: null });
+ 
+        // === Internal Kernel Mode (Tauri) ===
+        // Check at RUNTIME, not at module load time, to ensure __TAURI_INTERNALS__ is available
+        const useInternalKernel = isTauriRuntime();
+        console.log('[ConnectionStore] isTauriRuntime():', useInternalKernel);
+ 
+        if (useInternalKernel) {
+          console.log('[ConnectionStore] Using internal ZCLAW Kernel (no external process needed)');
+          const kernelClient = getKernelClient();
+ 
+          // Get model config from custom models settings
+          const modelConfig = getDefaultModelConfig();
+ 
+          if (!modelConfig) {
+            throw new Error('请先在"模型与 API"设置页面添加自定义模型配置');
+          }
+ 
+          if (!modelConfig.apiKey) {
+            throw new Error(`模型 ${modelConfig.model} 未配置 API Key,请在"模型与 API"设置页面配置`);
+          }
+ 
+          console.log('[ConnectionStore] Model config:', {
+            provider: modelConfig.provider,
+            model: modelConfig.model,
+            hasApiKey: !!modelConfig.apiKey,
+            baseUrl: modelConfig.baseUrl,
+            apiProtocol: modelConfig.apiProtocol,
+          });
+ 
+          kernelClient.setConfig({
+            provider: modelConfig.provider,
+            model: modelConfig.model,
+            apiKey: modelConfig.apiKey,
+            baseUrl: modelConfig.baseUrl,
+            apiProtocol: modelConfig.apiProtocol,
+          });
+ 
+          // Wire up state change callback
+          kernelClient.onStateChange = (state: ConnectionState) => {
+            set({ connectionState: state });
+          };
+ 
+          // Wire up log callback
+          kernelClient.onLog = (level, message) => {
+            set((s) => ({
+              logs: [...s.logs.slice(-99), { timestamp: Date.now(), level, message }],
+            }));
+          };
+ 
+          // Update the stored client reference
+          set({ client: kernelClient });
+ 
+          // Re-inject client to all stores so they get the kernel client
+          const { initializeStores } = await import('./index');
+          initializeStores();
+ 
+          // Connect to internal kernel
+          await kernelClient.connect();
+ 
+          // Set version
+          set({ gatewayVersion: '0.2.0-internal' });
+ 
+          console.log('[ConnectionStore] Connected to internal ZCLAW Kernel');
+          return;
+        }
+ 
+        // === External Gateway Mode (non-Tauri or fallback) ===
+        const c = get().client;
+ 
+        // Resolve connection URL candidates
+        const resolveCandidates = async (): Promise<string[]> => {
+          const explicitUrl = url?.trim();
+          if (explicitUrl) {
+            return [normalizeGatewayUrlCandidate(explicitUrl)];
+          }
+ 
+          const candidates: string[] = [];
+ 
+          // Add quick config gateway URL if available
+          const quickConfigGatewayUrl = useConfigStore.getState().quickConfig?.gatewayUrl?.trim();
+          if (quickConfigGatewayUrl) {
+            candidates.push(quickConfigGatewayUrl);
+          }
+ 
+          // Add stored URL, default, and fallbacks
+          candidates.push(
+            getStoredGatewayUrl(),
+            DEFAULT_GATEWAY_URL,
+            ...FALLBACK_GATEWAY_URLS
+          );
+ 
+          // Return unique, non-empty candidates
+          return Array.from(
+            new Set(
+              candidates
+                .filter(Boolean)
+                .map(normalizeGatewayUrlCandidate)
+            )
+          );
+        };
+ 
+        // Resolve effective token
+        const effectiveToken = token || useConfigStore.getState().quickConfig?.gatewayToken || getStoredGatewayToken();
+        console.log('[ConnectionStore] Connecting with token:', effectiveToken ? '[REDACTED]' : '(empty)');
+ 
+        const candidateUrls = await resolveCandidates();
+        let lastError: unknown = null;
+        let connectedUrl: string | null = null;
+ 
+        // Try each candidate URL
+        for (const candidateUrl of candidateUrls) {
+          try {
+            c.updateOptions({
+              url: candidateUrl,
+              token: effectiveToken,
+            });
+            await c.connect();
+            connectedUrl = candidateUrl;
+            break;
+          } catch (err) {
+            lastError = err;
+ 
+            // Check if we should try next candidate
+            if (!shouldRetryGatewayCandidate(err)) {
+              throw err;
+            }
+          }
+        }
+ 
+        if (!connectedUrl) {
+          throw (lastError instanceof Error ? lastError : new Error('Failed to connect to any available Gateway'));
+        }
+ 
+        // Store successful URL
+        setStoredGatewayUrl(connectedUrl);
+ 
+        // Fetch gateway version
+        try {
+          const health = await c.health();
+          set({ gatewayVersion: health?.version });
+        } catch { /* health may not return version */ }
+ 
+        console.log('[ConnectionStore] Connected to:', connectedUrl);
+      } catch (err: unknown) {
+        const errorMessage = err instanceof Error ? err.message : String(err);
+        set({ error: errorMessage });
+        throw err;
+      }
+    },
+ 
+    disconnect: () => {
+      get().client.disconnect();
+      set({
+        connectionState: 'disconnected',
+        gatewayVersion: null,
+        error: null,
+      });
+    },
+ 
+    clearLogs: () => set({ logs: [] }),
+ 
+    refreshLocalGateway: async () => {
+      if (!isTauriRuntime()) {
+        const unsupported = getUnsupportedLocalGatewayStatus();
+        set({ localGateway: unsupported, localGatewayBusy: false });
+        return unsupported;
+      }
+ 
+      set({ localGatewayBusy: true });
+      try {
+        const status = await fetchLocalGatewayStatus();
+        set({ localGateway: status, localGatewayBusy: false });
+        return status;
+      } catch (err: unknown) {
+        const message = err instanceof Error ? err.message : 'Failed to read local Gateway status';
+        const nextStatus = {
+          ...get().localGateway,
+          supported: true,
+          error: message,
+        };
+        set({ localGateway: nextStatus, localGatewayBusy: false, error: message });
+        return nextStatus;
+      }
+    },
+ 
+    startLocalGateway: async () => {
+      if (!isTauriRuntime()) {
+        const unsupported = getUnsupportedLocalGatewayStatus();
+        set({ localGateway: unsupported, localGatewayBusy: false });
+        return unsupported;
+      }
+ 
+      set({ localGatewayBusy: true, error: null });
+      try {
+        const status = await startLocalGatewayCommand();
+        set({ localGateway: status, localGatewayBusy: false });
+        return status;
+      } catch (err: unknown) {
+        const message = err instanceof Error ? err.message : 'Failed to start local Gateway';
+        const nextStatus = {
+          ...get().localGateway,
+          supported: true,
+          error: message,
+        };
+        set({ localGateway: nextStatus, localGatewayBusy: false, error: message });
+        return undefined;
+      }
+    },
+ 
+    stopLocalGateway: async () => {
+      if (!isTauriRuntime()) {
+        const unsupported = getUnsupportedLocalGatewayStatus();
+        set({ localGateway: unsupported, localGatewayBusy: false });
+        return unsupported;
+      }
+ 
+      set({ localGatewayBusy: true, error: null });
+      try {
+        const status = await stopLocalGatewayCommand();
+        set({ localGateway: status, localGatewayBusy: false });
+        return status;
+      } catch (err: unknown) {
+        const message = err instanceof Error ? err.message : 'Failed to stop local Gateway';
+        const nextStatus = {
+          ...get().localGateway,
+          supported: true,
+          error: message,
+        };
+        set({ localGateway: nextStatus, localGatewayBusy: false, error: message });
+        return undefined;
+      }
+    },
+ 
+    restartLocalGateway: async () => {
+      if (!isTauriRuntime()) {
+        const unsupported = getUnsupportedLocalGatewayStatus();
+        set({ localGateway: unsupported, localGatewayBusy: false });
+        return unsupported;
+      }
+ 
+      set({ localGatewayBusy: true, error: null });
+      try {
+        const status = await restartLocalGatewayCommand();
+        set({ localGateway: status, localGatewayBusy: false });
+        return status;
+      } catch (err: unknown) {
+        const message = err instanceof Error ? err.message : 'Failed to restart local Gateway';
+        const nextStatus = {
+          ...get().localGateway,
+          supported: true,
+          error: message,
+        };
+        set({ localGateway: nextStatus, localGatewayBusy: false, error: message });
+        return undefined;
+      }
+    },
+  };
+});
+ 
+// === Exported Accessors for Coordinator ===
+ 
+/**
+ * Get current connection state.
+ */
+export const getConnectionState = () => useConnectionStore.getState().connectionState;
+ 
+/**
+ * Get gateway client instance.
+ */
+export const getClient = () => useConnectionStore.getState().client;
+ 
+/**
+ * Get current error message.
+ */
+export const getConnectionError = () => useConnectionStore.getState().error;
+ 
+/**
+ * Get local gateway status.
+ */
+export const getLocalGatewayStatus = () => useConnectionStore.getState().localGateway;
+ 
+/**
+ * Get gateway version.
+ */
+export const getGatewayVersion = () => useConnectionStore.getState().gatewayVersion;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/gatewayStore.ts.html b/desktop/coverage/src/store/gatewayStore.ts.html new file mode 100644 index 0000000..40d854a --- /dev/null +++ b/desktop/coverage/src/store/gatewayStore.ts.html @@ -0,0 +1,1159 @@ + + + + + + Code coverage report for src/store/gatewayStore.ts + + + + + + + + + +
+
+

All files / src/store gatewayStore.ts

+
+ +
+ 0% + Statements + 0/140 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/140 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * gatewayStore.ts - Backward-Compatible Facade
+ *
+ * This file was the original monolithic store (1800+ lines).
+ * It is now a thin facade that re-exports types and provides
+ * a composite useGatewayStore hook from the domain-specific stores:
+ *
+ *   connectionStore.ts  - Connection, local gateway management
+ *   agentStore.ts       - Clones, usage stats, plugins
+ *   handStore.ts        - Hands, triggers, approvals
+ *   workflowStore.ts    - Workflows, workflow runs
+ *   configStore.ts      - Config, channels, skills, models, workspace
+ *   securityStore.ts    - Security status, audit logs
+ *   sessionStore.ts     - Sessions, session messages
+ *
+ * Components should gradually migrate to import from the specific stores.
+ * This facade exists only for backward compatibility.
+ */
+import { useConnectionStore } from './connectionStore';
+import { useAgentStore } from './agentStore';
+import { useHandStore } from './handStore';
+import { useWorkflowStore } from './workflowStore';
+import { useConfigStore } from './configStore';
+import { useSecurityStore } from './securityStore';
+import { useSessionStore } from './sessionStore';
+import { useChatStore } from './chatStore';
+import type { GatewayClient, ConnectionState } from '../lib/gateway-client';
+import type { KernelClient } from '../lib/kernel-client';
+import type { GatewayModelChoice } from '../lib/gateway-config';
+import type { LocalGatewayStatus } from '../lib/tauri-gateway';
+import type { Hand, HandRun, Trigger, Approval, ApprovalStatus } from './handStore';
+import type { Workflow, WorkflowRun } from './workflowStore';
+import type { Clone, PluginStatus, UsageStats } from './agentStore';
+import type { QuickConfig, ChannelInfo, ScheduledTask, SkillInfo, WorkspaceInfo } from './configStore';
+import type { SecurityStatus, AuditLogEntry } from './securityStore';
+import type { Session, SessionMessage } from './sessionStore';
+import type { GatewayLog } from './connectionStore';
+ 
+// === Re-export Types from Domain Stores ===
+// These re-exports maintain backward compatibility for all 34+ consumer files.
+ 
+export type { Hand, HandRun, HandRequirement, Trigger, Approval, ApprovalStatus } from './handStore';
+export type { Workflow, WorkflowRun } from './workflowStore';
+export type { Clone, UsageStats, PluginStatus } from './agentStore';
+export type { QuickConfig, WorkspaceInfo, ChannelInfo, ScheduledTask, SkillInfo } from './configStore';
+export type { SecurityLayer, SecurityStatus, AuditLogEntry } from './securityStore';
+export type { Session, SessionMessage } from './sessionStore';
+export type { GatewayLog } from './connectionStore';
+ 
+// === Composite useGatewayStore Hook ===
+// Provides a single store interface that delegates to all domain stores.
+// Components should gradually migrate to import from the specific stores.
+ 
+/**
+ * Composite gateway store hook.
+ *
+ * Reads state from all domain stores and delegates actions.
+ * This is a React hook (not a Zustand store) — it subscribes to
+ * all underlying stores and returns a unified interface.
+ *
+ * @deprecated Components should migrate to use domain-specific stores directly:
+ *   useConnectionStore, useAgentStore, useHandStore, useWorkflowStore,
+ *   useConfigStore, useSecurityStore, useSessionStore
+ */
+export function useGatewayStore(): GatewayFacade;
+export function useGatewayStore<T>(selector: (state: GatewayFacade) => T): T;
+export function useGatewayStore<T>(selector?: (state: GatewayFacade) => T): T | GatewayFacade {
+  // Subscribe to all stores (React will re-render when any changes)
+  const conn = useConnectionStore();
+  const agent = useAgentStore();
+  const hand = useHandStore();
+  const workflow = useWorkflowStore();
+  const config = useConfigStore();
+  const security = useSecurityStore();
+  const session = useSessionStore();
+ 
+  const facade: GatewayFacade = {
+    // === Connection State ===
+    connectionState: conn.connectionState,
+    gatewayVersion: conn.gatewayVersion,
+    error: conn.error || agent.error || hand.error || workflow.error || config.error || session.error || security.securityStatusError,
+    logs: conn.logs,
+    localGateway: conn.localGateway,
+    localGatewayBusy: conn.localGatewayBusy,
+    isLoading: conn.isLoading || agent.isLoading || hand.isLoading || workflow.isLoading,
+    client: conn.client,
+ 
+    // === Agent State ===
+    clones: agent.clones,
+    usageStats: agent.usageStats,
+    pluginStatus: agent.pluginStatus,
+ 
+    // === Hand State ===
+    hands: hand.hands,
+    handRuns: hand.handRuns,
+    triggers: hand.triggers,
+    approvals: hand.approvals,
+ 
+    // === Workflow State ===
+    workflows: workflow.workflows,
+    workflowRuns: workflow.workflowRuns as Record<string, WorkflowRun[]>,
+ 
+    // === Config State ===
+    quickConfig: config.quickConfig,
+    workspaceInfo: config.workspaceInfo,
+    channels: config.channels,
+    scheduledTasks: config.scheduledTasks,
+    skillsCatalog: config.skillsCatalog,
+    models: config.models,
+    modelsLoading: config.modelsLoading,
+    modelsError: config.modelsError,
+ 
+    // === Security State ===
+    securityStatus: security.securityStatus,
+    securityStatusLoading: security.securityStatusLoading,
+    securityStatusError: security.securityStatusError,
+    auditLogs: security.auditLogs,
+ 
+    // === Session State ===
+    sessions: session.sessions,
+    sessionMessages: session.sessionMessages,
+ 
+    // === Connection Actions ===
+    connect: async (url?: string, token?: string) => {
+      await conn.connect(url, token);
+      // Post-connect: load all data from domain stores
+      await Promise.allSettled([
+        config.loadQuickConfig(),
+        config.loadWorkspaceInfo(),
+        agent.loadClones().then(() => {
+          // Sync agents to chat store after loading (use getState for latest)
+          useChatStore.getState().syncAgents(useAgentStore.getState().clones);
+        }),
+        agent.loadUsageStats(),
+        agent.loadPluginStatus(),
+        config.loadScheduledTasks(),
+        config.loadSkillsCatalog(),
+        hand.loadHands(),
+        workflow.loadWorkflows(),
+        hand.loadTriggers(),
+        security.loadSecurityStatus(),
+        config.loadModels(),
+      ]);
+      await config.loadChannels();
+    },
+    disconnect: conn.disconnect,
+    clearLogs: conn.clearLogs,
+    refreshLocalGateway: conn.refreshLocalGateway,
+    startLocalGateway: conn.startLocalGateway,
+    stopLocalGateway: conn.stopLocalGateway,
+    restartLocalGateway: conn.restartLocalGateway,
+ 
+    // === Agent Actions ===
+    loadClones: agent.loadClones,
+    createClone: agent.createClone as GatewayFacade['createClone'],
+    updateClone: agent.updateClone as GatewayFacade['updateClone'],
+    deleteClone: agent.deleteClone,
+    loadUsageStats: agent.loadUsageStats,
+    loadPluginStatus: agent.loadPluginStatus,
+ 
+    // === Hand Actions ===
+    loadHands: hand.loadHands,
+    getHandDetails: hand.getHandDetails,
+    triggerHand: hand.triggerHand,
+    loadHandRuns: hand.loadHandRuns,
+    approveHand: hand.approveHand,
+    cancelHand: hand.cancelHand,
+    loadTriggers: hand.loadTriggers,
+    getTrigger: hand.getTrigger,
+    createTrigger: hand.createTrigger as GatewayFacade['createTrigger'],
+    updateTrigger: hand.updateTrigger,
+    deleteTrigger: hand.deleteTrigger,
+    loadApprovals: hand.loadApprovals,
+    respondToApproval: hand.respondToApproval,
+ 
+    // === Workflow Actions ===
+    loadWorkflows: workflow.loadWorkflows,
+    createWorkflow: workflow.createWorkflow as GatewayFacade['createWorkflow'],
+    updateWorkflow: workflow.updateWorkflow as GatewayFacade['updateWorkflow'],
+    deleteWorkflow: workflow.deleteWorkflow,
+    executeWorkflow: workflow.triggerWorkflow as GatewayFacade['executeWorkflow'],
+    cancelWorkflow: workflow.cancelWorkflow,
+    loadWorkflowRuns: workflow.loadWorkflowRuns as GatewayFacade['loadWorkflowRuns'],
+ 
+    // === Config Actions ===
+    loadQuickConfig: config.loadQuickConfig,
+    saveQuickConfig: config.saveQuickConfig,
+    loadWorkspaceInfo: config.loadWorkspaceInfo,
+    loadChannels: config.loadChannels,
+    getChannel: config.getChannel,
+    createChannel: config.createChannel,
+    updateChannel: config.updateChannel,
+    deleteChannel: config.deleteChannel,
+    loadScheduledTasks: config.loadScheduledTasks,
+    createScheduledTask: config.createScheduledTask,
+    loadSkillsCatalog: config.loadSkillsCatalog,
+    getSkill: config.getSkill,
+    createSkill: config.createSkill,
+    updateSkill: config.updateSkill,
+    deleteSkill: config.deleteSkill,
+    loadModels: config.loadModels,
+ 
+    // === Security Actions ===
+    loadSecurityStatus: security.loadSecurityStatus,
+    loadAuditLogs: security.loadAuditLogs,
+ 
+    // === Session Actions ===
+    loadSessions: session.loadSessions,
+    getSession: session.getSession,
+    createSession: session.createSession,
+    deleteSession: session.deleteSession,
+    loadSessionMessages: session.loadSessionMessages,
+ 
+    // === Legacy ===
+    sendMessage: async (message: string, sessionKey?: string) => {
+      return conn.client.chat(message, { sessionKey });
+    },
+  };
+ 
+  if (selector) {
+    return selector(facade);
+  }
+  return facade;
+}
+ 
+// === Facade Interface (matches the old GatewayStore shape) ===
+ 
+interface GatewayFacade {
+  // Connection state
+  connectionState: ConnectionState;
+  gatewayVersion: string | null;
+  error: string | null;
+  logs: GatewayLog[];
+  localGateway: LocalGatewayStatus;
+  localGatewayBusy: boolean;
+  isLoading: boolean;
+  client: GatewayClient | KernelClient;
+ 
+  // Data
+  clones: Clone[];
+  usageStats: UsageStats | null;
+  pluginStatus: PluginStatus[];
+  channels: ChannelInfo[];
+  scheduledTasks: ScheduledTask[];
+  skillsCatalog: SkillInfo[];
+  quickConfig: QuickConfig;
+  workspaceInfo: WorkspaceInfo | null;
+  models: GatewayModelChoice[];
+  modelsLoading: boolean;
+  modelsError: string | null;
+ 
+  // OpenFang Data
+  hands: Hand[];
+  handRuns: Record<string, HandRun[]>;
+  workflows: Workflow[];
+  triggers: Trigger[];
+  auditLogs: AuditLogEntry[];
+  securityStatus: SecurityStatus | null;
+  securityStatusLoading: boolean;
+  securityStatusError: string | null;
+  approvals: Approval[];
+  sessions: Session[];
+  sessionMessages: Record<string, SessionMessage[]>;
+  workflowRuns: Record<string, WorkflowRun[]>;
+ 
+  // Connection Actions
+  connect: (url?: string, token?: string) => Promise<void>;
+  disconnect: () => void;
+  clearLogs: () => void;
+  refreshLocalGateway: () => Promise<LocalGatewayStatus>;
+  startLocalGateway: () => Promise<LocalGatewayStatus | undefined>;
+  stopLocalGateway: () => Promise<LocalGatewayStatus | undefined>;
+  restartLocalGateway: () => Promise<LocalGatewayStatus | undefined>;
+ 
+  // Agent Actions
+  loadClones: () => Promise<void>;
+  createClone: (opts: { name: string; role?: string; nickname?: string; scenarios?: string[]; model?: string; workspaceDir?: string; restrictFiles?: boolean; privacyOptIn?: boolean; userName?: string; userRole?: string }) => Promise<Clone | undefined>;
+  updateClone: (id: string, updates: Partial<Clone>) => Promise<Clone | undefined>;
+  deleteClone: (id: string) => Promise<void>;
+  loadUsageStats: () => Promise<void>;
+  loadPluginStatus: () => Promise<void>;
+ 
+  // Hand Actions
+  loadHands: () => Promise<void>;
+  getHandDetails: (name: string) => Promise<Hand | undefined>;
+  loadHandRuns: (name: string, opts?: { limit?: number; offset?: number }) => Promise<HandRun[]>;
+  triggerHand: (name: string, params?: Record<string, unknown>) => Promise<HandRun | undefined>;
+  approveHand: (name: string, runId: string, approved: boolean, reason?: string) => Promise<void>;
+  cancelHand: (name: string, runId: string) => Promise<void>;
+  loadTriggers: () => Promise<void>;
+  getTrigger: (id: string) => Promise<Trigger | undefined>;
+  createTrigger: (trigger: { type: string; name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }) => Promise<Trigger | undefined>;
+  updateTrigger: (id: string, updates: { name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }) => Promise<Trigger | undefined>;
+  deleteTrigger: (id: string) => Promise<void>;
+  loadApprovals: (status?: ApprovalStatus) => Promise<void>;
+  respondToApproval: (approvalId: string, approved: boolean, reason?: string) => Promise<void>;
+ 
+  // Workflow Actions
+  loadWorkflows: () => Promise<void>;
+  createWorkflow: (workflow: { name: string; description?: string; steps: Array<{ handName: string; name?: string; params?: Record<string, unknown>; condition?: string }> }) => Promise<Workflow | undefined>;
+  updateWorkflow: (id: string, updates: { name?: string; description?: string; steps?: Array<{ handName: string; name?: string; params?: Record<string, unknown>; condition?: string }> }) => Promise<Workflow | undefined>;
+  deleteWorkflow: (id: string) => Promise<void>;
+  executeWorkflow: (id: string, input?: Record<string, unknown>) => Promise<WorkflowRun | undefined>;
+  cancelWorkflow: (id: string, runId: string) => Promise<void>;
+  loadWorkflowRuns: (workflowId: string, opts?: { limit?: number; offset?: number }) => Promise<WorkflowRun[]>;
+ 
+  // Config Actions
+  loadQuickConfig: () => Promise<void>;
+  saveQuickConfig: (updates: Partial<QuickConfig>) => Promise<void>;
+  loadWorkspaceInfo: () => Promise<void>;
+  loadChannels: () => Promise<void>;
+  getChannel: (id: string) => Promise<ChannelInfo | undefined>;
+  createChannel: (channel: { type: string; name: string; config: Record<string, unknown>; enabled?: boolean }) => Promise<ChannelInfo | undefined>;
+  updateChannel: (id: string, updates: { name?: string; config?: Record<string, unknown>; enabled?: boolean }) => Promise<ChannelInfo | undefined>;
+  deleteChannel: (id: string) => Promise<void>;
+  loadScheduledTasks: () => Promise<void>;
+  createScheduledTask: (task: { name: string; schedule: string; scheduleType: 'cron' | 'interval' | 'once'; target?: { type: 'agent' | 'hand' | 'workflow'; id: string }; description?: string; enabled?: boolean }) => Promise<ScheduledTask | undefined>;
+  loadSkillsCatalog: () => Promise<void>;
+  getSkill: (id: string) => Promise<SkillInfo | undefined>;
+  createSkill: (skill: { name: string; description?: string; triggers: Array<{ type: string; pattern?: string }>; actions: Array<{ type: string; params?: Record<string, unknown> }>; enabled?: boolean }) => Promise<SkillInfo | undefined>;
+  updateSkill: (id: string, updates: { name?: string; description?: string; triggers?: Array<{ type: string; pattern?: string }>; actions?: Array<{ type: string; params?: Record<string, unknown> }>; enabled?: boolean }) => Promise<SkillInfo | undefined>;
+  deleteSkill: (id: string) => Promise<void>;
+  loadModels: () => Promise<void>;
+ 
+  // Security Actions
+  loadSecurityStatus: () => Promise<void>;
+  loadAuditLogs: (opts?: { limit?: number; offset?: number }) => Promise<void>;
+ 
+  // Session Actions
+  loadSessions: (opts?: { limit?: number; offset?: number }) => Promise<void>;
+  getSession: (sessionId: string) => Promise<Session | undefined>;
+  createSession: (agentId: string, metadata?: Record<string, unknown>) => Promise<Session | undefined>;
+  deleteSession: (sessionId: string) => Promise<void>;
+  loadSessionMessages: (sessionId: string, opts?: { limit?: number; offset?: number }) => Promise<SessionMessage[]>;
+ 
+  // Legacy
+  sendMessage: (message: string, sessionKey?: string) => Promise<{ runId: string }>;
+}
+ 
+// Dev-only: Expose stores to window for E2E testing
+if (import.meta.env.DEV && typeof window !== 'undefined') {
+  (window as any).__ZCLAW_STORES__ = (window as any).__ZCLAW_STORES__ || {};
+  (window as any).__ZCLAW_STORES__.gateway = useGatewayStore;
+  (window as any).__ZCLAW_STORES__.connection = useConnectionStore;
+  (window as any).__ZCLAW_STORES__.agent = useAgentStore;
+  (window as any).__ZCLAW_STORES__.hand = useHandStore;
+  (window as any).__ZCLAW_STORES__.workflow = useWorkflowStore;
+  (window as any).__ZCLAW_STORES__.config = useConfigStore;
+  (window as any).__ZCLAW_STORES__.security = useSecurityStore;
+  (window as any).__ZCLAW_STORES__.session = useSessionStore;
+  // Dynamically import chatStore to avoid circular dependency
+  import('./chatStore').then(({ useChatStore }) => {
+    (window as any).__ZCLAW_STORES__.chat = useChatStore;
+  }).catch(() => {
+    // Ignore if chatStore is not available
+  });
+}
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/handStore.ts.html b/desktop/coverage/src/store/handStore.ts.html new file mode 100644 index 0000000..41d37f8 --- /dev/null +++ b/desktop/coverage/src/store/handStore.ts.html @@ -0,0 +1,1687 @@ + + + + + + Code coverage report for src/store/handStore.ts + + + + + + + + + +
+
+

All files / src/store handStore.ts

+
+ +
+ 0% + Statements + 0/285 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/285 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * handStore.ts - Hand, Trigger, and Approval management store
+ *
+ * Extracted from gatewayStore.ts for Phase 11 Store Refactoring.
+ * Manages OpenFang Hands, Triggers, and Approval workflows.
+ */
+import { create } from 'zustand';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Re-exported Types (from gatewayStore for compatibility) ===
+ 
+export interface HandRequirement {
+  description: string;
+  met: boolean;
+  details?: string;
+}
+ 
+export interface Hand {
+  id: string;
+  name: string;
+  description: string;
+  status: 'idle' | 'running' | 'needs_approval' | 'error' | 'unavailable' | 'setup_needed';
+  currentRunId?: string;
+  requirements_met?: boolean;
+  category?: string;
+  icon?: string;
+  provider?: string;
+  model?: string;
+  requirements?: HandRequirement[];
+  tools?: string[];
+  metrics?: string[];
+  toolCount?: number;
+  metricCount?: number;
+}
+ 
+export interface HandRun {
+  runId: string;
+  status: string;
+  startedAt: string;
+  completedAt?: string;
+  result?: unknown;
+  error?: string;
+}
+ 
+export interface Trigger {
+  id: string;
+  type: string;
+  enabled: boolean;
+}
+ 
+export type ApprovalStatus = 'pending' | 'approved' | 'rejected' | 'expired';
+ 
+export interface Approval {
+  id: string;
+  handName: string;
+  runId?: string;
+  status: ApprovalStatus;
+  requestedAt: string;
+  requestedBy?: string;
+  reason?: string;
+  action?: string;
+  params?: Record<string, unknown>;
+  respondedAt?: string;
+  respondedBy?: string;
+  responseReason?: string;
+}
+ 
+// === Trigger Create Options ===
+ 
+export interface TriggerCreateOptions {
+  type: string;
+  name?: string;
+  enabled?: boolean;
+  config?: Record<string, unknown>;
+  handName?: string;
+  workflowId?: string;
+}
+ 
+// === Raw API Response Types (for mapping) ===
+ 
+interface RawHandRequirement {
+  description?: string;
+  name?: string;
+  met?: boolean;
+  satisfied?: boolean;
+  details?: string;
+  hint?: string;
+}
+ 
+interface RawHandRun {
+  runId?: string;
+  run_id?: string;
+  id?: string;
+  status?: string;
+  startedAt?: string;
+  started_at?: string;
+  created_at?: string;
+  completedAt?: string;
+  completed_at?: string;
+  finished_at?: string;
+  result?: unknown;
+  output?: unknown;
+  error?: string;
+  message?: string;
+}
+ 
+interface RawApproval {
+  id?: string;
+  approvalId?: string;
+  approval_id?: string;
+  type?: string;
+  request_type?: string;
+  handId?: string;
+  hand_id?: string;
+  hand_name?: string;
+  handName?: string;
+  run_id?: string;
+  runId?: string;
+  requester?: string;
+  requested_by?: string;
+  requestedAt?: string;
+  requested_at?: string;
+  status?: string;
+  reason?: string;
+  description?: string;
+  action?: string;
+  params?: Record<string, unknown>;
+  responded_at?: string;
+  respondedAt?: string;
+  responded_by?: string;
+  respondedBy?: string;
+  response_reason?: string;
+  responseReason?: string;
+}
+ 
+// === Store Interface ===
+ 
+interface HandClient {
+  listHands: () => Promise<{ hands?: Array<Record<string, unknown>> } | null>;
+  getHand: (name: string) => Promise<Record<string, unknown> | null>;
+  listHandRuns: (name: string, opts?: { limit?: number; offset?: number }) => Promise<{ runs?: RawHandRun[] } | null>;
+  triggerHand: (name: string, params?: Record<string, unknown>) => Promise<{ runId?: string; status?: string } | null>;
+  approveHand: (name: string, runId: string, approved: boolean, reason?: string) => Promise<{ status: string }>;
+  cancelHand: (name: string, runId: string) => Promise<{ status: string }>;
+  listTriggers: () => Promise<{ triggers?: Trigger[] } | null>;
+  getTrigger: (id: string) => Promise<Trigger | null>;
+  createTrigger: (trigger: { type: string; name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }) => Promise<{ id?: string } | null>;
+  updateTrigger: (id: string, updates: { name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }) => Promise<{ id: string }>;
+  deleteTrigger: (id: string) => Promise<{ status: string }>;
+  listApprovals: (status?: ApprovalStatus) => Promise<{ approvals?: RawApproval[] } | null>;
+  respondToApproval: (approvalId: string, approved: boolean, reason?: string) => Promise<{ status: string }>;
+}
+ 
+// === Store State Slice ===
+ 
+export interface HandStateSlice {
+  hands: Hand[];
+  handRuns: Record<string, HandRun[]>;
+  triggers: Trigger[];
+  approvals: Approval[];
+  isLoading: boolean;
+  error: string | null;
+  client: HandClient | null;
+}
+ 
+// === Store Actions Slice ===
+ 
+export interface HandActionsSlice {
+  setHandStoreClient: (client: HandClient) => void;
+  loadHands: () => Promise<void>;
+  getHandDetails: (name: string) => Promise<Hand | undefined>;
+  triggerHand: (name: string, params?: Record<string, unknown>) => Promise<HandRun | undefined>;
+  loadHandRuns: (name: string, opts?: { limit?: number; offset?: number }) => Promise<HandRun[]>;
+  approveHand: (name: string, runId: string, approved: boolean, reason?: string) => Promise<void>;
+  cancelHand: (name: string, runId: string) => Promise<void>;
+  loadTriggers: () => Promise<void>;
+  getTrigger: (id: string) => Promise<Trigger | undefined>;
+  createTrigger: (trigger: TriggerCreateOptions) => Promise<Trigger | undefined>;
+  updateTrigger: (id: string, updates: { name?: string; enabled?: boolean; config?: Record<string, unknown>; handName?: string; workflowId?: string }) => Promise<Trigger | undefined>;
+  deleteTrigger: (id: string) => Promise<void>;
+  loadApprovals: (status?: ApprovalStatus) => Promise<void>;
+  respondToApproval: (approvalId: string, approved: boolean, reason?: string) => Promise<void>;
+  clearError: () => void;
+}
+ 
+// === Combined Store Type ===
+ 
+export type HandStore = HandStateSlice & HandActionsSlice;
+ 
+export const useHandStore = create<HandStore>((set, get) => ({
+  // Initial State
+  hands: [],
+  handRuns: {},
+  triggers: [],
+  approvals: [],
+  isLoading: false,
+  error: null,
+  client: null,
+ 
+  // Client injection
+  setHandStoreClient: (client: HandClient) => {
+    set({ client });
+  },
+ 
+  // === Hand Actions ===
+ 
+  loadHands: async () => {
+    const client = get().client;
+    console.log('[HandStore] loadHands called, client:', !!client);
+    if (!client) {
+      console.warn('[HandStore] No client available, skipping loadHands');
+      return;
+    }
+ 
+    set({ isLoading: true });
+    try {
+      console.log('[HandStore] Calling client.listHands()...');
+      const result = await client.listHands();
+      console.log('[HandStore] listHands result:', result);
+      const validStatuses = ['idle', 'running', 'needs_approval', 'error', 'unavailable', 'setup_needed'] as const;
+      const hands: Hand[] = (result?.hands || []).map((h: Record<string, unknown>) => {
+        const status = validStatuses.includes(h.status as Hand['status'])
+          ? h.status as Hand['status']
+          : (h.requirements_met ? 'idle' : 'setup_needed');
+        return {
+          id: String(h.id || h.name),
+          name: String(h.name || ''),
+          description: String(h.description || ''),
+          status,
+          requirements_met: Boolean(h.requirements_met),
+          category: h.category as string | undefined,
+          icon: h.icon as string | undefined,
+          toolCount: (h.tool_count as number) || ((h.tools as unknown[])?.length),
+          metricCount: (h.metric_count as number) || ((h.metrics as unknown[])?.length),
+        };
+      });
+      console.log('[HandStore] Mapped hands:', hands.length, 'items');
+      set({ hands, isLoading: false });
+    } catch (err) {
+      console.error('[HandStore] loadHands error:', err);
+      set({ isLoading: false });
+    }
+  },
+ 
+  getHandDetails: async (name: string) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.getHand(name);
+      if (!result) return undefined;
+ 
+      const getStringFromConfig = (key: string): string | undefined => {
+        const val = (result.config as Record<string, unknown>)?.[key];
+        return typeof val === 'string' ? val : undefined;
+      };
+      const getArrayFromConfig = (key: string): string[] | undefined => {
+        const val = (result.config as Record<string, unknown>)?.[key];
+        return Array.isArray(val) ? val : undefined;
+      };
+ 
+      const validStatuses = ['idle', 'running', 'needs_approval', 'error', 'unavailable', 'setup_needed'] as const;
+      const status = validStatuses.includes(result.status as Hand['status'])
+        ? result.status as Hand['status']
+        : (result.requirements_met ? 'idle' : 'setup_needed');
+ 
+      const hand: Hand = {
+        id: String(result.id || result.name || name),
+        name: String(result.name || name),
+        description: String(result.description || ''),
+        status,
+        requirements_met: Boolean(result.requirements_met),
+        category: result.category as string | undefined,
+        icon: result.icon as string | undefined,
+        provider: (result.provider as string) || getStringFromConfig('provider'),
+        model: (result.model as string) || getStringFromConfig('model'),
+        requirements: ((result.requirements as RawHandRequirement[]) || []).map((r) => ({
+          description: r.description || r.name || String(r),
+          met: r.met ?? r.satisfied ?? true,
+          details: r.details || r.hint,
+        })),
+        tools: (result.tools as string[]) || getArrayFromConfig('tools'),
+        metrics: (result.metrics as string[]) || getArrayFromConfig('metrics'),
+        toolCount: (result.tool_count as number) || ((result.tools as unknown[])?.length) || 0,
+        metricCount: (result.metric_count as number) || ((result.metrics as unknown[])?.length) || 0,
+      };
+ 
+      set(state => ({
+        hands: state.hands.map(h => h.name === name ? { ...h, ...hand } : h),
+      }));
+ 
+      return hand;
+    } catch {
+      return undefined;
+    }
+  },
+ 
+  loadHandRuns: async (name: string, opts?: { limit?: number; offset?: number }) => {
+    const client = get().client;
+    if (!client) return [];
+ 
+    try {
+      const result = await client.listHandRuns(name, opts);
+      const runs: HandRun[] = (result?.runs || []).map((r: RawHandRun) => ({
+        runId: r.runId || r.run_id || r.id || '',
+        status: r.status || 'unknown',
+        startedAt: r.startedAt || r.started_at || r.created_at || new Date().toISOString(),
+        completedAt: r.completedAt || r.completed_at || r.finished_at,
+        result: r.result || r.output,
+        error: r.error || r.message,
+      }));
+      set(state => ({
+        handRuns: { ...state.handRuns, [name]: runs },
+      }));
+      return runs;
+    } catch {
+      return [];
+    }
+  },
+ 
+  triggerHand: async (name: string, params?: Record<string, unknown>) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.triggerHand(name, params);
+      if (!result) return undefined;
+ 
+      const run: HandRun = {
+        runId: result.runId || '',
+        status: result.status || 'running',
+        startedAt: new Date().toISOString(),
+      };
+ 
+      // Add run to local state
+      set(state => ({
+        handRuns: {
+          ...state.handRuns,
+          [name]: [run, ...(state.handRuns[name] || [])],
+        },
+      }));
+ 
+      // Refresh hands to update status
+      await get().loadHands();
+ 
+      return run;
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  approveHand: async (name: string, runId: string, approved: boolean, reason?: string) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.approveHand(name, runId, approved, reason);
+      await get().loadHands();
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      throw err;
+    }
+  },
+ 
+  cancelHand: async (name: string, runId: string) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.cancelHand(name, runId);
+      await get().loadHands();
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      throw err;
+    }
+  },
+ 
+  // === Trigger Actions ===
+ 
+  loadTriggers: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const result = await client.listTriggers();
+      set({ triggers: result?.triggers || [] });
+    } catch {
+      // ignore if triggers API not available
+    }
+  },
+ 
+  getTrigger: async (id: string) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.getTrigger(id);
+      if (!result) return undefined;
+      return {
+        id: result.id,
+        type: result.type,
+        enabled: result.enabled,
+      } as Trigger;
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  createTrigger: async (trigger: TriggerCreateOptions) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.createTrigger(trigger);
+      if (!result?.id) return undefined;
+      await get().loadTriggers();
+      return get().triggers.find(t => t.id === result.id);
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  updateTrigger: async (id: string, updates) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      await client.updateTrigger(id, updates);
+      set(state => ({
+        triggers: state.triggers.map(t =>
+          t.id === id ? { ...t, ...updates } : t
+        ),
+      }));
+      return get().triggers.find(t => t.id === id);
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  deleteTrigger: async (id: string) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.deleteTrigger(id);
+      set(state => ({
+        triggers: state.triggers.filter(t => t.id !== id),
+      }));
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      throw err;
+    }
+  },
+ 
+  // === Approval Actions ===
+ 
+  loadApprovals: async (status?: ApprovalStatus) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const result = await client.listApprovals(status);
+      const approvals: Approval[] = (result?.approvals || []).map((a: RawApproval) => ({
+        id: a.id || a.approval_id || a.approvalId || '',
+        handName: a.hand_name || a.handName || '',
+        runId: a.run_id || a.runId,
+        status: (a.status || 'pending') as ApprovalStatus,
+        requestedAt: a.requested_at || a.requestedAt || new Date().toISOString(),
+        requestedBy: a.requested_by || a.requester,
+        reason: a.reason || a.description,
+        action: a.action || 'execute',
+        params: a.params,
+        respondedAt: a.responded_at || a.respondedAt,
+        respondedBy: a.responded_by || a.respondedBy,
+        responseReason: a.response_reason || a.responseReason,
+      }));
+      set({ approvals });
+    } catch {
+      // ignore if approvals API not available
+    }
+  },
+ 
+  respondToApproval: async (approvalId: string, approved: boolean, reason?: string) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.respondToApproval(approvalId, approved, reason);
+      await get().loadApprovals();
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      throw err;
+    }
+  },
+ 
+  clearError: () => set({ error: null }),
+}));
+ 
+/**
+ * Helper to create a HandClient adapter from a GatewayClient.
+ * Use this to inject the client into handStore.
+ */
+export function createHandClientFromGateway(client: GatewayClient): HandClient {
+  return {
+    listHands: () => client.listHands(),
+    getHand: (name) => client.getHand(name),
+    listHandRuns: (name, opts) => client.listHandRuns(name, opts),
+    triggerHand: (name, params) => client.triggerHand(name, params),
+    approveHand: (name, runId, approved, reason) => client.approveHand(name, runId, approved, reason),
+    cancelHand: (name, runId) => client.cancelHand(name, runId),
+    listTriggers: () => client.listTriggers(),
+    getTrigger: (id) => client.getTrigger(id),
+    createTrigger: (trigger) => client.createTrigger(trigger),
+    updateTrigger: (id, updates) => client.updateTrigger(id, updates),
+    deleteTrigger: (id) => client.deleteTrigger(id),
+    listApprovals: (status) => client.listApprovals(status),
+    respondToApproval: (approvalId, approved, reason) => client.respondToApproval(approvalId, approved, reason),
+  };
+}
+ 
+// === Client Injection ===
+ 
+/**
+ * Sets the client for the hand store.
+ * Called by the coordinator during initialization.
+ */
+export function setHandStoreClient(client: unknown): void {
+  const handClient = createHandClientFromGateway(client as GatewayClient);
+  useHandStore.getState().setHandStoreClient(handClient);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/index.html b/desktop/coverage/src/store/index.html new file mode 100644 index 0000000..ae61336 --- /dev/null +++ b/desktop/coverage/src/store/index.html @@ -0,0 +1,386 @@ + + + + + + Code coverage report for src/store + + + + + + + + + +
+
+

All files src/store

+
+ +
+ 15.17% + Statements + 686/4521 +
+ + +
+ 64.28% + Branches + 126/196 +
+ + +
+ 34.67% + Functions + 43/124 +
+ + +
+ 15.17% + Lines + 686/4521 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
activeLearningStore.ts +
+
0%0/3100%0/10%0/10%0/310
agentStore.ts +
+
0%0/1200%0/10%0/10%0/120
browserHandStore.ts +
+
0%0/3090%0/10%0/10%0/309
chatStore.ts +
+
49.62%263/53066.25%53/8078.57%22/2849.62%263/530
configStore.ts +
+
8%33/412100%1/10%0/218%33/412
connectionStore.ts +
+
11.07%32/289100%2/25.55%1/1811.07%32/289
gatewayStore.ts +
+
0%0/1400%0/10%0/10%0/140
handStore.ts +
+
0%0/2850%0/10%0/10%0/285
index.ts +
+
0%0/130%0/10%0/10%0/13
memoryGraphStore.ts +
+
0%0/1960%0/10%0/10%0/196
meshStore.ts +
+
0%0/920%0/10%0/10%0/92
offlineStore.ts +
+
19.35%42/217100%2/210%2/2019.35%42/217
personaStore.ts +
+
0%0/1130%0/10%0/10%0/113
securityStore.ts +
+
0%0/670%0/10%0/10%0/67
sessionStore.ts +
+
0%0/1220%0/10%0/10%0/122
skillMarketStore.ts +
+
0%0/3600%0/10%0/10%0/360
teamStore.ts +
+
70.22%316/45070.1%68/9778.26%18/2370.22%316/450
workflowBuilderStore.ts +
+
0%0/3100%0/10%0/10%0/310
workflowStore.ts +
+
0%0/1860%0/10%0/10%0/186
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/index.ts.html b/desktop/coverage/src/store/index.ts.html new file mode 100644 index 0000000..0779d6a --- /dev/null +++ b/desktop/coverage/src/store/index.ts.html @@ -0,0 +1,355 @@ + + + + + + Code coverage report for src/store/index.ts + + + + + + + + + +
+
+

All files / src/store index.ts

+
+ +
+ 0% + Statements + 0/13 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Store Coordinator
+ *
+ * This module provides a unified interface to all specialized stores,
+ * maintaining backward compatibility with components that import useGatewayStore.
+ *
+ * The coordinator:
+ * 1. Injects the shared client into all stores
+ * 2. Re-exports all individual stores for direct access
+ */
+ 
+// === Re-export Individual Stores ===
+export { useConnectionStore, getConnectionState, getClient, getConnectionError, getGatewayVersion } from './connectionStore';
+export type { ConnectionStore, ConnectionStateSlice, ConnectionActionsSlice, GatewayLog } from './connectionStore';
+ 
+export { useAgentStore, setAgentStoreClient } from './agentStore';
+export type { AgentStore, AgentStateSlice, AgentActionsSlice, Clone, UsageStats, PluginStatus, CloneCreateOptions } from './agentStore';
+ 
+export { useHandStore, setHandStoreClient } from './handStore';
+export type { HandStore, HandStateSlice, HandActionsSlice, Hand, HandRun, Trigger, Approval, TriggerCreateOptions } from './handStore';
+ 
+export { useWorkflowStore, setWorkflowStoreClient } from './workflowStore';
+export type { WorkflowStore, WorkflowStateSlice, WorkflowActionsSlice, Workflow, WorkflowRun, WorkflowCreateOptions } from './workflowStore';
+ 
+export { useConfigStore, setConfigStoreClient } from './configStore';
+export type { ConfigStore, ConfigStateSlice, ConfigActionsSlice, QuickConfig, WorkspaceInfo, ChannelInfo, ScheduledTask, SkillInfo } from './configStore';
+ 
+export { useSecurityStore, setSecurityStoreClient } from './securityStore';
+export type { SecurityStore, SecurityStateSlice, SecurityActionsSlice, SecurityLayer, SecurityStatus, AuditLogEntry } from './securityStore';
+ 
+export { useSessionStore, setSessionStoreClient } from './sessionStore';
+export type { SessionStore, SessionStateSlice, SessionActionsSlice, Session, SessionMessage } from './sessionStore';
+ 
+// === New Stores ===
+export { useMemoryGraphStore } from './memoryGraphStore';
+export type { MemoryGraphStore, GraphNode, GraphEdge, GraphFilter, GraphLayout } from './memoryGraphStore';
+ 
+export { useActiveLearningStore } from './activeLearningStore';
+export type { ActiveLearningStore } from './activeLearningStore';
+ 
+// === Browser Hand Store ===
+export { useBrowserHandStore } from './browserHandStore';
+export type {
+  BrowserHandState,
+  BrowserHandActions,
+  ExecutionState,
+  ExecutionStatus,
+  BrowserSession,
+  SessionStatus,
+  BrowserLog,
+  LogLevel,
+  RecentTask,
+  TaskResultStatus,
+  SessionOptions,
+} from '../components/BrowserHand/templates/types';
+ 
+// === Store Initialization ===
+ 
+import { getClient } from './connectionStore';
+import { setAgentStoreClient } from './agentStore';
+import { setHandStoreClient } from './handStore';
+import { setWorkflowStoreClient } from './workflowStore';
+import { setConfigStoreClient } from './configStore';
+import { setSecurityStoreClient } from './securityStore';
+import { setSessionStoreClient } from './sessionStore';
+ 
+/**
+ * Initialize all stores with the shared client.
+ * Called once when the application mounts.
+ */
+export function initializeStores(): void {
+  const client = getClient();
+ 
+  // Inject client into all stores
+  setAgentStoreClient(client);
+  setHandStoreClient(client);
+  setWorkflowStoreClient(client);
+  setConfigStoreClient(client);
+  setSecurityStoreClient(client);
+  setSessionStoreClient(client);
+}
+ 
+/**
+ * Initialize stores on module load.
+ * This ensures all stores have access to the shared client.
+ */
+if (typeof window !== 'undefined') {
+  // Defer initialization to next tick to ensure all modules are loaded
+  setTimeout(initializeStores, 0);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/memoryGraphStore.ts.html b/desktop/coverage/src/store/memoryGraphStore.ts.html new file mode 100644 index 0000000..58aba64 --- /dev/null +++ b/desktop/coverage/src/store/memoryGraphStore.ts.html @@ -0,0 +1,1051 @@ + + + + + + Code coverage report for src/store/memoryGraphStore.ts + + + + + + + + + +
+
+

All files / src/store memoryGraphStore.ts

+
+ +
+ 0% + Statements + 0/196 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/196 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * MemoryGraphStore - 记忆图谱状态管理
+ *
+ * 管理记忆图谱可视化的状态,包括节点、边、布局和交互。
+ */
+ 
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import {
+  intelligenceClient,
+  type MemoryEntry,
+  type MemoryType,
+} from '../lib/intelligence-client';
+ 
+export type { MemoryType };
+ 
+// === Types ===
+ 
+export interface GraphNode {
+  id: string;
+  type: MemoryType;
+  label: string;
+  x: number;
+  y: number;
+  vx: number;
+  vy: number;
+  importance: number;
+  accessCount: number;
+  createdAt: string;
+  isHighlighted: boolean;
+  isSelected: boolean;
+}
+ 
+export interface GraphEdge {
+  id: string;
+  source: string;
+  target: string;
+  type: 'reference' | 'related' | 'derived';
+  strength: number;
+}
+ 
+export interface GraphFilter {
+  types: MemoryType[];
+  minImportance: number;
+  dateRange: {
+    start?: string;
+    end?: string;
+  };
+  searchQuery: string;
+}
+ 
+export interface GraphLayout {
+  width: number;
+  height: number;
+  zoom: number;
+  offsetX: number;
+  offsetY: number;
+}
+ 
+interface MemoryGraphState {
+  nodes: GraphNode[];
+  edges: GraphEdge[];
+  isLoading: boolean;
+  error: string | null;
+  filter: GraphFilter;
+  layout: GraphLayout;
+  selectedNodeId: string | null;
+  hoveredNodeId: string | null;
+  showLabels: boolean;
+  simulationRunning: boolean;
+}
+ 
+interface MemoryGraphActions {
+  loadGraph: (agentId: string) => Promise<void>;
+  setFilter: (filter: Partial<GraphFilter>) => void;
+  resetFilter: () => void;
+  setLayout: (layout: Partial<GraphLayout>) => void;
+  selectNode: (nodeId: string | null) => void;
+  hoverNode: (nodeId: string | null) => void;
+  toggleLabels: () => void;
+  startSimulation: () => void;
+  stopSimulation: () => void;
+  updateNodePositions: (updates: Array<{ id: string; x: number; y: number }>) => void;
+  highlightSearch: (query: string) => void;
+  clearHighlight: () => void;
+  exportAsImage: () => Promise<Blob | null>;
+  getFilteredNodes: () => GraphNode[];
+  getFilteredEdges: () => GraphEdge[];
+}
+ 
+const DEFAULT_FILTER: GraphFilter = {
+  types: ['fact', 'preference', 'lesson', 'context', 'task'],
+  minImportance: 0,
+  dateRange: {},
+  searchQuery: '',
+};
+ 
+const DEFAULT_LAYOUT: GraphLayout = {
+  width: 800,
+  height: 600,
+  zoom: 1,
+  offsetX: 0,
+  offsetY: 0,
+};
+ 
+export type MemoryGraphStore = MemoryGraphState & MemoryGraphActions;
+ 
+// === Helper Functions ===
+ 
+function memoryToNode(memory: MemoryEntry, index: number, total: number): GraphNode {
+  // 使用圆形布局初始位置
+  const angle = (index / total) * 2 * Math.PI;
+  const radius = 200;
+ 
+  return {
+    id: memory.id,
+    type: memory.type,
+    label: memory.content.slice(0, 50) + (memory.content.length > 50 ? '...' : ''),
+    x: 400 + radius * Math.cos(angle),
+    y: 300 + radius * Math.sin(angle),
+    vx: 0,
+    vy: 0,
+    importance: memory.importance,
+    accessCount: memory.accessCount,
+    createdAt: memory.createdAt,
+    isHighlighted: false,
+    isSelected: false,
+  };
+}
+ 
+function findRelatedMemories(memories: MemoryEntry[]): GraphEdge[] {
+  const edges: GraphEdge[] = [];
+ 
+  // 简单的关联算法:基于共同标签和关键词
+  for (let i = 0; i < memories.length; i++) {
+    for (let j = i + 1; j < memories.length; j++) {
+      const m1 = memories[i];
+      const m2 = memories[j];
+ 
+      // 检查共同标签
+      const commonTags = m1.tags.filter(t => m2.tags.includes(t));
+      if (commonTags.length > 0) {
+        edges.push({
+          id: `edge-${m1.id}-${m2.id}`,
+          source: m1.id,
+          target: m2.id,
+          type: 'related',
+          strength: commonTags.length * 0.3,
+        });
+      }
+ 
+      // 同类型记忆关联
+      if (m1.type === m2.type) {
+        const existingEdge = edges.find(
+          e => e.source === m1.id && e.target === m2.id
+        );
+        if (!existingEdge) {
+          edges.push({
+            id: `edge-${m1.id}-${m2.id}-type`,
+            source: m1.id,
+            target: m2.id,
+            type: 'derived',
+            strength: 0.1,
+          });
+        }
+      }
+    }
+  }
+ 
+  return edges;
+}
+ 
+export const useMemoryGraphStore = create<MemoryGraphStore>()(
+  persist(
+    (set, get) => ({
+      nodes: [],
+      edges: [],
+      isLoading: false,
+      error: null,
+      filter: DEFAULT_FILTER,
+      layout: DEFAULT_LAYOUT,
+      selectedNodeId: null,
+      hoveredNodeId: null,
+      showLabels: true,
+      simulationRunning: false,
+ 
+      loadGraph: async (agentId: string) => {
+        set({ isLoading: true, error: null });
+ 
+        try {
+          const memories = await intelligenceClient.memory.search({
+            agentId,
+            limit: 200,
+          });
+ 
+          const nodes = memories.map((m, i) => memoryToNode(m, i, memories.length));
+          const edges = findRelatedMemories(memories);
+ 
+          set({
+            nodes,
+            edges,
+            isLoading: false,
+          });
+        } catch (err) {
+          set({
+            isLoading: false,
+            error: err instanceof Error ? err.message : '加载图谱失败',
+          });
+        }
+      },
+ 
+      setFilter: (filter) => {
+        set(state => ({
+          filter: { ...state.filter, ...filter },
+        }));
+      },
+ 
+      resetFilter: () => {
+        set({ filter: DEFAULT_FILTER });
+      },
+ 
+      setLayout: (layout) => {
+        set(state => ({
+          layout: { ...state.layout, ...layout },
+        }));
+      },
+ 
+      selectNode: (nodeId) => {
+        set(state => ({
+          selectedNodeId: nodeId,
+          nodes: state.nodes.map(n => ({
+            ...n,
+            isSelected: n.id === nodeId,
+          })),
+        }));
+      },
+ 
+      hoverNode: (nodeId) => {
+        set(state => ({
+          hoveredNodeId: nodeId,
+          nodes: state.nodes.map(n => ({
+            ...n,
+            isHighlighted: nodeId ? n.id === nodeId : n.isHighlighted,
+          })),
+        }));
+      },
+ 
+      toggleLabels: () => {
+        set(state => ({ showLabels: !state.showLabels }));
+      },
+ 
+      startSimulation: () => {
+        set({ simulationRunning: true });
+      },
+ 
+      stopSimulation: () => {
+        set({ simulationRunning: false });
+      },
+ 
+      updateNodePositions: (updates) => {
+        set(state => ({
+          nodes: state.nodes.map(node => {
+            const update = updates.find(u => u.id === node.id);
+            return update ? { ...node, x: update.x, y: update.y } : node;
+          }),
+        }));
+      },
+ 
+      highlightSearch: (query) => {
+        const lowerQuery = query.toLowerCase();
+        set(state => ({
+          filter: { ...state.filter, searchQuery: query },
+          nodes: state.nodes.map(n => ({
+            ...n,
+            isHighlighted: query ? n.label.toLowerCase().includes(lowerQuery) : false,
+          })),
+        }));
+      },
+ 
+      clearHighlight: () => {
+        set(state => ({
+          nodes: state.nodes.map(n => ({ ...n, isHighlighted: false })),
+        }));
+      },
+ 
+      exportAsImage: async () => {
+        // SVG 导出逻辑在组件中实现
+        return null;
+      },
+ 
+      getFilteredNodes: () => {
+        const { nodes, filter } = get();
+        return nodes.filter(n => {
+          if (!filter.types.includes(n.type)) return false;
+          if (n.importance < filter.minImportance) return false;
+          if (filter.dateRange.start && n.createdAt < filter.dateRange.start) return false;
+          if (filter.dateRange.end && n.createdAt > filter.dateRange.end) return false;
+          if (filter.searchQuery) {
+            return n.label.toLowerCase().includes(filter.searchQuery.toLowerCase());
+          }
+          return true;
+        });
+      },
+ 
+      getFilteredEdges: () => {
+        const { edges } = get();
+        const filteredNodes = get().getFilteredNodes();
+        const nodeIds = new Set(filteredNodes.map(n => n.id));
+ 
+        return edges.filter(e => nodeIds.has(e.source) && nodeIds.has(e.target));
+      },
+    }),
+    {
+      name: 'zclaw-memory-graph',
+      partialize: (state) => ({
+        filter: state.filter,
+        layout: state.layout,
+        showLabels: state.showLabels,
+      }),
+    }
+  )
+);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/meshStore.ts.html b/desktop/coverage/src/store/meshStore.ts.html new file mode 100644 index 0000000..d0a50e2 --- /dev/null +++ b/desktop/coverage/src/store/meshStore.ts.html @@ -0,0 +1,568 @@ + + + + + + Code coverage report for src/store/meshStore.ts + + + + + + + + + +
+
+

All files / src/store meshStore.ts

+
+ +
+ 0% + Statements + 0/92 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/92 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Mesh Store - State management for Adaptive Intelligence Mesh
+ *
+ * Manages workflow recommendations and behavior patterns.
+ */
+ 
+import { create } from 'zustand';
+import { invoke } from '@tauri-apps/api/core';
+import type {
+  WorkflowRecommendation,
+  BehaviorPattern,
+  MeshConfig,
+  MeshAnalysisResult,
+  PatternContext,
+  ActivityType,
+} from '../lib/intelligence-client';
+ 
+// === Types ===
+ 
+export interface MeshState {
+  // State
+  recommendations: WorkflowRecommendation[];
+  patterns: BehaviorPattern[];
+  config: MeshConfig;
+  isLoading: boolean;
+  error: string | null;
+  lastAnalysis: string | null;
+ 
+  // Actions
+  analyze: () => Promise<void>;
+  acceptRecommendation: (recommendationId: string) => Promise<void>;
+  dismissRecommendation: (recommendationId: string) => Promise<void>;
+  recordActivity: (activity: ActivityType, context: PatternContext) => Promise<void>;
+  getPatterns: () => Promise<void>;
+  updateConfig: (config: Partial<MeshConfig>) => Promise<void>;
+  decayPatterns: () => Promise<void>;
+  clearError: () => void;
+}
+ 
+// === Store ===
+ 
+export const useMeshStore = create<MeshState>((set, get) => ({
+  // Initial state
+  recommendations: [],
+  patterns: [],
+  config: {
+    enabled: true,
+    min_confidence: 0.6,
+    max_recommendations: 5,
+    analysis_window_hours: 24,
+  },
+  isLoading: false,
+  error: null,
+  lastAnalysis: null,
+ 
+  // Actions
+  analyze: async () => {
+    set({ isLoading: true, error: null });
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      const result = await invoke<MeshAnalysisResult>('mesh_analyze', { agentId });
+ 
+      set({
+        recommendations: result.recommendations,
+        patterns: [], // Will be populated by getPatterns
+        lastAnalysis: result.timestamp,
+        isLoading: false,
+      });
+ 
+      // Also fetch patterns
+      await get().getPatterns();
+    } catch (err) {
+      set({
+        error: err instanceof Error ? err.message : String(err),
+        isLoading: false,
+      });
+    }
+  },
+ 
+  acceptRecommendation: async (recommendationId: string) => {
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      await invoke('mesh_accept_recommendation', { agentId, recommendationId });
+ 
+      // Remove from local state
+      set((state) => ({
+        recommendations: state.recommendations.filter((r) => r.id !== recommendationId),
+      }));
+    } catch (err) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+    }
+  },
+ 
+  dismissRecommendation: async (recommendationId: string) => {
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      await invoke('mesh_dismiss_recommendation', { agentId, recommendationId });
+ 
+      // Remove from local state
+      set((state) => ({
+        recommendations: state.recommendations.filter((r) => r.id !== recommendationId),
+      }));
+    } catch (err) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+    }
+  },
+ 
+  recordActivity: async (activity: ActivityType, context: PatternContext) => {
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      await invoke('mesh_record_activity', { agentId, activityType: activity, context });
+    } catch (err) {
+      console.error('Failed to record activity:', err);
+    }
+  },
+ 
+  getPatterns: async () => {
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      const patterns = await invoke<BehaviorPattern[]>('mesh_get_patterns', { agentId });
+      set({ patterns });
+    } catch (err) {
+      console.error('Failed to get patterns:', err);
+    }
+  },
+ 
+  updateConfig: async (config: Partial<MeshConfig>) => {
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      const newConfig = { ...get().config, ...config };
+      await invoke('mesh_update_config', { agentId, config: newConfig });
+      set({ config: newConfig });
+    } catch (err) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+    }
+  },
+ 
+  decayPatterns: async () => {
+    try {
+      const agentId = localStorage.getItem('currentAgentId') || 'default';
+      await invoke('mesh_decay_patterns', { agentId });
+      // Refresh patterns after decay
+      await get().getPatterns();
+    } catch (err) {
+      console.error('Failed to decay patterns:', err);
+    }
+  },
+ 
+  clearError: () => set({ error: null }),
+}));
+ 
+// === Types for intelligence-client ===
+ 
+export type {
+  WorkflowRecommendation,
+  BehaviorPattern,
+  MeshConfig,
+  MeshAnalysisResult,
+  PatternContext,
+  ActivityType,
+};
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/offlineStore.ts.html b/desktop/coverage/src/store/offlineStore.ts.html new file mode 100644 index 0000000..1cf548f --- /dev/null +++ b/desktop/coverage/src/store/offlineStore.ts.html @@ -0,0 +1,1159 @@ + + + + + + Code coverage report for src/store/offlineStore.ts + + + + + + + + + +
+
+

All files / src/store offlineStore.ts

+
+ +
+ 19.35% + Statements + 42/217 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 10% + Functions + 2/20 +
+ + +
+ 19.35% + Lines + 42/217 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +3591x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x + 
/**
+ * Offline Store
+ *
+ * Manages offline state, message queue, and reconnection logic.
+ * Provides graceful degradation when backend is unavailable.
+ */
+ 
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import { useConnectionStore, getConnectionState } from './connectionStore';
+ 
+// === Types ===
+ 
+export interface QueuedMessage {
+  id: string;
+  content: string;
+  agentId?: string;
+  sessionKey?: string;
+  timestamp: number;
+  retryCount: number;
+  lastError?: string;
+  status: 'pending' | 'sending' | 'failed' | 'sent';
+}
+ 
+export interface OfflineState {
+  isOffline: boolean;
+  isReconnecting: boolean;
+  reconnectAttempt: number;
+  nextReconnectDelay: number;
+  lastOnlineTime: number | null;
+  queuedMessages: QueuedMessage[];
+  maxRetryCount: number;
+  maxQueueSize: number;
+}
+ 
+export interface OfflineActions {
+  // State management
+  setOffline: (offline: boolean) => void;
+  setReconnecting: (reconnecting: boolean, attempt?: number) => void;
+ 
+  // Message queue operations
+  queueMessage: (content: string, agentId?: string, sessionKey?: string) => string;
+  updateMessageStatus: (id: string, status: QueuedMessage['status'], error?: string) => void;
+  removeMessage: (id: string) => void;
+  clearQueue: () => void;
+  retryAllMessages: () => Promise<void>;
+ 
+  // Reconnection
+  scheduleReconnect: () => void;
+  cancelReconnect: () => void;
+  attemptReconnect: () => Promise<boolean>;
+ 
+  // Getters
+  getPendingMessages: () => QueuedMessage[];
+  hasPendingMessages: () => boolean;
+}
+ 
+export type OfflineStore = OfflineState & OfflineActions;
+ 
+// === Constants ===
+ 
+const INITIAL_RECONNECT_DELAY = 1000; // 1 second
+const MAX_RECONNECT_DELAY = 60000; // 60 seconds
+const RECONNECT_BACKOFF_FACTOR = 1.5;
+const MAX_RETRY_COUNT = 5;
+const MAX_QUEUE_SIZE = 100;
+ 
+// === Helper Functions ===
+ 
+function calculateNextDelay(currentDelay: number): number {
+  return Math.min(
+    currentDelay * RECONNECT_BACKOFF_FACTOR,
+    MAX_RECONNECT_DELAY
+  );
+}
+ 
+function generateMessageId(): string {
+  return `queued_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
+}
+ 
+// === Store Implementation ===
+ 
+let reconnectTimer: ReturnType<typeof setTimeout> | null = null;
+let healthCheckInterval: ReturnType<typeof setInterval> | null = null;
+ 
+export const useOfflineStore = create<OfflineStore>()(
+  persist(
+    (set, get) => ({
+      // === Initial State ===
+      isOffline: false,
+      isReconnecting: false,
+      reconnectAttempt: 0,
+      nextReconnectDelay: INITIAL_RECONNECT_DELAY,
+      lastOnlineTime: null,
+      queuedMessages: [],
+      maxRetryCount: MAX_RETRY_COUNT,
+      maxQueueSize: MAX_QUEUE_SIZE,
+ 
+      // === State Management ===
+ 
+      setOffline: (offline: boolean) => {
+        const wasOffline = get().isOffline;
+        set({
+          isOffline: offline,
+          lastOnlineTime: offline ? get().lastOnlineTime : Date.now(),
+        });
+ 
+        // Start reconnect process when going offline
+        if (offline && !wasOffline) {
+          get().scheduleReconnect();
+        } else if (!offline && wasOffline) {
+          // Back online - try to send queued messages
+          get().cancelReconnect();
+          set({ reconnectAttempt: 0, nextReconnectDelay: INITIAL_RECONNECT_DELAY });
+          get().retryAllMessages();
+        }
+      },
+ 
+      setReconnecting: (reconnecting: boolean, attempt?: number) => {
+        set({
+          isReconnecting: reconnecting,
+          reconnectAttempt: attempt ?? get().reconnectAttempt,
+        });
+      },
+ 
+      // === Message Queue Operations ===
+ 
+      queueMessage: (content: string, agentId?: string, sessionKey?: string) => {
+        const state = get();
+ 
+        // Check queue size limit
+        if (state.queuedMessages.length >= state.maxQueueSize) {
+          // Remove oldest pending message
+          const filtered = state.queuedMessages.filter((m, i) =>
+            i > 0 || m.status !== 'pending'
+          );
+          set({ queuedMessages: filtered });
+        }
+ 
+        const id = generateMessageId();
+        const message: QueuedMessage = {
+          id,
+          content,
+          agentId,
+          sessionKey,
+          timestamp: Date.now(),
+          retryCount: 0,
+          status: 'pending',
+        };
+ 
+        set((s) => ({
+          queuedMessages: [...s.queuedMessages, message],
+        }));
+ 
+        console.log(`[OfflineStore] Message queued: ${id}`);
+        return id;
+      },
+ 
+      updateMessageStatus: (id: string, status: QueuedMessage['status'], error?: string) => {
+        set((s) => ({
+          queuedMessages: s.queuedMessages.map((m) =>
+            m.id === id
+              ? {
+                  ...m,
+                  status,
+                  lastError: error,
+                  retryCount: status === 'failed' ? m.retryCount + 1 : m.retryCount,
+                }
+              : m
+          ),
+        }));
+      },
+ 
+      removeMessage: (id: string) => {
+        set((s) => ({
+          queuedMessages: s.queuedMessages.filter((m) => m.id !== id),
+        }));
+      },
+ 
+      clearQueue: () => {
+        set({ queuedMessages: [] });
+      },
+ 
+      retryAllMessages: async () => {
+        const state = get();
+        const pending = state.queuedMessages.filter(
+          (m) => m.status === 'pending' || m.status === 'failed'
+        );
+ 
+        if (pending.length === 0) return;
+ 
+        // Check if connected
+        if (getConnectionState() !== 'connected') {
+          console.log('[OfflineStore] Not connected, cannot retry messages');
+          return;
+        }
+ 
+        console.log(`[OfflineStore] Retrying ${pending.length} queued messages`);
+ 
+        for (const msg of pending) {
+          if (msg.retryCount >= state.maxRetryCount) {
+            console.log(`[OfflineStore] Message ${msg.id} exceeded max retries`);
+            get().updateMessageStatus(msg.id, 'failed', 'Max retry count exceeded');
+            continue;
+          }
+ 
+          get().updateMessageStatus(msg.id, 'sending');
+ 
+          try {
+            // Use connected client from connectionStore (supports both GatewayClient and KernelClient)
+            const { getClient } = await import('./connectionStore');
+            const client = getClient();
+ 
+            await client.chat(msg.content, {
+              sessionKey: msg.sessionKey,
+              agentId: msg.agentId,
+            });
+ 
+            get().updateMessageStatus(msg.id, 'sent');
+            // Remove sent message after a short delay
+            setTimeout(() => get().removeMessage(msg.id), 1000);
+            console.log(`[OfflineStore] Message ${msg.id} sent successfully`);
+          } catch (err) {
+            const errorMessage = err instanceof Error ? err.message : 'Send failed';
+            get().updateMessageStatus(msg.id, 'failed', errorMessage);
+            console.warn(`[OfflineStore] Message ${msg.id} failed:`, errorMessage);
+          }
+        }
+      },
+ 
+      // === Reconnection ===
+ 
+      scheduleReconnect: () => {
+        const state = get();
+ 
+        // Don't schedule if already online
+        if (!state.isOffline) return;
+ 
+        // Cancel any existing timer
+        get().cancelReconnect();
+ 
+        const attempt = state.reconnectAttempt + 1;
+        const delay = state.nextReconnectDelay;
+ 
+        console.log(`[OfflineStore] Scheduling reconnect attempt ${attempt} in ${delay}ms`);
+ 
+        set({
+          isReconnecting: true,
+          reconnectAttempt: attempt,
+          nextReconnectDelay: calculateNextDelay(delay),
+        });
+ 
+        reconnectTimer = setTimeout(() => {
+          get().attemptReconnect();
+        }, delay);
+      },
+ 
+      cancelReconnect: () => {
+        if (reconnectTimer) {
+          clearTimeout(reconnectTimer);
+          reconnectTimer = null;
+        }
+        set({ isReconnecting: false });
+      },
+ 
+      attemptReconnect: async () => {
+        console.log('[OfflineStore] Attempting to reconnect...');
+ 
+        try {
+          // Try to connect via connection store
+          await useConnectionStore.getState().connect();
+ 
+          // Check if now connected
+          if (getConnectionState() === 'connected') {
+            console.log('[OfflineStore] Reconnection successful');
+            get().setOffline(false);
+            return true;
+          }
+        } catch (err) {
+          console.warn('[OfflineStore] Reconnection failed:', err);
+        }
+ 
+        // Still offline, schedule next attempt
+        get().setReconnecting(false);
+        get().scheduleReconnect();
+        return false;
+      },
+ 
+      // === Getters ===
+ 
+      getPendingMessages: () => {
+        return get().queuedMessages.filter(
+          (m) => m.status === 'pending' || m.status === 'failed'
+        );
+      },
+ 
+      hasPendingMessages: () => {
+        return get().queuedMessages.some(
+          (m) => m.status === 'pending' || m.status === 'failed'
+        );
+      },
+    }),
+    {
+      name: 'zclaw-offline-storage',
+      partialize: (state) => ({
+        queuedMessages: state.queuedMessages.filter(
+          (m) => m.status === 'pending' || m.status === 'failed'
+        ),
+        lastOnlineTime: state.lastOnlineTime,
+      }),
+    }
+  )
+);
+ 
+// === Connection State Monitor ===
+ 
+/**
+ * Start monitoring connection state and update offline store accordingly.
+ * Should be called once during app initialization.
+ */
+export function startOfflineMonitor(): () => void {
+  const checkConnection = () => {
+    const connectionState = getConnectionState();
+    const isOffline = connectionState !== 'connected';
+ 
+    if (isOffline !== useOfflineStore.getState().isOffline) {
+      useOfflineStore.getState().setOffline(isOffline);
+    }
+  };
+ 
+  // Initial check
+  checkConnection();
+ 
+  // Subscribe to connection state changes
+  const unsubscribe = useConnectionStore.subscribe((state, prevState) => {
+    if (state.connectionState !== prevState.connectionState) {
+      const isOffline = state.connectionState !== 'connected';
+      useOfflineStore.getState().setOffline(isOffline);
+    }
+  });
+ 
+  // Periodic health check (every 30 seconds)
+  healthCheckInterval = setInterval(checkConnection, 30000);
+ 
+  return () => {
+    unsubscribe();
+    if (healthCheckInterval) {
+      clearInterval(healthCheckInterval);
+      healthCheckInterval = null;
+    }
+  };
+}
+ 
+// === Exported Accessors ===
+ 
+export const isOffline = () => useOfflineStore.getState().isOffline;
+export const getQueuedMessages = () => useOfflineStore.getState().queuedMessages;
+export const hasPendingMessages = () => useOfflineStore.getState().hasPendingMessages();
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/personaStore.ts.html b/desktop/coverage/src/store/personaStore.ts.html new file mode 100644 index 0000000..fb11d39 --- /dev/null +++ b/desktop/coverage/src/store/personaStore.ts.html @@ -0,0 +1,670 @@ + + + + + + Code coverage report for src/store/personaStore.ts + + + + + + + + + +
+
+

All files / src/store personaStore.ts

+
+ +
+ 0% + Statements + 0/113 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/113 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Persona Evolution Store
+ *
+ * Manages persona evolution state and proposals.
+ */
+ 
+import { create } from 'zustand';
+import { invoke } from '@tauri-apps/api/core';
+import type {
+  EvolutionResult,
+  EvolutionProposal,
+  PersonaEvolverConfig,
+  PersonaEvolverState,
+  MemoryEntryForAnalysis,
+} from '../lib/intelligence-client';
+ 
+export interface PersonaEvolutionStore {
+  // State
+  currentAgentId: string;
+  proposals: EvolutionProposal[];
+  history: EvolutionResult[];
+  isLoading: boolean;
+  error: string | null;
+  config: PersonaEvolverConfig | null;
+  state: PersonaEvolverState | null;
+  showProposalsPanel: boolean;
+ 
+  // Actions
+  setCurrentAgentId: (agentId: string) => void;
+  setShowProposalsPanel: (show: boolean) => void;
+ 
+  // Evolution Actions
+  runEvolution: (memories: MemoryEntryForAnalysis[]) => Promise<EvolutionResult | null>;
+  loadEvolutionHistory: (limit?: number) => Promise<void>;
+  loadEvolverState: () => Promise<void>;
+  loadEvolverConfig: () => Promise<void>;
+  updateConfig: (config: Partial<PersonaEvolverConfig>) => Promise<void>;
+ 
+  // Proposal Actions
+  getPendingProposals: () => EvolutionProposal[];
+  applyProposal: (proposal: EvolutionProposal) => Promise<boolean>;
+  dismissProposal: (proposalId: string) => void;
+  clearProposals: () => void;
+}
+ 
+export const usePersonaEvolutionStore = create<PersonaEvolutionStore>((set, get) => ({
+  // Initial State
+  currentAgentId: '',
+  proposals: [],
+  history: [],
+  isLoading: false,
+  error: null,
+  config: null,
+  state: null,
+  showProposalsPanel: false,
+ 
+  // Setters
+  setCurrentAgentId: (agentId: string) => set({ currentAgentId: agentId }),
+  setShowProposalsPanel: (show: boolean) => set({ showProposalsPanel: show }),
+ 
+  // Run evolution cycle for current agent
+  runEvolution: async (memories: MemoryEntryForAnalysis[]) => {
+    const { currentAgentId } = get();
+    if (!currentAgentId) {
+      set({ error: 'No agent selected' });
+      return null;
+    }
+ 
+    set({ isLoading: true, error: null });
+ 
+    try {
+      const result = await invoke<EvolutionResult>('persona_evolve', {
+        agentId: currentAgentId,
+        memories,
+      });
+ 
+      // Update state with results
+      set((state) => ({
+        history: [result, ...state.history].slice(0, 20),
+        proposals: [...result.proposals, ...state.proposals],
+        isLoading: false,
+        showProposalsPanel: result.proposals.length > 0,
+      }));
+ 
+      return result;
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      set({ error: errorMsg, isLoading: false });
+      return null;
+    }
+  },
+ 
+  // Load evolution history
+  loadEvolutionHistory: async (limit = 10) => {
+    set({ isLoading: true, error: null });
+ 
+    try {
+      const history = await invoke<EvolutionResult[]>('persona_evolution_history', {
+        limit,
+      });
+      set({ history, isLoading: false });
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      set({ error: errorMsg, isLoading: false });
+    }
+  },
+ 
+  // Load evolver state
+  loadEvolverState: async () => {
+    try {
+      const state = await invoke<PersonaEvolverState>('persona_evolver_state');
+      set({ state });
+    } catch (err) {
+      console.error('[PersonaStore] Failed to load evolver state:', err);
+    }
+  },
+ 
+  // Load evolver config
+  loadEvolverConfig: async () => {
+    try {
+      const config = await invoke<PersonaEvolverConfig>('persona_evolver_config');
+      set({ config });
+    } catch (err) {
+      console.error('[PersonaStore] Failed to load evolver config:', err);
+    }
+  },
+ 
+  // Update evolver config
+  updateConfig: async (newConfig: Partial<PersonaEvolverConfig>) => {
+    const { config } = get();
+    if (!config) return;
+ 
+    const updatedConfig = { ...config, ...newConfig };
+ 
+    try {
+      await invoke('persona_evolver_update_config', { config: updatedConfig });
+      set({ config: updatedConfig });
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      set({ error: errorMsg });
+    }
+  },
+ 
+  // Get pending proposals sorted by confidence
+  getPendingProposals: () => {
+    const { proposals } = get();
+    return proposals
+      .filter((p) => p.status === 'pending')
+      .sort((a, b) => b.confidence - a.confidence);
+  },
+ 
+  // Apply a proposal (approve)
+  applyProposal: async (proposal: EvolutionProposal) => {
+    set({ isLoading: true, error: null });
+ 
+    try {
+      await invoke('persona_apply_proposal', { proposal });
+ 
+      // Remove from pending list
+      set((state) => ({
+        proposals: state.proposals.filter((p) => p.id !== proposal.id),
+        isLoading: false,
+      }));
+ 
+      return true;
+    } catch (err) {
+      const errorMsg = err instanceof Error ? err.message : String(err);
+      set({ error: errorMsg, isLoading: false });
+      return false;
+    }
+  },
+ 
+  // Dismiss a proposal (reject)
+  dismissProposal: (proposalId: string) => {
+    set((state) => ({
+      proposals: state.proposals.filter((p) => p.id !== proposalId),
+    }));
+  },
+ 
+  // Clear all proposals
+  clearProposals: () => set({ proposals: [] }),
+}));
+ 
+// Export convenience hooks
+export const usePendingProposals = () =>
+  usePersonaEvolutionStore((state) => state.getPendingProposals());
+ 
+export const useEvolutionHistory = () =>
+  usePersonaEvolutionStore((state) => state.history);
+ 
+export const useEvolverConfig = () =>
+  usePersonaEvolutionStore((state) => state.config);
+ 
+export const useEvolverState = () =>
+  usePersonaEvolutionStore((state) => state.state);
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/securityStore.ts.html b/desktop/coverage/src/store/securityStore.ts.html new file mode 100644 index 0000000..1b3a6b3 --- /dev/null +++ b/desktop/coverage/src/store/securityStore.ts.html @@ -0,0 +1,508 @@ + + + + + + Code coverage report for src/store/securityStore.ts + + + + + + + + + +
+
+

All files / src/store securityStore.ts

+
+ +
+ 0% + Statements + 0/67 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * securityStore.ts - Security Status and Audit Log Management
+ *
+ * Extracted from gatewayStore.ts for Store Refactoring.
+ * Manages OpenFang security layers, security status, and audit logs.
+ */
+import { create } from 'zustand';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Types ===
+ 
+export interface SecurityLayer {
+  name: string;
+  enabled: boolean;
+  description?: string;
+}
+ 
+export interface SecurityStatus {
+  layers: SecurityLayer[];
+  enabledCount: number;
+  totalCount: number;
+  securityLevel: 'critical' | 'high' | 'medium' | 'low';
+}
+ 
+export interface AuditLogEntry {
+  id: string;
+  timestamp: string;
+  action: string;
+  actor?: string;
+  result?: 'success' | 'failure';
+  details?: Record<string, unknown>;
+  // Merkle hash chain fields (OpenFang)
+  hash?: string;
+  previousHash?: string;
+}
+ 
+// === Helpers ===
+ 
+function calculateSecurityLevel(enabledCount: number, totalCount: number): 'critical' | 'high' | 'medium' | 'low' {
+  if (totalCount === 0) return 'low';
+  const ratio = enabledCount / totalCount;
+  if (ratio >= 0.875) return 'critical'; // 14-16 layers
+  if (ratio >= 0.625) return 'high';     // 10-13 layers
+  if (ratio >= 0.375) return 'medium';   // 6-9 layers
+  return 'low';                          // 0-5 layers
+}
+ 
+// === Client Interface ===
+ 
+interface SecurityClient {
+  getSecurityStatus(): Promise<{ layers?: SecurityLayer[] } | null>;
+  getAuditLogs(opts?: { limit?: number; offset?: number }): Promise<{ logs?: AuditLogEntry[] } | null>;
+}
+ 
+// === Store Interface ===
+ 
+export interface SecurityStateSlice {
+  securityStatus: SecurityStatus | null;
+  securityStatusLoading: boolean;
+  securityStatusError: string | null;
+  auditLogs: AuditLogEntry[];
+  auditLogsLoading: boolean;
+}
+ 
+export interface SecurityActionsSlice {
+  loadSecurityStatus: () => Promise<void>;
+  loadAuditLogs: (opts?: { limit?: number; offset?: number }) => Promise<void>;
+}
+ 
+export type SecurityStore = SecurityStateSlice & SecurityActionsSlice & { client: SecurityClient | null };
+ 
+// === Store Implementation ===
+ 
+export const useSecurityStore = create<SecurityStore>((set, get) => ({
+  // Initial state
+  securityStatus: null,
+  securityStatusLoading: false,
+  securityStatusError: null,
+  auditLogs: [],
+  auditLogsLoading: false,
+  client: null,
+ 
+  loadSecurityStatus: async () => {
+    const client = get().client;
+    if (!client) return;
+ 
+    set({ securityStatusLoading: true, securityStatusError: null });
+    try {
+      const result = await client.getSecurityStatus();
+      if (result?.layers) {
+        const layers = result.layers as SecurityLayer[];
+        const enabledCount = layers.filter(l => l.enabled).length;
+        const totalCount = layers.length;
+        const securityLevel = calculateSecurityLevel(enabledCount, totalCount);
+        set({
+          securityStatus: { layers, enabledCount, totalCount, securityLevel },
+          securityStatusLoading: false,
+          securityStatusError: null,
+        });
+      } else {
+        set({
+          securityStatusLoading: false,
+          securityStatusError: 'API returned no data',
+        });
+      }
+    } catch (err: unknown) {
+      set({
+        securityStatusLoading: false,
+        securityStatusError: (err instanceof Error ? err.message : String(err)) || 'Security API not available',
+      });
+    }
+  },
+ 
+  loadAuditLogs: async (opts?: { limit?: number; offset?: number }) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    set({ auditLogsLoading: true });
+    try {
+      const result = await client.getAuditLogs(opts);
+      set({ auditLogs: (result?.logs || []) as AuditLogEntry[], auditLogsLoading: false });
+    } catch {
+      set({ auditLogsLoading: false });
+      /* ignore if audit API not available */
+    }
+  },
+}));
+ 
+// === Client Injection ===
+ 
+function createSecurityClientFromGateway(client: GatewayClient): SecurityClient {
+  return {
+    getSecurityStatus: () => client.getSecurityStatus() as Promise<{ layers?: SecurityLayer[] } | null>,
+    getAuditLogs: (opts) => client.getAuditLogs(opts) as Promise<{ logs?: AuditLogEntry[] } | null>,
+  };
+}
+ 
+export function setSecurityStoreClient(client: unknown): void {
+  const securityClient = createSecurityClientFromGateway(client as GatewayClient);
+  useSecurityStore.setState({ client: securityClient });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/sessionStore.ts.html b/desktop/coverage/src/store/sessionStore.ts.html new file mode 100644 index 0000000..e5387dd --- /dev/null +++ b/desktop/coverage/src/store/sessionStore.ts.html @@ -0,0 +1,769 @@ + + + + + + Code coverage report for src/store/sessionStore.ts + + + + + + + + + +
+
+

All files / src/store sessionStore.ts

+
+ +
+ 0% + Statements + 0/122 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/122 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * sessionStore.ts - Session Management Store
+ *
+ * Extracted from gatewayStore.ts for Store Refactoring.
+ * Manages Gateway sessions and session messages.
+ */
+import { create } from 'zustand';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Types ===
+ 
+export interface Session {
+  id: string;
+  agentId: string;
+  createdAt: string;
+  updatedAt?: string;
+  messageCount?: number;
+  status?: 'active' | 'archived' | 'expired';
+  metadata?: Record<string, unknown>;
+}
+ 
+export interface SessionMessage {
+  id: string;
+  role: 'user' | 'assistant' | 'system';
+  content: string;
+  createdAt: string;
+  tokens?: { input?: number; output?: number };
+}
+ 
+// === Raw API Response Types ===
+ 
+interface RawSession {
+  id?: string;
+  sessionId?: string;
+  session_id?: string;
+  agentId?: string;
+  agent_id?: string;
+  model?: string;
+  status?: string;
+  createdAt?: string;
+  created_at?: string;
+  updatedAt?: string;
+  updated_at?: string;
+  messageCount?: number;
+  message_count?: number;
+  metadata?: Record<string, unknown>;
+}
+ 
+interface RawSessionMessage {
+  id?: string;
+  messageId?: string;
+  message_id?: string;
+  role?: string;
+  content?: string;
+  createdAt?: string;
+  created_at?: string;
+  metadata?: Record<string, unknown>;
+  tokens?: { input?: number; output?: number };
+}
+ 
+// === Client Interface ===
+ 
+interface SessionClient {
+  listSessions(opts?: { limit?: number; offset?: number }): Promise<{ sessions?: RawSession[] } | null>;
+  getSession(sessionId: string): Promise<Record<string, unknown> | null>;
+  createSession(params: { agent_id: string; metadata?: Record<string, unknown> }): Promise<Record<string, unknown> | null>;
+  deleteSession(sessionId: string): Promise<void>;
+  getSessionMessages(sessionId: string, opts?: { limit?: number; offset?: number }): Promise<{ messages?: RawSessionMessage[] } | null>;
+}
+ 
+// === Store Interface ===
+ 
+export interface SessionStateSlice {
+  sessions: Session[];
+  sessionMessages: Record<string, SessionMessage[]>;
+  isLoading: boolean;
+  error: string | null;
+}
+ 
+export interface SessionActionsSlice {
+  loadSessions: (opts?: { limit?: number; offset?: number }) => Promise<void>;
+  getSession: (sessionId: string) => Promise<Session | undefined>;
+  createSession: (agentId: string, metadata?: Record<string, unknown>) => Promise<Session | undefined>;
+  deleteSession: (sessionId: string) => Promise<void>;
+  loadSessionMessages: (sessionId: string, opts?: { limit?: number; offset?: number }) => Promise<SessionMessage[]>;
+}
+ 
+export type SessionStore = SessionStateSlice & SessionActionsSlice & { client: SessionClient | null };
+ 
+// === Store Implementation ===
+ 
+export const useSessionStore = create<SessionStore>((set, get) => ({
+  // Initial state
+  sessions: [],
+  sessionMessages: {},
+  isLoading: false,
+  error: null,
+  client: null,
+ 
+  loadSessions: async (opts?: { limit?: number; offset?: number }) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      const result = await client.listSessions(opts);
+      const sessions: Session[] = (result?.sessions || [])
+        .filter((s: RawSession) => s.id || s.session_id)
+        .map((s: RawSession) => ({
+          id: s.id || s.session_id || '',
+          agentId: s.agent_id || s.agentId || '',
+          createdAt: s.created_at || s.createdAt || new Date().toISOString(),
+          updatedAt: s.updated_at || s.updatedAt,
+          messageCount: s.message_count || s.messageCount,
+          status: s.status as Session['status'],
+          metadata: s.metadata,
+        }));
+      set({ sessions });
+    } catch {
+      /* ignore if sessions API not available */
+    }
+  },
+ 
+  getSession: async (sessionId: string) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.getSession(sessionId);
+      if (!result) return undefined;
+      const session: Session = {
+        id: result.id as string,
+        agentId: result.agent_id as string,
+        createdAt: result.created_at as string,
+        updatedAt: result.updated_at as string | undefined,
+        messageCount: result.message_count as number | undefined,
+        status: result.status as Session['status'],
+        metadata: result.metadata as Record<string, unknown> | undefined,
+      };
+      set(state => ({
+        sessions: state.sessions.some(s => s.id === sessionId)
+          ? state.sessions.map(s => s.id === sessionId ? session : s)
+          : [...state.sessions, session],
+      }));
+      return session;
+    } catch {
+      return undefined;
+    }
+  },
+ 
+  createSession: async (agentId: string, metadata?: Record<string, unknown>) => {
+    const client = get().client;
+    if (!client) return undefined;
+ 
+    try {
+      const result = await client.createSession({ agent_id: agentId, metadata });
+      if (!result) return undefined;
+      const session: Session = {
+        id: result.id as string,
+        agentId: result.agent_id as string,
+        createdAt: result.created_at as string,
+        status: 'active',
+        metadata,
+      };
+      set(state => ({ sessions: [...state.sessions, session] }));
+      return session;
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      return undefined;
+    }
+  },
+ 
+  deleteSession: async (sessionId: string) => {
+    const client = get().client;
+    if (!client) return;
+ 
+    try {
+      await client.deleteSession(sessionId);
+      set(state => ({
+        sessions: state.sessions.filter(s => s.id !== sessionId),
+        sessionMessages: Object.fromEntries(
+          Object.entries(state.sessionMessages).filter(([id]) => id !== sessionId)
+        ),
+      }));
+    } catch (err: unknown) {
+      set({ error: err instanceof Error ? err.message : String(err) });
+      throw err;
+    }
+  },
+ 
+  loadSessionMessages: async (sessionId: string, opts?: { limit?: number; offset?: number }) => {
+    const client = get().client;
+    if (!client) return [];
+ 
+    try {
+      const result = await client.getSessionMessages(sessionId, opts);
+      const messages: SessionMessage[] = (result?.messages || []).map((m: RawSessionMessage) => ({
+        id: m.id || m.message_id || '',
+        role: (m.role || 'user') as 'user' | 'assistant' | 'system',
+        content: m.content || '',
+        createdAt: m.created_at || m.createdAt || new Date().toISOString(),
+        tokens: m.tokens,
+      }));
+      set(state => ({
+        sessionMessages: { ...state.sessionMessages, [sessionId]: messages },
+      }));
+      return messages;
+    } catch {
+      return [];
+    }
+  },
+}));
+ 
+// === Client Injection ===
+ 
+function createSessionClientFromGateway(client: GatewayClient): SessionClient {
+  return {
+    listSessions: (opts) => client.listSessions(opts),
+    getSession: (sessionId) => client.getSession(sessionId),
+    createSession: (params) => client.createSession(params),
+    deleteSession: async (sessionId) => { await client.deleteSession(sessionId); },
+    getSessionMessages: (sessionId, opts) => client.getSessionMessages(sessionId, opts),
+  };
+}
+ 
+export function setSessionStoreClient(client: unknown): void {
+  const sessionClient = createSessionClientFromGateway(client as GatewayClient);
+  useSessionStore.setState({ client: sessionClient });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/skillMarketStore.ts.html b/desktop/coverage/src/store/skillMarketStore.ts.html new file mode 100644 index 0000000..a4434b0 --- /dev/null +++ b/desktop/coverage/src/store/skillMarketStore.ts.html @@ -0,0 +1,1165 @@ + + + + + + Code coverage report for src/store/skillMarketStore.ts + + + + + + + + + +
+
+

All files / src/store skillMarketStore.ts

+
+ +
+ 0% + Statements + 0/360 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/360 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * * skillMarketStore.ts - 技能市场状态管理
+ *
+ * * 猛攻状态管理技能浏览、搜索、安装/卸载等功能
+ */
+
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import type { Skill, SkillReview, SkillMarketState } from '../types/skill-market';
+
+// === 存储键 ===
+const STORAGE_KEY = 'zclaw-skill-market';
+const INSTALLED_KEY = 'zclaw-installed-skills';
+
+// === 默认状态 ===
+const initialState: SkillMarketState = {
+  skills: [],
+  installedSkills: [],
+  searchResults: [],
+  selectedSkill: null,
+  searchQuery: '',
+  categoryFilter: 'all',
+  isLoading: false,
+  error: null,
+};
+
+// === Store 定义 ===
+interface SkillMarketActions {
+  // 技能加载
+  loadSkills: () => Promise<void>;
+  // 技能搜索
+  searchSkills: (query: string) => void;
+  // 分类过滤
+  filterByCategory: (category: string) => void;
+  // 选择技能
+  selectSkill: (skill: Skill | null) => void;
+  // 安装技能
+  installSkill: (skillId: string) => Promise<boolean>;
+  // 卸载技能
+  uninstallSkill: (skillId: string) => Promise<boolean>;
+  // 获取技能详情
+  getSkillDetails: (skillId: string) => Promise<Skill | null>;
+  // 加载评论
+  loadReviews: (skillId: string) => Promise<SkillReview[]>;
+  // 添加评论
+  addReview: (skillId: string, review: Omit<SkillReview, 'id' | 'skillId' | 'createdAt'>) => Promise<void>;
+  // 刷新技能列表
+  refreshSkills: () => Promise<void>;
+  // 清除错误
+  clearError: () => void;
+  // 重置状态
+  reset: () => void;
+}
+
+// === Store 创建 ===
+export const useSkillMarketStore = create<SkillMarketState & SkillMarketActions>()(
+  persist({
+    key: STORAGE_KEY,
+    storage: localStorage,
+    partialize: (state) => ({
+      installedSkills: state.installedSkills,
+      categoryFilter: state.categoryFilter,
+    }),
+  }),
+  initialState,
+  {
+    // === 技能加载 ===
+    loadSkills: async () => {
+      set({ isLoading: true, error: null });
+      try {
+        // 扫描 skills 目录获取可用技能
+        const skills = await scanSkillsDirectory();
+        // 从 localStorage 恢复安装状态
+        const stored = localStorage.getItem(INSTALLED_KEY);
+        const installedSkills: string[] = stored ? JSON.parse(stored) : [];
+        // 更新技能的安装状态
+        const updatedSkills = skills.map(skill => ({
+          ...skill,
+          installed: installedSkills.includes(skill.id),
+        })));
+        set({
+          skills: updatedSkills,
+          installedSkills,
+          isLoading: false,
+        });
+      } catch (err) {
+        set({
+          isLoading: false,
+          error: err instanceof Error ? err.message : '加载技能失败',
+        });
+      }
+    },
+    // === 技能搜索 ===
+    searchSkills: (query: string) => {
+      const { skills } = get();
+      set({ searchQuery: query });
+      if (!query.trim()) {
+        set({ searchResults: [] });
+        return;
+      }
+      const queryLower = query.toLowerCase();
+      const results = skills.filter(skill => {
+        return (
+          skill.name.toLowerCase().includes(queryLower) ||
+          skill.description.toLowerCase().includes(queryLower) ||
+          skill.triggers.some(t => t.toLowerCase().includes(queryLower)) ||
+          skill.capabilities.some(c => c.toLowerCase().includes(queryLower)) ||
+          skill.tags?.some(t => t.toLowerCase().includes(queryLower))
+        );
+      });
+      set({ searchResults: results });
+    },
+    // === 分类过滤 ===
+    filterByCategory: (category: string) => {
+      set({ categoryFilter: category });
+    },
+    // === 选择技能 ===
+    selectSkill: (skill: Skill | null) => {
+      set({ selectedSkill: skill });
+    },
+    // === 安装技能 ===
+    installSkill: async (skillId: string) => {
+      const { skills, installedSkills } = get();
+      const skill = skills.find(s => s.id === skillId);
+      if (!skill) return false;
+      try {
+        // 更新安装状态
+        const newInstalledSkills = [...installedSkills, skillId];
+        const updatedSkills = skills.map(s => ({
+          ...s,
+          installed: s.id === skillId ? true : s.installed,
+          installedAt: s.id === skillId ? new Date().toISOString() : s.installedAt,
+        }));
+        // 持久化安装列表
+        localStorage.setItem(INSTALLED_KEY, JSON.stringify(newInstalledSkills));
+        set({
+          skills: updatedSkills,
+          installedSkills: newInstalledSkills,
+        });
+        return true;
+      } catch (err) {
+        set({
+          error: err instanceof Error ? err.message : '安装技能失败',
+        });
+        return false;
+      }
+    },
+    // === 卸载技能 ===
+    uninstallSkill: async (skillId: string) => {
+      const { skills, installedSkills } = get();
+      try {
+        // 更新安装状态
+        const newInstalledSkills = installedSkills.filter(id => id !== skillId);
+        const updatedSkills = skills.map(s => ({
+          ...s,
+          installed: s.id === skillId ? false : s.installed,
+          installedAt: s.id === skillId ? undefined : s.installedAt,
+        }));
+        // 持久化安装列表
+        localStorage.setItem(INSTALLED_KEY, JSON.stringify(newInstalledSkills));
+        set({
+          skills: updatedSkills,
+          installedSkills: newInstalledSkills,
+        });
+        return true;
+      } catch (err) {
+        set({
+          error: err instanceof Error ? err.message : '卸载技能失败',
+        });
+        return false;
+      }
+    },
+    // === 获取技能详情 ===
+    getSkillDetails: async (skillId: string) => {
+      const { skills } = get();
+      return skills.find(s => s.id === skillId) || null;
+    },
+    // === 加载评论 ===
+    loadReviews: async (skillId: string) => {
+      // MVP: 从 localStorage 模拟加载评论
+      const reviewsKey = `zclaw-skill-reviews-${skillId}`;
+      const stored = localStorage.getItem(reviewsKey);
+      const reviews: SkillReview[] = stored ? JSON.parse(stored) : [];
+      return reviews;
+    },
+    // === 添加评论 ===
+    addReview: async (skillId: string, review: Omit<SkillReview, 'id' | 'skillId' | 'createdAt'>) => {
+      const reviews = await get().loadReviews(skillId);
+      const newReview: SkillReview = {
+        ...review,
+        id: `review-${Date.now()}`,
+        skillId,
+        createdAt: new Date().toISOString(),
+      };
+      const updatedReviews = [...reviews, newReview];
+      // 更新技能的评分和评论数
+      const { skills } = get();
+      const updatedSkills = skills.map(s => {
+        if (s.id === skillId) {
+          const totalRating = updatedReviews.reduce((sum, r) => sum + r.rating, 0);
+          const avgRating = totalRating / updatedReviews.length;
+          return {
+            ...s,
+            rating: Math.round(avgRating * 10) / 10,
+            reviewCount: updatedReviews.length,
+          };
+        }
+        return s;
+      });
+      // 持久化评论
+ const reviewsKey = `zclaw-skill-reviews-${skillId}`;
+      localStorage.setItem(reviewsKey, JSON.stringify(updatedReviews));
+      set({ skills: updatedSkills });
+    },
+    // === 刷新技能列表 ===
+    refreshSkills: async () => {
+      // 清除缓存并重新加载
+      localStorage.removeItem(STORAGE_KEY);
+      await get().loadSkills();
+    },
+    // === 清除错误 ===
+    clearError: () => {
+      set({ error: null });
+    },
+    // === 重置状态 ===
+    reset: () => {
+      localStorage.removeItem(STORAGE_KEY);
+      localStorage.removeItem(INSTALLED_KEY);
+      set(initialState);
+    },
+  }
+);
+
+// === 辅助函数 ===
+
+/**
+ * 扫描 skills 目录获取可用技能
+ * 从后端获取技能列表
+ */
+async function scanSkillsDirectory(): Promise<Skill[]> {
+  try {
+    // 动态导入 invoke 以避免循环依赖
+    const { invoke } = await import('@tauri-apps/api/core');
+
+    // 调用后端 skill_list 命令
+    interface BackendSkill {
+    id: string;
+    name: string;
+    description: string;
+    version: string;
+    capabilities: string[];
+    tags: string[];
+  mode: string;
+  enabled: boolean;
+    }
+
+    const backendSkills = await invoke<BackendSkill[]>('skill_list');
+
+    // 转换为前端 Skill 格式
+    const skills: Skill[] = backendSkills.map((s): Skill => ({
+      id: s.id,
+      name: s.name,
+      description: s.description,
+      triggers: s.tags, // 使用 tags 作为触发器
+      capabilities: s.capabilities,
+      toolDeps: [], // 后端暂不提供 toolDeps
+      category: 'discovered', // 后端发现的技能
+      installed: s.enabled,
+      tags: s.tags,
+    }));
+
+    return skills;
+  } catch (err) {
+    console.warn('[skillMarketStore] Failed to load skills from backend, using fallback:', err);
+    // 如果后端调用失败,返回空数组而不是模拟数据
+    return [];
+  }
+}
+      tags: ['文件', '目录', '读写'],
+    },
+    {
+      id: 'security-engineer',
+      name: '安全工程师',
+      description: '安全工程师 - 负责安全审计、漏洞检测、合规检查',
+      triggers: ['安全审计', '漏洞检测', '安全检查', 'security', '渗透测试'],
+      capabilities: ['漏洞扫描', '合规检查', '安全加固', '威胁建模'],
+      toolDeps: ['read', 'grep', 'shell'],
+      category: 'security',
+      installed: false,
+      tags: ['安全', '审计', '漏洞'],
+    },
+    {
+      id: 'ai-engineer',
+      name: 'AI 工程师',
+      description: 'AI/ML 工程师 - 专注机器学习模型开发、LLM 集成和生产系统部署',
+      triggers: ['AI工程师', '机器学习', 'ML模型', 'LLM集成', '深度学习', '模型训练'],
+      capabilities: ['ML 框架', 'LLM 集成', 'RAG 系统', '向量数据库'],
+      toolDeps: ['bash', 'read', 'write', 'grep', 'glob'],
+      category: 'development',
+      installed: false,
+      tags: ['AI', 'ML', 'LLM'],
+    },
+    {
+      id: 'senior-developer',
+      name: '高级开发',
+      description: '高级开发工程师 - 端到端功能实现、复杂问题解决',
+      triggers: ['高级开发', 'senior developer', '端到端', '复杂功能', '架构实现'],
+      capabilities: ['端到端实现', '架构设计', '性能优化', '代码重构'],
+      toolDeps: ['bash', 'read', 'write', 'grep', 'glob'],
+      category: 'development',
+      installed: false,
+      tags: ['开发', '架构', '实现'],
+    },
+    {
+      id: 'frontend-developer',
+      name: '前端开发',
+      description: '前端开发专家 - 擅长 React/Vue/CSS/TypeScript',
+      triggers: ['前端开发', '页面开发', 'UI开发', 'React', 'Vue', 'CSS'],
+      capabilities: ['组件开发', '样式调整', '性能优化', '响应式设计'],
+      toolDeps: ['read', 'write', 'shell'],
+      category: 'development',
+      installed: false,
+      types: ['前端', 'UI', '组件'],
+    },
+    {
+      id: 'backend-architect',
+      name: '后端架构',
+      description: '后端架构设计、API设计、数据库建模',
+      triggers: ['后端架构', 'API设计', '数据库设计', '系统架构', '微服务'],
+      capabilities: ['架构设计', 'API规范', '数据库建模', '性能优化'],
+      toolDeps: ['read', 'write', 'shell'],
+      category: 'development',
+      installed: false,
+      tags: ['后端', '架构', 'API'],
+    },
+    {
+      id: 'devops-automator',
+      name: 'DevOps 自动化',
+      description: 'CI/CD、Docker、K8s、自动化部署',
+      triggers: ['DevOps', 'CI/CD', 'Docker', '部署', '自动化', 'K8s'],
+      capabilities: ['CI/CD配置', '容器化', '自动化部署', '监控告警'],
+      toolDeps: ['shell', 'read', 'write'],
+      category: 'ops',
+      installed: false,
+      tags: ['DevOps', 'Docker', 'CI/CD'],
+    },
+    {
+      id: 'senior-pm',
+      name: '高级PM',
+      description: '项目管理、需求分析、迭代规划',
+      triggers: ['项目管理', '需求分析', '迭代规划', '产品设计', 'PRD'],
+      capabilities: ['需求拆解', '迭代排期', '风险评估', '文档撰写'],
+      toolDeps: ['read', 'write'],
+      category: 'management',
+      installed: false,
+      tags: ['PM', '需求', '迭代'],
+    },
+  ];
+  return skills;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/teamStore.ts.html b/desktop/coverage/src/store/teamStore.ts.html new file mode 100644 index 0000000..2cb721a --- /dev/null +++ b/desktop/coverage/src/store/teamStore.ts.html @@ -0,0 +1,1909 @@ + + + + + + Code coverage report for src/store/teamStore.ts + + + + + + + + + +
+
+

All files / src/store teamStore.ts

+
+ +
+ 70.22% + Statements + 316/450 +
+ + +
+ 70.1% + Branches + 68/97 +
+ + +
+ 78.26% + Functions + 18/23 +
+ + +
+ 70.22% + Lines + 316/450 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +6091x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +7x +7x +7x +  +7x +  +  +  +  +  +  +7x +  +7x +7x +  +7x +  +7x +7x +1x +6x +  +7x +  +7x +6x +1x +  +7x +7x +7x +7x +7x +7x +7x +7x +7x +  +  +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +8x +8x +8x +8x +7x +7x +7x +7x +7x +7x +7x +7x +7x +8x +  +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +8x +  +8x +8x +8x +8x +8x +  +8x +8x +  +  +  +8x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +  +1x +  +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +4x +4x +  +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +4x +4x +4x +4x +4x +  +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +4x +4x +  +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +  +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +2x +2x +2x +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +2x +2x +2x +2x +  +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +2x +  +1x +1x +1x +1x +  +1x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +2x +2x +2x +2x +  +1x +1x +1x +  +  +1x +1x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +36x +36x +36x +1x +1x + 
/**
+ * Team Store - Multi-Agent Team Collaboration State Management
+ *
+ * Manages team orchestration, task assignment, Dev↔QA loops,
+ * and real-time collaboration state.
+ *
+ * @module store/teamStore
+ */
+ 
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import type {
+  Team,
+  TeamMember,
+  TeamTask,
+  TeamTaskStatus,
+  TeamMemberRole,
+  DevQALoop,
+  DevQALoopState,
+  CreateTeamRequest,
+  AddTeamTaskRequest,
+  TeamMetrics,
+  CollaborationEvent,
+  ReviewFeedback,
+  TaskDeliverable,
+} from '../types/team';
+// === Store State ===
+ 
+interface TeamStoreState {
+  // Data
+  teams: Team[];
+  activeTeam: Team | null;
+  metrics: TeamMetrics | null;
+ 
+  // UI State
+  isLoading: boolean;
+  error: string | null;
+  selectedTaskId: string | null;
+  selectedMemberId: string | null;
+ 
+  // Real-time events
+  recentEvents: CollaborationEvent[];
+ 
+  // Actions - Team Management
+  loadTeams: () => Promise<void>;
+  createTeam: (request: CreateTeamRequest) => Promise<Team | null>;
+  deleteTeam: (teamId: string) => Promise<boolean>;
+  setActiveTeam: (team: Team | null) => void;
+ 
+  // Actions - Member Management
+  addMember: (teamId: string, agentId: string, role: TeamMemberRole) => Promise<TeamMember | null>;
+  removeMember: (teamId: string, memberId: string) => Promise<boolean>;
+  updateMemberRole: (teamId: string, memberId: string, role: TeamMemberRole) => Promise<boolean>;
+ 
+  // Actions - Task Management
+  addTask: (request: AddTeamTaskRequest) => Promise<TeamTask | null>;
+  updateTaskStatus: (teamId: string, taskId: string, status: TeamTaskStatus) => Promise<boolean>;
+  assignTask: (teamId: string, taskId: string, memberId: string) => Promise<boolean>;
+  submitDeliverable: (teamId: string, taskId: string, deliverable: TaskDeliverable) => Promise<boolean>;
+ 
+  // Actions - Dev↔QA Loop
+  startDevQALoop: (teamId: string, taskId: string, developerId: string, reviewerId: string) => Promise<DevQALoop | null>;
+  submitReview: (teamId: string, loopId: string, feedback: Omit<ReviewFeedback, 'reviewedAt' | 'reviewerId'>) => Promise<boolean>;
+  updateLoopState: (teamId: string, loopId: string, state: DevQALoopState) => Promise<boolean>;
+ 
+  // Actions - Events
+  addEvent: (event: CollaborationEvent) => void;
+  clearEvents: () => void;
+ 
+  // Actions - UI
+  setSelectedTask: (taskId: string | null) => void;
+  setSelectedMember: (memberId: string | null) => void;
+  clearError: () => void;
+}
+ 
+// === Helper Functions ===
+ 
+const generateId = () => `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
+ 
+const calculateMetrics = (team: Team): TeamMetrics => {
+  const completedTasks = team.tasks.filter(t => t.status === 'completed');
+  const totalTasks = team.tasks.length;
+  const reviewedTasks = completedTasks.filter(t => t.reviewFeedback);
+ 
+  const avgCompletionTime = completedTasks.length > 0
+    ? completedTasks.reduce((sum, t) => {
+        if (t.startedAt && t.completedAt) {
+          return sum + (new Date(t.completedAt).getTime() - new Date(t.startedAt).getTime());
+        }
+        return sum;
+      }, 0) / completedTasks.length
+    : 0;
+ 
+  const approvedReviews = reviewedTasks.filter(t => t.reviewFeedback?.verdict === 'approved');
+  const passRate = reviewedTasks.length > 0
+    ? (approvedReviews.length / reviewedTasks.length) * 100
+    : 0;
+ 
+  const totalIterations = team.activeLoops.reduce((sum, loop) => sum + loop.iterationCount, 0);
+  const avgIterations = team.activeLoops.length > 0
+    ? totalIterations / team.activeLoops.length
+    : 0;
+ 
+  const escalations = team.activeLoops.filter(loop => loop.state === 'escalated').length;
+ 
+  const efficiency = totalTasks > 0
+    ? Math.min(100, (completedTasks.length / totalTasks) * 100 * (passRate / 100))
+    : 0;
+ 
+  return {
+    tasksCompleted: completedTasks.length,
+    avgCompletionTime,
+    passRate,
+    avgIterations,
+    escalations,
+    efficiency,
+  };
+};
+ 
+// === Store Implementation ===
+ 
+export const useTeamStore = create<TeamStoreState>()(
+  persist(
+    (set, get) => ({
+  // Initial State
+  teams: [],
+  activeTeam: null,
+  metrics: null,
+  isLoading: false,
+  error: null,
+  selectedTaskId: null,
+  selectedMemberId: null,
+  recentEvents: [],
+ 
+  // Team Management
+  loadTeams: async () => {
+    set({ isLoading: true, error: null });
+    try {
+      // For now, load from localStorage until API is available
+      // Note: persist middleware stores data as { state: { teams: [...] }, version: ... }
+      const stored = localStorage.getItem('zclaw-teams');
+      let teams: Team[] = [];
+ 
+      if (stored) {
+        const parsed = JSON.parse(stored);
+        // Handle persist middleware format
+        if (parsed?.state?.teams && Array.isArray(parsed.state.teams)) {
+          teams = parsed.state.teams;
+        } else if (Array.isArray(parsed)) {
+          // Direct array format (legacy)
+          teams = parsed;
+        }
+      }
+ 
+      set({ teams, isLoading: false });
+    } catch (error) {
+      console.error('[TeamStore] Failed to load teams:', error);
+      set({ teams: [], isLoading: false });
+    }
+  },
+ 
+  createTeam: async (request: CreateTeamRequest) => {
+    set({ isLoading: true, error: null });
+    try {
+      const now = new Date().toISOString();
+      const members: TeamMember[] = request.memberAgents.map((m) => ({
+        id: generateId(),
+        agentId: m.agentId,
+        name: `Agent-${m.agentId.slice(0, 4)}`,
+        role: m.role,
+        skills: [],
+        workload: 0,
+        status: 'idle',
+        maxConcurrentTasks: m.role === 'orchestrator' ? 5 : 2,
+        currentTasks: [],
+      }));
+ 
+      const team: Team = {
+        id: generateId(),
+        name: request.name,
+        description: request.description,
+        members,
+        tasks: [],
+        pattern: request.pattern,
+        activeLoops: [],
+        status: 'active',
+        createdAt: now,
+        updatedAt: now,
+      };
+ 
+      set(state => {
+        const teams = [...state.teams, team];
+        localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+        return { teams, activeTeam: team, isLoading: false };
+      });
+ 
+      return team;
+    } catch (error) {
+      set({ error: (error as Error).message, isLoading: false });
+      return null;
+    }
+  },
+ 
+  deleteTeam: async (teamId: string) => {
+    set({ isLoading: true, error: null });
+    try {
+      set(state => {
+        const teams = state.teams.filter(t => t.id !== teamId);
+        localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+        return {
+          teams,
+          activeTeam: state.activeTeam?.id === teamId ? null : state.activeTeam,
+          isLoading: false
+        };
+      });
+      return true;
+    } catch (error) {
+      set({ error: (error as Error).message, isLoading: false });
+      return false;
+    }
+  },
+ 
+  setActiveTeam: (team: Team | null) => {
+    set(() => ({
+      activeTeam: team,
+      metrics: team ? calculateMetrics(team) : null,
+    }));
+  },
+ 
+  // Member Management
+  addMember: async (teamId: string, agentId: string, role: TeamMemberRole) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return null;
+ 
+    const member: TeamMember = {
+      id: generateId(),
+      agentId,
+      name: `Agent-${agentId.slice(0, 4)}`,
+      role,
+      skills: [],
+      workload: 0,
+      status: 'idle',
+      maxConcurrentTasks: role === 'orchestrator' ? 5 : 2,
+      currentTasks: [],
+    };
+ 
+    const updatedTeam = {
+      ...team,
+      members: [...team.members, member],
+      updatedAt: new Date().toISOString(),
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return member;
+  },
+ 
+  removeMember: async (teamId: string, memberId: string) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const updatedTeam = {
+      ...team,
+      members: team.members.filter(m => m.id !== memberId),
+      updatedAt: new Date().toISOString(),
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  updateMemberRole: async (teamId: string, memberId: string, role: TeamMemberRole) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const updatedTeam = {
+      ...team,
+      members: team.members.map(m =>
+        m.id === memberId ? { ...m, role, maxConcurrentTasks: role === 'orchestrator' ? 5 : 2 } : m
+      ),
+      updatedAt: new Date().toISOString(),
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  // Task Management
+  addTask: async (request: AddTeamTaskRequest) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === request.teamId);
+    if (!team) return null;
+ 
+    const now = new Date().toISOString();
+    const task: TeamTask = {
+      id: generateId(),
+      title: request.title,
+      description: request.description,
+      status: request.assigneeId ? 'assigned' : 'pending',
+      priority: request.priority,
+      assigneeId: request.assigneeId,
+      dependencies: request.dependencies || [],
+      type: request.type,
+      estimate: request.estimate,
+      createdAt: now,
+      updatedAt: now,
+    };
+ 
+    const updatedTeam = {
+      ...team,
+      tasks: [...team.tasks, task],
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === request.teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === request.teamId ? updatedTeam : state.activeTeam,
+        metrics: state.activeTeam?.id === request.teamId ? calculateMetrics(updatedTeam) : state.metrics,
+      };
+    });
+ 
+    return task;
+  },
+ 
+  updateTaskStatus: async (teamId: string, taskId: string, status: TeamTaskStatus) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const now = new Date().toISOString();
+    const updatedTeam = {
+      ...team,
+      tasks: team.tasks.map(t => {
+        if (t.id !== taskId) return t;
+        const updates: Partial<TeamTask> = { status, updatedAt: now };
+        if (status === 'in_progress' && !t.startedAt) {
+          updates.startedAt = now;
+        }
+        if (status === 'completed') {
+          updates.completedAt = now;
+        }
+        return { ...t, ...updates };
+      }),
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+        metrics: state.activeTeam?.id === teamId ? calculateMetrics(updatedTeam) : state.metrics,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  assignTask: async (teamId: string, taskId: string, memberId: string) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const now = new Date().toISOString();
+    const updatedTeam = {
+      ...team,
+      tasks: team.tasks.map(t =>
+        t.id === taskId
+          ? { ...t, assigneeId: memberId, status: 'assigned' as TeamTaskStatus, updatedAt: now }
+          : t
+      ),
+      members: team.members.map(m =>
+        m.id === memberId
+          ? { ...m, currentTasks: [...m.currentTasks, taskId], workload: (m.workload + 25) }
+          : m
+      ),
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  submitDeliverable: async (teamId: string, taskId: string, deliverable: TaskDeliverable) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const now = new Date().toISOString();
+    const updatedTeam = {
+      ...team,
+      tasks: team.tasks.map(t =>
+        t.id === taskId
+          ? { ...t, deliverable, status: 'review' as TeamTaskStatus, updatedAt: now }
+          : t
+      ),
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  // Dev↔QA Loop
+  startDevQALoop: async (teamId: string, taskId: string, developerId: string, reviewerId: string) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return null;
+ 
+    const now = new Date().toISOString();
+    const loop: DevQALoop = {
+      id: generateId(),
+      developerId,
+      reviewerId,
+      taskId,
+      state: 'developing',
+      iterationCount: 0,
+      maxIterations: 3,
+      feedbackHistory: [],
+      startedAt: now,
+      lastUpdatedAt: now,
+    };
+ 
+    const updatedTeam = {
+      ...team,
+      activeLoops: [...team.activeLoops, loop],
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return loop;
+  },
+ 
+  submitReview: async (teamId: string, loopId: string, feedback: Omit<ReviewFeedback, 'reviewedAt' | 'reviewerId'>) => {
+    const state = get();
+    const team = state.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const loop = team.activeLoops.find(l => l.id === loopId);
+    if (!loop) return false;
+ 
+    const now = new Date().toISOString();
+    const fullFeedback: ReviewFeedback = {
+      ...feedback,
+      reviewedAt: now,
+      reviewerId: loop.reviewerId,
+    };
+ 
+    let newState: DevQALoopState;
+    let newIterationCount = loop.iterationCount;
+ 
+    if (feedback.verdict === 'approved') {
+      newState = 'approved';
+    } else if (newIterationCount >= loop.maxIterations - 1) {
+      newState = 'escalated';
+    } else {
+      newState = 'revising';
+      newIterationCount++;
+    }
+ 
+    const updatedTeam = {
+      ...team,
+      tasks: team.tasks.map(t =>
+        t.id === loop.taskId
+          ? { ...t, reviewFeedback: fullFeedback, updatedAt: now }
+          : t
+      ),
+      activeLoops: team.activeLoops.map(l =>
+        l.id === loopId
+          ? {
+              ...l,
+              state: newState,
+              iterationCount: newIterationCount,
+              feedbackHistory: [...l.feedbackHistory, fullFeedback],
+              lastUpdatedAt: now,
+            }
+          : l
+      ),
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+        metrics: state.activeTeam?.id === teamId ? calculateMetrics(updatedTeam) : state.metrics,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  updateLoopState: async (teamId: string, loopId: string, state: DevQALoopState) => {
+    const teamStore = get();
+    const team = teamStore.teams.find(t => t.id === teamId);
+    if (!team) return false;
+ 
+    const now = new Date().toISOString();
+    const updatedTeam = {
+      ...team,
+      activeLoops: team.activeLoops.map(l =>
+        l.id === loopId
+          ? { ...l, state, lastUpdatedAt: now }
+          : l
+      ),
+      updatedAt: now,
+    };
+ 
+    set(state => {
+      const teams = state.teams.map(t => t.id === teamId ? updatedTeam : t);
+      localStorage.setItem('zclaw-teams', JSON.stringify(teams));
+      return {
+        teams,
+        activeTeam: state.activeTeam?.id === teamId ? updatedTeam : state.activeTeam,
+      };
+    });
+ 
+    return true;
+  },
+ 
+  // Events
+  addEvent: (event: CollaborationEvent) => {
+    set(state => ({
+      recentEvents: [event, ...state.recentEvents].slice(0, 100),
+    }));
+  },
+ 
+  clearEvents: () => {
+    set({ recentEvents: [] });
+  },
+ 
+  // UI
+  setSelectedTask: (taskId: string | null) => {
+    set({ selectedTaskId: taskId });
+  },
+ 
+  setSelectedMember: (memberId: string | null) => {
+    set({ selectedMemberId: memberId });
+  },
+ 
+  clearError: () => {
+    set({ error: null });
+  },
+}),
+  {
+    name: 'zclaw-teams',
+    partialize: (state) => ({
+      teams: state.teams,
+      activeTeam: state.activeTeam,
+    }),
+  },
+));
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/workflowBuilderStore.ts.html b/desktop/coverage/src/store/workflowBuilderStore.ts.html new file mode 100644 index 0000000..0906f1c --- /dev/null +++ b/desktop/coverage/src/store/workflowBuilderStore.ts.html @@ -0,0 +1,1453 @@ + + + + + + Code coverage report for src/store/workflowBuilderStore.ts + + + + + + + + + +
+
+

All files / src/store workflowBuilderStore.ts

+
+ +
+ 0% + Statements + 0/310 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/310 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Builder Store
+ *
+ * Zustand store for managing workflow builder state.
+ */
+ 
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import type {
+  WorkflowCanvas,
+  WorkflowNode,
+  WorkflowEdge,
+  WorkflowNodeData,
+  WorkflowTemplate,
+  ValidationResult,
+  NodePaletteItem,
+  WorkflowNodeType,
+  NodeCategory,
+} from '../lib/workflow-builder/types';
+import { validateCanvas } from '../lib/workflow-builder/yaml-converter';
+ 
+// =============================================================================
+// Store State
+// =============================================================================
+ 
+interface WorkflowBuilderState {
+  // Canvas state
+  canvas: WorkflowCanvas | null;
+  workflows: WorkflowCanvas[];
+ 
+  // Selection
+  selectedNodeId: string | null;
+  selectedEdgeId: string | null;
+ 
+  // UI state
+  isDragging: boolean;
+  isDirty: boolean;
+  isPreviewOpen: boolean;
+  validation: ValidationResult | null;
+ 
+  // Templates
+  templates: WorkflowTemplate[];
+ 
+  // Available items for palette
+  availableSkills: Array<{ id: string; name: string; description: string }>;
+  availableHands: Array<{ id: string; name: string; actions: string[] }>;
+ 
+  // Actions
+  createNewWorkflow: (name: string, description?: string) => void;
+  loadWorkflow: (id: string) => void;
+  saveWorkflow: () => void;
+  deleteWorkflow: (id: string) => void;
+ 
+  // Node actions
+  addNode: (type: WorkflowNodeType, position: { x: number; y: number }) => void;
+  updateNode: (nodeId: string, data: Partial<WorkflowNodeData>) => void;
+  deleteNode: (nodeId: string) => void;
+  duplicateNode: (nodeId: string) => void;
+ 
+  // Edge actions
+  addEdge: (source: string, target: string) => void;
+  deleteEdge: (edgeId: string) => void;
+ 
+  // Selection actions
+  selectNode: (nodeId: string | null) => void;
+  selectEdge: (edgeId: string | null) => void;
+ 
+  // UI actions
+  setDragging: (isDragging: boolean) => void;
+  setPreviewOpen: (isOpen: boolean) => void;
+  validate: () => ValidationResult;
+ 
+  // Data loading
+  setAvailableSkills: (skills: Array<{ id: string; name: string; description: string }>) => void;
+  setAvailableHands: (hands: Array<{ id: string; name: string; actions: string[] }>) => void;
+ 
+  // Canvas metadata
+  updateCanvasMetadata: (updates: Partial<Pick<WorkflowCanvas, 'name' | 'description' | 'category'>>) => void;
+}
+ 
+// =============================================================================
+// Default Node Data
+// =============================================================================
+ 
+function getDefaultNodeData(type: WorkflowNodeType, _id: string): WorkflowNodeData {
+  const base = { label: type.charAt(0).toUpperCase() + type.slice(1) };
+ 
+  switch (type) {
+    case 'input':
+      return { type: 'input', ...base, variableName: 'input', schema: undefined };
+    case 'llm':
+      return { type: 'llm', ...base, template: '', isTemplateFile: false, jsonMode: false };
+    case 'skill':
+      return { type: 'skill', ...base, skillId: '', inputMappings: {} };
+    case 'hand':
+      return { type: 'hand', ...base, handId: '', action: '', params: {} };
+    case 'orchestration':
+      return { type: 'orchestration', ...base, inputMappings: {} };
+    case 'condition':
+      return { type: 'condition', ...base, condition: '', branches: [{ when: '', label: 'Branch 1' }], hasDefault: true };
+    case 'parallel':
+      return { type: 'parallel', ...base, each: '${inputs.items}', maxWorkers: 4 };
+    case 'loop':
+      return { type: 'loop', ...base, each: '${inputs.items}', itemVar: 'item', indexVar: 'index' };
+    case 'export':
+      return { type: 'export', ...base, formats: ['json'] };
+    case 'http':
+      return { type: 'http', ...base, url: '', method: 'GET', headers: {} };
+    case 'setVar':
+      return { type: 'setVar', ...base, variableName: 'result', value: '' };
+    case 'delay':
+      return { type: 'delay', ...base, ms: 1000 };
+    default:
+      throw new Error(`Unknown node type: ${type}`);
+  }
+}
+ 
+// =============================================================================
+// Store Implementation
+// =============================================================================
+ 
+export const useWorkflowBuilderStore = create<WorkflowBuilderState>()(
+  persist(
+    (set, get) => ({
+      // Initial state
+      canvas: null,
+      workflows: [],
+      selectedNodeId: null,
+      selectedEdgeId: null,
+      isDragging: false,
+      isDirty: false,
+      isPreviewOpen: false,
+      validation: null,
+      templates: [],
+      availableSkills: [],
+      availableHands: [],
+ 
+      // Workflow actions
+      createNewWorkflow: (name, description) => {
+        const canvas: WorkflowCanvas = {
+          id: `workflow_${Date.now()}`,
+          name,
+          description,
+          category: 'custom',
+          nodes: [],
+          edges: [],
+          viewport: { x: 0, y: 0, zoom: 1 },
+          metadata: {
+            createdAt: new Date().toISOString(),
+            updatedAt: new Date().toISOString(),
+            tags: [],
+            version: '1.0.0',
+          },
+        };
+        set({ canvas, isDirty: false, selectedNodeId: null, selectedEdgeId: null, validation: null });
+      },
+ 
+      loadWorkflow: (id) => {
+        const workflow = get().workflows.find(w => w.id === id);
+        if (workflow) {
+          set({ canvas: workflow, isDirty: false, selectedNodeId: null, selectedEdgeId: null });
+        }
+      },
+ 
+      saveWorkflow: () => {
+        const { canvas, workflows } = get();
+        if (!canvas) return;
+ 
+        const updatedCanvas: WorkflowCanvas = {
+          ...canvas,
+          metadata: {
+            ...canvas.metadata,
+            updatedAt: new Date().toISOString(),
+          },
+        };
+ 
+        const existingIndex = workflows.findIndex(w => w.id === canvas.id);
+        let updatedWorkflows: WorkflowCanvas[];
+ 
+        if (existingIndex >= 0) {
+          updatedWorkflows = [...workflows];
+          updatedWorkflows[existingIndex] = updatedCanvas;
+        } else {
+          updatedWorkflows = [...workflows, updatedCanvas];
+        }
+ 
+        set({ workflows: updatedWorkflows, canvas: updatedCanvas, isDirty: false });
+      },
+ 
+      deleteWorkflow: (id) => {
+        set(state => ({
+          workflows: state.workflows.filter(w => w.id !== id),
+          canvas: state.canvas?.id === id ? null : state.canvas,
+        }));
+      },
+ 
+      // Node actions
+      addNode: (type, position) => {
+        const { canvas } = get();
+        if (!canvas) return;
+ 
+        const id = `${type}_${Date.now()}`;
+        const node: WorkflowNode = {
+          id,
+          type,
+          position,
+          data: getDefaultNodeData(type, id),
+        };
+ 
+        set({
+          canvas: { ...canvas, nodes: [...canvas.nodes, node] },
+          isDirty: true,
+          selectedNodeId: id,
+        });
+      },
+ 
+      updateNode: (nodeId, data) => {
+        const { canvas } = get();
+        if (!canvas) return;
+ 
+        const updatedNodes = canvas.nodes.map(node =>
+          node.id === nodeId
+            ? { ...node, data: { ...node.data, ...data } as WorkflowNodeData }
+            : node
+        );
+ 
+        set({ canvas: { ...canvas, nodes: updatedNodes }, isDirty: true });
+      },
+ 
+      deleteNode: (nodeId) => {
+        const { canvas } = get();
+        if (!canvas) return;
+ 
+        const updatedNodes = canvas.nodes.filter(n => n.id !== nodeId);
+        const updatedEdges = canvas.edges.filter(e => e.source !== nodeId && e.target !== nodeId);
+ 
+        set({
+          canvas: { ...canvas, nodes: updatedNodes, edges: updatedEdges },
+          isDirty: true,
+          selectedNodeId: null,
+        });
+      },
+ 
+      duplicateNode: (nodeId) => {
+        const { canvas } = get();
+        if (!canvas) return;
+ 
+        const node = canvas.nodes.find(n => n.id === nodeId);
+        if (!node) return;
+ 
+        const newId = `${node.type}_${Date.now()}`;
+        const newNode: WorkflowNode = {
+          ...node,
+          id: newId,
+          position: {
+            x: node.position.x + 50,
+            y: node.position.y + 50,
+          },
+          data: { ...node.data, label: `${node.data.label} (copy)` } as WorkflowNodeData,
+        };
+ 
+        set({
+          canvas: { ...canvas, nodes: [...canvas.nodes, newNode] },
+          isDirty: true,
+          selectedNodeId: newId,
+        });
+      },
+ 
+      // Edge actions
+      addEdge: (source, target) => {
+        const { canvas } = get();
+        if (!canvas) return;
+ 
+        // Check if edge already exists
+        const exists = canvas.edges.some(e => e.source === source && e.target === target);
+        if (exists) return;
+ 
+        const edge: WorkflowEdge = {
+          id: `edge_${source}_${target}`,
+          source,
+          target,
+          type: 'default',
+        };
+ 
+        set({ canvas: { ...canvas, edges: [...canvas.edges, edge] }, isDirty: true });
+      },
+ 
+      deleteEdge: (edgeId) => {
+        const { canvas } = get();
+        if (!canvas) return;
+ 
+        set({
+          canvas: { ...canvas, edges: canvas.edges.filter(e => e.id !== edgeId) },
+          isDirty: true,
+        });
+      },
+ 
+      // Selection actions
+      selectNode: (nodeId) => set({ selectedNodeId: nodeId, selectedEdgeId: null }),
+      selectEdge: (edgeId) => set({ selectedEdgeId: edgeId, selectedNodeId: null }),
+ 
+      // UI actions
+      setDragging: (isDragging) => set({ isDragging }),
+      setPreviewOpen: (isOpen) => set({ isPreviewOpen: isOpen }),
+ 
+      validate: () => {
+        const { canvas } = get();
+        if (!canvas) {
+          return { valid: false, errors: [{ nodeId: 'canvas', message: 'No workflow loaded', severity: 'error' as const }], warnings: [] };
+        }
+        const result = validateCanvas(canvas);
+        set({ validation: result });
+        return result;
+      },
+ 
+      // Data loading
+      setAvailableSkills: (skills) => set({ availableSkills: skills }),
+      setAvailableHands: (hands) => set({ availableHands: hands }),
+ 
+      // Canvas metadata
+      updateCanvasMetadata: (updates) => {
+        const { canvas } = get();
+        if (!canvas) return;
+        set({ canvas: { ...canvas, ...updates }, isDirty: true });
+      },
+    }),
+    {
+      name: 'workflow-builder-storage',
+      partialize: (state) => ({
+        workflows: state.workflows,
+        templates: state.templates,
+      }),
+    }
+  )
+);
+ 
+// =============================================================================
+// Node Palette Items
+// =============================================================================
+ 
+export const nodePaletteItems: NodePaletteItem[] = [
+  // Input category
+  {
+    type: 'input',
+    label: 'Input',
+    description: 'Define workflow input variables',
+    icon: '📥',
+    category: 'input',
+    defaultData: { variableName: 'input' },
+  },
+ 
+  // AI category
+  {
+    type: 'llm',
+    label: 'LLM Generate',
+    description: 'Generate text using LLM',
+    icon: '🤖',
+    category: 'ai',
+    defaultData: { template: '', jsonMode: false },
+  },
+  {
+    type: 'skill',
+    label: 'Skill',
+    description: 'Execute a skill',
+    icon: '⚡',
+    category: 'ai',
+    defaultData: { skillId: '', inputMappings: {} },
+  },
+  {
+    type: 'orchestration',
+    label: 'Skill Orchestration',
+    description: 'Execute multiple skills in a DAG',
+    icon: '🔀',
+    category: 'ai',
+    defaultData: { inputMappings: {} },
+  },
+ 
+  // Action category
+  {
+    type: 'hand',
+    label: 'Hand',
+    description: 'Execute a hand action',
+    icon: '✋',
+    category: 'action',
+    defaultData: { handId: '', action: '', params: {} },
+  },
+  {
+    type: 'http',
+    label: 'HTTP Request',
+    description: 'Make an HTTP request',
+    icon: '🌐',
+    category: 'action',
+    defaultData: { url: '', method: 'GET', headers: {} },
+  },
+  {
+    type: 'setVar',
+    label: 'Set Variable',
+    description: 'Set a variable value',
+    icon: '📝',
+    category: 'action',
+    defaultData: { variableName: '', value: '' },
+  },
+  {
+    type: 'delay',
+    label: 'Delay',
+    description: 'Pause execution',
+    icon: '⏱️',
+    category: 'action',
+    defaultData: { ms: 1000 },
+  },
+ 
+  // Control category
+  {
+    type: 'condition',
+    label: 'Condition',
+    description: 'Branch based on condition',
+    icon: '🔀',
+    category: 'control',
+    defaultData: { condition: '', branches: [{ when: '', label: 'Branch' }] },
+  },
+  {
+    type: 'parallel',
+    label: 'Parallel',
+    description: 'Execute in parallel',
+    icon: '⚡',
+    category: 'control',
+    defaultData: { each: '${inputs.items}', maxWorkers: 4 },
+  },
+  {
+    type: 'loop',
+    label: 'Loop',
+    description: 'Iterate over items',
+    icon: '🔄',
+    category: 'control',
+    defaultData: { each: '${inputs.items}', itemVar: 'item', indexVar: 'index' },
+  },
+ 
+  // Output category
+  {
+    type: 'export',
+    label: 'Export',
+    description: 'Export to file formats',
+    icon: '📤',
+    category: 'output',
+    defaultData: { formats: ['json'] },
+  },
+];
+ 
+// Group palette items by category
+export const paletteCategories: Record<NodeCategory, NodePaletteItem[]> = {
+  input: nodePaletteItems.filter(i => i.category === 'input'),
+  ai: nodePaletteItems.filter(i => i.category === 'ai'),
+  action: nodePaletteItems.filter(i => i.category === 'action'),
+  control: nodePaletteItems.filter(i => i.category === 'control'),
+  output: nodePaletteItems.filter(i => i.category === 'output'),
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/store/workflowStore.ts.html b/desktop/coverage/src/store/workflowStore.ts.html new file mode 100644 index 0000000..c4a0b51 --- /dev/null +++ b/desktop/coverage/src/store/workflowStore.ts.html @@ -0,0 +1,1096 @@ + + + + + + Code coverage report for src/store/workflowStore.ts + + + + + + + + + +
+
+

All files / src/store workflowStore.ts

+
+ +
+ 0% + Statements + 0/186 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/186 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { create } from 'zustand';
+import type { GatewayClient } from '../lib/gateway-client';
+ 
+// === Core Types (previously imported from gatewayStore) ===
+ 
+export interface Workflow {
+  id: string;
+  name: string;
+  steps: number;
+  description?: string;
+  createdAt?: string;
+}
+ 
+export interface WorkflowRun {
+  runId: string;
+  status: string;
+  step?: string;
+  result?: unknown;
+}
+ 
+// === Types ===
+ 
+interface RawWorkflowRun {
+  runId?: string;
+  run_id?: string;
+  id?: string;
+  workflowId?: string;
+  workflow_id?: string;
+  status?: string;
+  startedAt?: string;
+  started_at?: string;
+  completedAt?: string;
+  completed_at?: string;
+  currentStep?: number;
+  current_step?: number;
+  totalSteps?: number;
+  total_steps?: number;
+  error?: string;
+  result?: unknown;
+  step?: string;
+}
+ 
+export interface WorkflowStep {
+  handName: string;
+  name?: string;
+  params?: Record<string, unknown>;
+  condition?: string;
+}
+ 
+export interface WorkflowDetail {
+  id: string;
+  name: string;
+  description?: string;
+  steps: WorkflowStep[];
+  createdAt?: string;
+}
+ 
+export interface WorkflowCreateOptions {
+  name: string;
+  description?: string;
+  steps: WorkflowStep[];
+}
+ 
+export interface UpdateWorkflowInput {
+  name?: string;
+  description?: string;
+  steps?: WorkflowStep[];
+}
+ 
+// Extended WorkflowRun with additional fields from API
+export interface ExtendedWorkflowRun extends WorkflowRun {
+  startedAt?: string;
+  completedAt?: string;
+  error?: string;
+}
+ 
+// === Client Interface ===
+ 
+interface WorkflowClient {
+  listWorkflows(): Promise<{ workflows: { id: string; name: string; steps: number; description?: string; createdAt?: string }[] } | null>;
+  getWorkflow(id: string): Promise<WorkflowDetail | null>;
+  createWorkflow(workflow: WorkflowCreateOptions): Promise<{ id: string; name: string } | null>;
+  updateWorkflow(id: string, updates: UpdateWorkflowInput): Promise<{ id: string; name: string } | null>;
+  deleteWorkflow(id: string): Promise<{ status: string }>;
+  executeWorkflow(id: string, input?: Record<string, unknown>): Promise<{ runId: string; status: string } | null>;
+  cancelWorkflow(workflowId: string, runId: string): Promise<{ status: string }>;
+  listWorkflowRuns(workflowId: string, opts?: { limit?: number; offset?: number }): Promise<{ runs: RawWorkflowRun[] } | null>;
+}
+ 
+// === Store State Slice ===
+ 
+export interface WorkflowStateSlice {
+  workflows: Workflow[];
+  workflowRuns: Record<string, ExtendedWorkflowRun[]>;
+  isLoading: boolean;
+  error: string | null;
+  client: WorkflowClient;
+}
+ 
+// === Store Actions Slice ===
+ 
+export interface WorkflowActionsSlice {
+  setWorkflowStoreClient: (client: WorkflowClient) => void;
+  loadWorkflows: () => Promise<void>;
+  getWorkflow: (id: string) => Workflow | undefined;
+  getWorkflowDetail: (id: string) => Promise<WorkflowDetail | undefined>;
+  createWorkflow: (workflow: WorkflowCreateOptions) => Promise<Workflow | undefined>;
+  updateWorkflow: (id: string, updates: UpdateWorkflowInput) => Promise<Workflow | undefined>;
+  deleteWorkflow: (id: string) => Promise<void>;
+  triggerWorkflow: (id: string, input?: Record<string, unknown>) => Promise<{ runId: string; status: string } | undefined>;
+  cancelWorkflow: (id: string, runId: string) => Promise<void>;
+  loadWorkflowRuns: (workflowId: string, opts?: { limit?: number; offset?: number }) => Promise<ExtendedWorkflowRun[]>;
+  clearError: () => void;
+  reset: () => void;
+}
+ 
+// === Combined Store Type ===
+ 
+export type WorkflowStore = WorkflowStateSlice & WorkflowActionsSlice;
+ 
+// === Initial State ===
+ 
+const initialState = {
+  workflows: [],
+  workflowRuns: {},
+  isLoading: false,
+  error: null,
+  client: null as unknown as WorkflowClient,
+};
+ 
+// === Store ===
+ 
+export const useWorkflowStore = create<WorkflowStateSlice & WorkflowActionsSlice>((set, get) => ({
+  ...initialState,
+ 
+  setWorkflowStoreClient: (client: WorkflowClient) => {
+    set({ client });
+  },
+ 
+  loadWorkflows: async () => {
+    set({ isLoading: true, error: null });
+    try {
+      const result = await get().client.listWorkflows();
+      const workflows: Workflow[] = (result?.workflows || []).map(w => ({
+        id: w.id,
+        name: w.name,
+        steps: w.steps,
+        description: w.description,
+        createdAt: w.createdAt,
+      }));
+      set({ workflows, isLoading: false });
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to load workflows';
+      set({ error: message, isLoading: false });
+    }
+  },
+ 
+  getWorkflow: (id: string) => {
+    return get().workflows.find(w => w.id === id);
+  },
+ 
+  getWorkflowDetail: async (id: string) => {
+    try {
+      const result = await get().client.getWorkflow(id);
+      if (!result) return undefined;
+      return {
+        id: result.id,
+        name: result.name,
+        description: result.description,
+        steps: Array.isArray(result.steps) ? result.steps : [],
+        createdAt: result.createdAt,
+      };
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to load workflow details';
+      set({ error: message });
+      return undefined;
+    }
+  },
+ 
+  createWorkflow: async (workflow: WorkflowCreateOptions) => {
+    set({ error: null });
+    try {
+      const result = await get().client.createWorkflow(workflow);
+      if (result) {
+        const newWorkflow: Workflow = {
+          id: result.id,
+          name: result.name,
+          steps: workflow.steps.length,
+          description: workflow.description,
+        };
+        set(state => ({ workflows: [...state.workflows, newWorkflow] }));
+        return newWorkflow;
+      }
+      return undefined;
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to create workflow';
+      set({ error: message });
+      return undefined;
+    }
+  },
+ 
+  updateWorkflow: async (id: string, updates: UpdateWorkflowInput) => {
+    set({ error: null });
+    try {
+      const result = await get().client.updateWorkflow(id, updates);
+      if (result) {
+        set(state => ({
+          workflows: state.workflows.map(w =>
+            w.id === id
+              ? {
+                  ...w,
+                  name: updates.name ?? w.name,
+                  description: updates.description ?? w.description,
+                  steps: updates.steps?.length ?? w.steps,
+                }
+              : w
+          ),
+        }));
+        return get().workflows.find(w => w.id === id);
+      }
+      return undefined;
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to update workflow';
+      set({ error: message });
+      return undefined;
+    }
+  },
+ 
+  deleteWorkflow: async (id: string) => {
+    set({ error: null });
+    try {
+      await get().client.deleteWorkflow(id);
+      set(state => ({
+        workflows: state.workflows.filter(w => w.id !== id),
+        workflowRuns: (() => {
+          const { [id]: _, ...rest } = state.workflowRuns;
+          return rest;
+        })(),
+      }));
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to delete workflow';
+      set({ error: message });
+      throw err;
+    }
+  },
+ 
+  triggerWorkflow: async (id: string, input?: Record<string, unknown>) => {
+    set({ error: null });
+    try {
+      const result = await get().client.executeWorkflow(id, input);
+      return result ? { runId: result.runId, status: result.status } : undefined;
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to trigger workflow';
+      set({ error: message });
+      return undefined;
+    }
+  },
+ 
+  cancelWorkflow: async (id: string, runId: string) => {
+    set({ error: null });
+    try {
+      await get().client.cancelWorkflow(id, runId);
+      // Refresh workflows to update status
+      await get().loadWorkflows();
+    } catch (err: unknown) {
+      const message = err instanceof Error ? err.message : 'Failed to cancel workflow';
+      set({ error: message });
+      throw err;
+    }
+  },
+ 
+  loadWorkflowRuns: async (workflowId: string, opts?: { limit?: number; offset?: number }) => {
+    try {
+      const result = await get().client.listWorkflowRuns(workflowId, opts);
+      const runs: ExtendedWorkflowRun[] = (result?.runs || []).map((r: RawWorkflowRun) => ({
+        runId: r.runId || r.run_id || r.id || '',
+        status: r.status || 'unknown',
+        startedAt: r.startedAt || r.started_at,
+        completedAt: r.completedAt || r.completed_at,
+        step: r.currentStep?.toString() || r.current_step?.toString() || r.step,
+        result: r.result,
+        error: r.error,
+      }));
+      // Store runs by workflow ID
+      set(state => ({
+        workflowRuns: { ...state.workflowRuns, [workflowId]: runs },
+      }));
+      return runs;
+    } catch {
+      return [];
+    }
+  },
+ 
+  clearError: () => {
+    set({ error: null });
+  },
+ 
+  reset: () => {
+    set(initialState);
+  },
+}));
+ 
+// Types are now defined locally in this file (no longer imported from gatewayStore)
+ 
+// === Client Injection ===
+ 
+/**
+ * Helper to create a WorkflowClient adapter from a GatewayClient.
+ */
+function createWorkflowClientFromGateway(client: GatewayClient): WorkflowClient {
+  return {
+    getWorkflow: async (id: string) => {
+      const result = await client.getWorkflow(id);
+      if (!result) return null;
+      return {
+        ...result,
+        steps: result.steps as WorkflowStep[],
+      };
+    },
+    listWorkflows: () => client.listWorkflows(),
+    createWorkflow: (workflow) => client.createWorkflow(workflow),
+    updateWorkflow: (id, updates) => client.updateWorkflow(id, updates),
+    deleteWorkflow: (id) => client.deleteWorkflow(id),
+    executeWorkflow: (id, input) => client.executeWorkflow(id, input),
+    cancelWorkflow: (workflowId, runId) => client.cancelWorkflow(workflowId, runId),
+    listWorkflowRuns: (workflowId, opts) => client.listWorkflowRuns(workflowId, opts),
+  };
+}
+ 
+/**
+ * Sets the client for the workflow store.
+ * Called by the coordinator during initialization.
+ */
+export function setWorkflowStoreClient(client: unknown): void {
+  const workflowClient = createWorkflowClientFromGateway(client as GatewayClient);
+  useWorkflowStore.getState().setWorkflowStoreClient(workflowClient);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/active-learning.ts.html b/desktop/coverage/src/types/active-learning.ts.html new file mode 100644 index 0000000..614d0df --- /dev/null +++ b/desktop/coverage/src/types/active-learning.ts.html @@ -0,0 +1,346 @@ + + + + + + Code coverage report for src/types/active-learning.ts + + + + + + + + + +
+
+

All files / src/types active-learning.ts

+
+ +
+ 0% + Statements + 0/6 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * 主动学习引擎类型定义
+ *
+ * 定义学习事件、模式、建议等核心类型。
+ */
+ 
+// === 学习事件类型 ===
+ 
+export type LearningEventType =
+  | 'preference'      // 偏好学习
+  | 'correction'      // 纠正学习
+  | 'context'         // 上下文学习
+  | 'feedback'        // 反馈学习
+  | 'behavior'        // 行为学习
+  | 'implicit';       // 隐式学习
+ 
+export type FeedbackSentiment = 'positive' | 'negative' | 'neutral';
+ 
+// === 学习事件 ===
+ 
+export interface LearningEvent {
+  id: string;
+  type: LearningEventType;
+  agentId: string;
+  conversationId?: string;
+  messageId?: string;
+ 
+  // 事件内容
+  trigger: string;           // 触发学习的原始内容
+  observation: string;       // 观察到的用户行为/反馈
+  context?: string;          // 上下文信息
+ 
+  // 学习结果
+  inferredPreference?: string;
+  inferredRule?: string;
+  confidence: number;        // 0-1
+ 
+  // 元数据
+  timestamp: number;
+  updatedAt?: number;
+  acknowledged: boolean;
+  appliedCount: number;
+}
+ 
+// === 学习模式 ===
+ 
+export interface LearningPattern {
+  type: 'preference' | 'rule' | 'context' | 'behavior';
+  pattern: string;
+  description: string;
+  examples: string[];
+  confidence: number;
+  agentId: string;
+  updatedAt?: number;
+}
+ 
+// === 学习建议 ===
+ 
+export interface LearningSuggestion {
+  id: string;
+  agentId: string;
+  type: string;
+  pattern: string;
+  suggestion: string;
+  confidence: number;
+  createdAt: number;
+  expiresAt: Date;
+  dismissed: boolean;
+}
+ 
+// === 学习配置 ===
+ 
+export interface LearningConfig {
+  enabled: boolean;
+  minConfidence: number;
+  maxEvents: number;
+  suggestionCooldown: number;
+}
+ 
+// === 默认配置 ===
+ 
+export const DEFAULT_LEARNING_CONFIG: LearningConfig = {
+  enabled: true,
+  minConfidence: 0.5,
+  maxEvents: 1000,
+  suggestionCooldown: 2, // hours
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/agent.ts.html b/desktop/coverage/src/types/agent.ts.html new file mode 100644 index 0000000..5cd74a4 --- /dev/null +++ b/desktop/coverage/src/types/agent.ts.html @@ -0,0 +1,286 @@ + + + + + + Code coverage report for src/types/agent.ts + + + + + + + + + +
+
+

All files / src/types agent.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Agent Type Definitions for OpenFang
+ *
+ * These types define the Agent entity structure and related configurations
+ * for the OpenFang desktop client.
+ */
+ 
+/**
+ * Represents an Agent instance in OpenFang runtime
+ */
+export interface Agent {
+  /** Unique identifier for the agent */
+  id: string;
+  /** Display name of the agent */
+  name: string;
+  /** Current operational status */
+  status: AgentStatus;
+  /** The LLM model being used by this agent */
+  model?: string;
+  /** Path to the agent's workspace directory */
+  workspaceDir?: string;
+  /** ISO timestamp of agent creation */
+  createdAt: string;
+  /** ISO timestamp of last agent update */
+  updatedAt?: string;
+}
+ 
+/**
+ * Configuration object for creating or updating an Agent
+ */
+export interface AgentConfig {
+  /** Display name for the agent */
+  name: string;
+  /** LLM model to use (e.g., 'gpt-4', 'claude-3') */
+  model: string;
+  /** Optional workspace directory path */
+  workspace?: string;
+  /** Optional system prompt for the agent */
+  systemPrompt?: string;
+}
+ 
+/**
+ * Possible operational states for an Agent
+ *
+ * - idle: Agent is not currently processing any tasks
+ * - running: Agent is actively processing
+ * - paused: Agent execution is temporarily suspended
+ * - error: Agent encountered an error and requires attention
+ */
+export type AgentStatus = 'idle' | 'running' | 'paused' | 'error';
+ 
+/**
+ * Response structure for agent list API
+ */
+export interface AgentListResponse {
+  agents: Agent[];
+  total: number;
+}
+ 
+/**
+ * Response structure for single agent API
+ */
+export interface AgentResponse {
+  agent: Agent;
+  success: boolean;
+  error?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/api-responses.ts.html b/desktop/coverage/src/types/api-responses.ts.html new file mode 100644 index 0000000..87c2468 --- /dev/null +++ b/desktop/coverage/src/types/api-responses.ts.html @@ -0,0 +1,1039 @@ + + + + + + Code coverage report for src/types/api-responses.ts + + + + + + + + + +
+
+

All files / src/types api-responses.ts

+
+ +
+ 0% + Statements + 0/26 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * API Response Types for OpenFang/ZCLAW
+ *
+ * Standard response envelope types for all API interactions with the
+ * OpenFang Kernel. These types provide a consistent interface for
+ * handling API responses, errors, and pagination across the application.
+ *
+ * @module types/api-responses
+ */
+ 
+/**
+ * Standard API response envelope that wraps all API responses.
+ *
+ * @template T - The type of data contained in the response
+ *
+ * @example
+ * ```typescript
+ * const response: ApiResponse<Agent> = {
+ *   success: true,
+ *   data: { id: 'agent-1', name: 'Assistant', ... },
+ *   meta: { timestamp: '2024-01-15T10:30:00Z', requestId: 'req-123' }
+ * };
+ * ```
+ */
+export interface ApiResponse<T> {
+  /** Indicates whether the request was successful */
+  success: boolean;
+  /** The response data, present only on success */
+  data?: T;
+  /** Error information, present only on failure */
+  error?: ApiError;
+  /** Optional metadata about the response */
+  meta?: ResponseMetadata;
+}
+ 
+/**
+ * Error information structure for API error responses.
+ *
+ * @example
+ * ```typescript
+ * const error: ApiError = {
+ *   code: 'VALIDATION_ERROR',
+ *   message: 'Invalid agent configuration',
+ *   details: { field: 'model', reason: 'Model not found' }
+ * };
+ * ```
+ */
+export interface ApiError {
+  /** Machine-readable error code for programmatic handling */
+  code: string;
+  /** Human-readable error message */
+  message: string;
+  /** Additional error details for debugging or display */
+  details?: Record<string, unknown>;
+  /** Stack trace (only available in development mode) */
+  stack?: string;
+}
+ 
+/**
+ * Metadata included with API responses for tracking and debugging.
+ *
+ * @example
+ * ```typescript
+ * const meta: ResponseMetadata = {
+ *   timestamp: '2024-01-15T10:30:00Z',
+ *   requestId: 'req-abc123',
+ *   duration: 45
+ * };
+ * ```
+ */
+export interface ResponseMetadata {
+  /** ISO 8601 timestamp of when the response was generated */
+  timestamp: string;
+  /** Unique identifier for tracking the request across services */
+  requestId?: string;
+  /** Time taken to process the request in milliseconds */
+  duration?: number;
+}
+ 
+/**
+ * Paginated response structure for list endpoints.
+ *
+ * @template T - The type of items in the paginated list
+ *
+ * @example
+ * ```typescript
+ * const response: PaginatedResponse<Agent> = {
+ *   items: [{ id: '1', name: 'Agent 1' }, { id: '2', name: 'Agent 2' }],
+ *   total: 100,
+ *   page: 1,
+ *   pageSize: 20,
+ *   hasMore: true
+ * };
+ * ```
+ */
+export interface PaginatedResponse<T> {
+  /** Array of items for the current page */
+  items: T[];
+  /** Total number of items across all pages */
+  total: number;
+  /** Current page number (1-indexed) */
+  page: number;
+  /** Number of items per page */
+  pageSize: number;
+  /** Indicates if more pages are available */
+  hasMore: boolean;
+}
+ 
+/**
+ * Response type for create operations.
+ *
+ * @template T - The type of the created resource
+ *
+ * @example
+ * ```typescript
+ * const response: CreateResponse<Agent> = {
+ *   success: true,
+ *   created: true,
+ *   data: newAgent
+ * };
+ * ```
+ */
+export interface CreateResponse<T> extends ApiResponse<T> {
+  /** Confirms the resource was created */
+  created: boolean;
+}
+ 
+/**
+ * Response type for update operations.
+ *
+ * @template T - The type of the updated resource
+ *
+ * @example
+ * ```typescript
+ * const response: UpdateResponse<Agent> = {
+ *   success: true,
+ *   updated: true,
+ *   data: updatedAgent,
+ *   changes: { name: 'New Name' }
+ * };
+ * ```
+ */
+export interface UpdateResponse<T> extends ApiResponse<T> {
+  /** Confirms the resource was updated */
+  updated: boolean;
+  /** The fields that were changed */
+  changes?: Partial<T>;
+}
+ 
+/**
+ * Response type for delete operations.
+ *
+ * @example
+ * ```typescript
+ * const response: DeleteResponse = {
+ *   success: true,
+ *   deleted: true
+ * };
+ * ```
+ */
+export interface DeleteResponse extends ApiResponse<void> {
+  /** Confirms the resource was deleted */
+  deleted: boolean;
+}
+ 
+/**
+ * Response type for bulk operations that process multiple items.
+ *
+ * @template T - The type of items being processed
+ *
+ * @example
+ * ```typescript
+ * const response: BulkResponse<Agent> = {
+ *   success: true,
+ *   data: [agent1, agent2],
+ *   successful: 2,
+ *   failed: 1,
+ *   errors: [{ index: 2, error: { code: 'NOT_FOUND', message: 'Agent not found' } }]
+ * };
+ * ```
+ */
+export interface BulkResponse<T> extends ApiResponse<T[]> {
+  /** Number of items successfully processed */
+  successful: number;
+  /** Number of items that failed to process */
+  failed: number;
+  /** Array of errors with their corresponding item indices */
+  errors?: Array<{ index: number; error: ApiError }>;
+}
+ 
+/**
+ * WebSocket message envelope for real-time communication.
+ *
+ * @template T - The type of the message payload
+ *
+ * @example
+ * ```typescript
+ * const message: WebSocketMessage<StreamEvent> = {
+ *   type: 'stream',
+ *   payload: { content: 'Hello', done: false },
+ *   timestamp: '2024-01-15T10:30:00Z',
+ *   correlationId: 'corr-123'
+ * };
+ * ```
+ */
+export interface WebSocketMessage<T = unknown> {
+  /** The type/category of the message */
+  type: string;
+  /** The message payload data */
+  payload: T;
+  /** ISO 8601 timestamp of when the message was sent */
+  timestamp: string;
+  /** Optional ID for correlating request/response messages */
+  correlationId?: string;
+}
+ 
+/**
+ * Stream chunk for streaming responses (e.g., chat completions).
+ *
+ * @template T - The type of data in the stream chunk
+ *
+ * @example
+ * ```typescript
+ * const chunk: StreamChunk<{ content: string }> = {
+ *   done: false,
+ *   data: { content: 'Hello, ' }
+ * };
+ *
+ * const finalChunk: StreamChunk<{ content: string }> = {
+ *   done: true
+ * };
+ * ```
+ */
+export interface StreamChunk<T = unknown> {
+  /** Indicates if this is the final chunk in the stream */
+  done: boolean;
+  /** The chunk data (absent in final chunk) */
+  data?: T;
+  /** Error information if the stream encountered an error */
+  error?: ApiError;
+}
+ 
+// ============================================================================
+// Factory Functions
+// ============================================================================
+ 
+/**
+ * Creates a successful API response.
+ *
+ * @template T - The type of data in the response
+ * @param data - The response data
+ * @param meta - Optional response metadata
+ * @returns A properly formatted success response
+ *
+ * @example
+ * ```typescript
+ * const response = createSuccessResponse(agent, { requestId: 'req-123' });
+ * ```
+ */
+export function createSuccessResponse<T>(
+  data: T,
+  meta?: ResponseMetadata
+): ApiResponse<T> {
+  return { success: true, data, meta };
+}
+ 
+/**
+ * Creates an error API response.
+ *
+ * @template T - The type that would have been returned on success
+ * @param error - The error information
+ * @param meta - Optional response metadata
+ * @returns A properly formatted error response
+ *
+ * @example
+ * ```typescript
+ * const response = createErrorResponse(
+ *   { code: 'NOT_FOUND', message: 'Agent not found' },
+ *   { requestId: 'req-123' }
+ * );
+ * ```
+ */
+export function createErrorResponse<T>(
+  error: ApiError,
+  meta?: ResponseMetadata
+): ApiResponse<T> {
+  return { success: false, error, meta };
+}
+ 
+/**
+ * Creates a paginated response.
+ *
+ * @template T - The type of items in the response
+ * @param items - Array of items for the current page
+ * @param total - Total number of items across all pages
+ * @param page - Current page number
+ * @param pageSize - Number of items per page
+ * @returns A properly formatted paginated response
+ *
+ * @example
+ * ```typescript
+ * const response = createPaginatedResponse(agents, 100, 1, 20);
+ * ```
+ */
+export function createPaginatedResponse<T>(
+  items: T[],
+  total: number,
+  page: number,
+  pageSize: number
+): PaginatedResponse<T> {
+  return {
+    items,
+    total,
+    page,
+    pageSize,
+    hasMore: page * pageSize < total,
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/automation.ts.html b/desktop/coverage/src/types/automation.ts.html new file mode 100644 index 0000000..ae55e85 --- /dev/null +++ b/desktop/coverage/src/types/automation.ts.html @@ -0,0 +1,1216 @@ + + + + + + Code coverage report for src/types/automation.ts + + + + + + + + + +
+
+

All files / src/types automation.ts

+
+ +
+ 0% + Statements + 0/179 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/179 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Automation Type Adapters for ZCLAW
+ *
+ * This module provides unified types for the Automation system,
+ * combining Hands and Workflows into a single AutomationItem type.
+ *
+ * @module types/automation
+ */
+ 
+import type { Hand, HandStatus, HandParameter } from './hands';
+import { HAND_DEFINITIONS } from './hands';
+import type { Workflow, WorkflowRunStatus } from './workflow';
+import { HAND_CATEGORY_MAP } from '../constants/hands';
+ 
+// === Category Types ===
+ 
+/**
+ * Category types for classifying automation items
+ */
+export type CategoryType = 'all' | 'research' | 'data' | 'automation' | 'communication' | 'content' | 'productivity';
+ 
+/**
+ * Category configuration for display
+ */
+export interface CategoryConfig {
+  id: CategoryType;
+  label: string;
+  icon: string;
+  description: string;
+}
+ 
+/**
+ * Category statistics for filtering UI
+ */
+export interface CategoryStats {
+  all: number;
+  research: number;
+  data: number;
+  automation: number;
+  communication: number;
+  content: number;
+  productivity: number;
+}
+ 
+// === Category Mapping for Hands ===
+// Re-export from constants for backward compatibility
+export { HAND_CATEGORY_MAP, getHandCategory } from '../constants/hands';
+ 
+// Re-export category type for backward compatibility
+export type { HandCategoryType } from '../constants/hands';
+ 
+/**
+ * Category configurations for UI display
+ */
+export const CATEGORY_CONFIGS: Record<CategoryType, CategoryConfig> = {
+  all: {
+    id: 'all',
+    label: '全部',
+    icon: 'Layers',
+    description: '所有自动化项目',
+  },
+  research: {
+    id: 'research',
+    label: '研究',
+    icon: 'Search',
+    description: '深度研究和浏览器自动化',
+  },
+  data: {
+    id: 'data',
+    label: '数据',
+    icon: 'Database',
+    description: '数据收集和预测分析',
+  },
+  automation: {
+    id: 'automation',
+    label: '自动化',
+    icon: 'Zap',
+    description: '工作流和触发器',
+  },
+  communication: {
+    id: 'communication',
+    label: '通信',
+    icon: 'MessageSquare',
+    description: '销售线索和社交媒体',
+  },
+  content: {
+    id: 'content',
+    label: '内容',
+    icon: 'Video',
+    description: '视频和内容处理',
+  },
+  productivity: {
+    id: 'productivity',
+    label: '生产力',
+    icon: 'TrendingUp',
+    description: '效率提升工具',
+  },
+};
+ 
+// === Automation Item (Unified Type) ===
+ 
+/**
+ * Execution status for automation items
+ */
+export type AutomationStatus = 'idle' | 'running' | 'needs_approval' | 'error' | 'unavailable' | 'setup_needed' | 'completed' | 'paused';
+ 
+/**
+ * Item type discriminator
+ */
+export type AutomationType = 'hand' | 'workflow';
+ 
+/**
+ * Run information for last execution
+ */
+export interface RunInfo {
+  runId: string;
+  status: AutomationStatus;
+  startedAt: string;
+  completedAt?: string;
+  duration?: number;
+  output?: unknown;
+  error?: string;
+}
+ 
+/**
+ * Schedule information for automation items
+ */
+export interface ScheduleInfo {
+  enabled: boolean;
+  frequency: 'once' | 'daily' | 'weekly' | 'monthly' | 'custom';
+  time: { hour: number; minute: number };
+  daysOfWeek?: number[];           // 0-6 for weekly
+  dayOfMonth?: number;             // 1-31 for monthly
+  customCron?: string;             // Advanced mode
+  timezone: string;
+  endDate?: string;
+  nextRun?: string;
+}
+ 
+/**
+ * Unified automation item type
+ * Adapts both Hand and Workflow into a common interface
+ */
+export interface AutomationItem {
+  // Identity
+  id: string;
+  name: string;
+  description: string;
+  type: AutomationType;
+  category: CategoryType;
+ 
+  // Status
+  status: AutomationStatus;
+  error?: string;
+ 
+  // Configuration
+  parameters?: HandParameter[];
+  requiresApproval: boolean;
+ 
+  // Execution info
+  lastRun?: RunInfo;
+  schedule?: ScheduleInfo;
+  currentRunId?: string;
+ 
+  // Display
+  icon?: string;
+ 
+  // Type-specific data
+  handData?: Hand;
+  workflowData?: Workflow;
+}
+ 
+// === Type Adapters ===
+ 
+/**
+ * Converts Hand status to Automation status
+ */
+export function handStatusToAutomationStatus(status: HandStatus): AutomationStatus {
+  const statusMap: Record<HandStatus, AutomationStatus> = {
+    idle: 'idle',
+    running: 'running',
+    needs_approval: 'needs_approval',
+    error: 'error',
+    unavailable: 'unavailable',
+    setup_needed: 'setup_needed',
+  };
+  return statusMap[status] || 'unavailable';
+}
+ 
+/**
+ * Converts Workflow run status to Automation status
+ */
+export function workflowStatusToAutomationStatus(status: WorkflowRunStatus): AutomationStatus {
+  const statusMap: Record<WorkflowRunStatus, AutomationStatus> = {
+    pending: 'idle',
+    running: 'running',
+    completed: 'completed',
+    failed: 'error',
+    cancelled: 'idle',
+    paused: 'paused',
+  };
+  return statusMap[status] || 'idle';
+}
+ 
+/**
+ * Adapts a Hand to an AutomationItem
+ * Merges name, description, and parameters from HAND_DEFINITIONS (中文优先)
+ */
+export function handToAutomationItem(hand: Hand): AutomationItem {
+  const category = HAND_CATEGORY_MAP[hand.id] || HAND_CATEGORY_MAP[hand.name.toLowerCase()] || 'productivity';
+ 
+  // Normalize hand id/name for matching (remove " Hand" suffix if present)
+  const normalizedId = hand.id.toLowerCase().replace(/\s*hand$/i, '');
+  const normalizedName = hand.name.toLowerCase().replace(/\s*hand$/i, '');
+ 
+  // Find matching definition by id or name to get Chinese content
+  const definition = HAND_DEFINITIONS.find(
+    d => d.id === normalizedId || d.id === normalizedName || d.id === hand.id.toLowerCase()
+  );
+ 
+  // Use Chinese name and description from definition, fall back to API data
+  const name = definition?.name || hand.name;
+  const description = definition?.description || hand.description;
+ 
+  // Try to get parameters from hand, or fall back to HAND_DEFINITIONS
+  let parameters = hand.parameters;
+  if ((!parameters || parameters.length === 0) && definition) {
+    parameters = definition.parameters;
+  }
+ 
+  return {
+    id: hand.id,
+    name,
+    description,
+    type: 'hand',
+    category,
+    status: handStatusToAutomationStatus(hand.status),
+    error: hand.error,
+    parameters,
+    requiresApproval: false, // Will be determined by execution result
+    lastRun: hand.lastRun ? {
+      runId: hand.lastRun,
+      status: 'completed',
+      startedAt: hand.lastRun,
+    } : undefined,
+    icon: hand.icon,
+    handData: hand,
+  };
+}
+ 
+/**
+ * Adapts a Workflow to an AutomationItem
+ * Handles both store Workflow (steps: number) and full Workflow (steps: WorkflowStep[])
+ */
+export function workflowToAutomationItem(workflow: Workflow | { id: string; name: string; steps: number; description?: string; createdAt?: string }): AutomationItem {
+  // For store workflows with steps as number, default to automation category
+  const stepsArray = Array.isArray(workflow.steps) ? workflow.steps : [];
+ 
+  // Determine category based on workflow steps (only if steps is an array)
+  let category: CategoryType = 'automation';
+  if (stepsArray.length > 0 && 'handName' in stepsArray[0]) {
+    const typedSteps = stepsArray as Array<{ handName?: string }>;
+    if (typedSteps.some(s => s.handName === 'researcher' || s.handName === 'browser')) {
+      category = 'research';
+    } else if (typedSteps.some(s => s.handName === 'collector' || s.handName === 'predictor')) {
+      category = 'data';
+    } else if (typedSteps.some(s => s.handName === 'lead' || s.handName === 'twitter')) {
+      category = 'communication';
+    } else if (typedSteps.some(s => s.handName === 'clip')) {
+      category = 'content';
+    }
+  }
+ 
+  return {
+    id: workflow.id,
+    name: workflow.name,
+    description: workflow.description || '',
+    type: 'workflow',
+    category,
+    status: 'idle',
+    requiresApproval: false,
+    workflowData: 'steps' in workflow && Array.isArray(workflow.steps) ? workflow as Workflow : undefined,
+  };
+}
+ 
+/**
+ * Store Workflow type (from gatewayStore/workflowStore)
+ * Has steps as number (count) instead of array
+ */
+export interface StoreWorkflow {
+  id: string;
+  name: string;
+  steps: number;
+  description?: string;
+  createdAt?: string;
+}
+ 
+/**
+ * Adapts an array of Hands and Workflows to AutomationItems
+ * Accepts both full Workflow type and store Workflow type
+ */
+export function adaptToAutomationItems(
+  hands: Hand[] = [],
+  workflows: (Workflow | StoreWorkflow)[] = []
+): AutomationItem[] {
+  const handItems = hands.map(handToAutomationItem);
+  const workflowItems = workflows.map(workflowToAutomationItem);
+  return [...handItems, ...workflowItems];
+}
+ 
+/**
+ * Calculates category statistics from automation items
+ */
+export function calculateCategoryStats(items: AutomationItem[]): CategoryStats {
+  const stats: CategoryStats = {
+    all: items.length,
+    research: 0,
+    data: 0,
+    automation: 0,
+    communication: 0,
+    content: 0,
+    productivity: 0,
+  };
+ 
+  for (const item of items) {
+    if (item.category !== 'all') {
+      stats[item.category]++;
+    }
+  }
+ 
+  return stats;
+}
+ 
+/**
+ * Filters automation items by category
+ */
+export function filterByCategory(items: AutomationItem[], category: CategoryType): AutomationItem[] {
+  if (category === 'all') {
+    return items;
+  }
+  return items.filter(item => item.category === category);
+}
+ 
+/**
+ * Filters automation items by type
+ */
+export function filterByType(items: AutomationItem[], type: AutomationType | 'all'): AutomationItem[] {
+  if (type === 'all') {
+    return items;
+  }
+  return items.filter(item => item.type === type);
+}
+ 
+/**
+ * Filters automation items by status
+ */
+export function filterByStatus(items: AutomationItem[], statuses: AutomationStatus[]): AutomationItem[] {
+  if (statuses.length === 0) {
+    return items;
+  }
+  return items.filter(item => statuses.includes(item.status));
+}
+ 
+/**
+ * Searches automation items by name or description
+ */
+export function searchAutomationItems(items: AutomationItem[], query: string): AutomationItem[] {
+  if (!query.trim()) {
+    return items;
+  }
+  const lowerQuery = query.toLowerCase();
+  return items.filter(
+    item =>
+      item.name.toLowerCase().includes(lowerQuery) ||
+      item.description.toLowerCase().includes(lowerQuery)
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/config.ts.html b/desktop/coverage/src/types/config.ts.html new file mode 100644 index 0000000..eadd326 --- /dev/null +++ b/desktop/coverage/src/types/config.ts.html @@ -0,0 +1,1804 @@ + + + + + + Code coverage report for src/types/config.ts + + + + + + + + + +
+
+

All files / src/types config.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * OpenFang Configuration Type Definitions
+ *
+ * TypeScript types for OpenFang TOML configuration files.
+ * These types correspond to the configuration schema in config/config.toml.
+ *
+ * @module types/config
+ */
+ 
+// ============================================================
+// Server Configuration
+// ============================================================
+ 
+/**
+ * Server configuration settings
+ */
+export interface ServerConfig {
+  /** gRPC server host */
+  host: string;
+  /** gRPC server port */
+  port: number;
+  /** WebSocket port (defaults to same as gRPC port) */
+  websocket_port?: number;
+  /** WebSocket path */
+  websocket_path?: string;
+  /** CORS allowed origins */
+  cors_origins?: string[];
+  /** API version prefix */
+  api_version?: string;
+}
+ 
+// ============================================================
+// Agent Configuration
+// ============================================================
+ 
+/**
+ * Sandbox configuration for agent operations
+ */
+export interface SandboxConfig {
+  /** Sandbox root directory */
+  workspace_root: string;
+  /** Allowed shell commands (empty = all allowed) */
+  allowed_commands?: string[];
+  /** Enable shell execution */
+  shell_enabled: boolean;
+  /** Network access in sandbox */
+  network_enabled: boolean;
+}
+ 
+/**
+ * Memory configuration for conversations
+ */
+export interface MemoryConfig {
+  /** Maximum conversation history length */
+  max_history_length: number;
+  /** Threshold for summarization */
+  summarize_threshold: number;
+}
+ 
+/**
+ * Agent defaults configuration
+ */
+export interface AgentDefaultsConfig {
+  /** Default workspace for agent operations */
+  workspace: string;
+  /** Default model for new sessions */
+  default_model: string;
+  /** Fallback models if primary fails */
+  fallback_models?: string[];
+  /** Heartbeat interval for agent health checks */
+  heartbeat_interval?: string;
+  /** Session timeout */
+  session_timeout?: string;
+  /** Maximum concurrent sessions */
+  max_sessions?: number;
+  /** Sandbox settings */
+  sandbox?: SandboxConfig;
+  /** Memory settings */
+  memory?: MemoryConfig;
+}
+ 
+/**
+ * Agent configuration section in TOML
+ * Represents the [agent] section in config.toml
+ */
+export interface AgentSectionConfig {
+  /** Default agent settings */
+  defaults: AgentDefaultsConfig;
+}
+ 
+// ============================================================
+// Skills Configuration
+// ============================================================
+ 
+/**
+ * Skills configuration
+ */
+export interface SkillsConfig {
+  /** Additional skill directories to load */
+  extra_dirs?: string[];
+  /** Enable hot reload for skill development */
+  hot_reload?: boolean;
+  /** Skill execution timeout */
+  execution_timeout?: string;
+}
+ 
+// ============================================================
+// Hands Configuration
+// ============================================================
+ 
+/**
+ * Hands (autonomous capabilities) configuration
+ */
+export interface HandsConfig {
+  /** Additional hand directories to load */
+  extra_dirs?: string[];
+  /** Default approval mode: "auto", "manual", "smart" */
+  default_approval_mode?: 'auto' | 'manual' | 'smart';
+  /** Maximum concurrent hand executions */
+  max_concurrent?: number;
+  /** Hand execution timeout */
+  execution_timeout?: string;
+  /** Enable audit logging */
+  audit_enabled?: boolean;
+  /** Audit log file path */
+  audit_log_path?: string;
+}
+ 
+// ============================================================
+// LLM Configuration
+// ============================================================
+ 
+/**
+ * LLM model configuration
+ */
+export interface LLMModelConfig {
+  /** Model identifier */
+  id: string;
+  /** Human-readable alias */
+  alias?: string;
+  /** Context window size */
+  context_window?: number;
+  /** Maximum output tokens */
+  max_output_tokens?: number;
+  /** Supports streaming */
+  supports_streaming?: boolean;
+  /** Supports vision/images */
+  supports_vision?: boolean;
+}
+ 
+/**
+ * LLM provider configuration
+ */
+export interface LLMProviderConfig {
+  /** Provider name (e.g., "zhipu", "qwen") */
+  name: string;
+  /** Display name for UI */
+  display_name?: string;
+  /** API key (may contain env var reference) */
+  api_key: string;
+  /** API base URL */
+  base_url?: string;
+  /** Available models */
+  models?: LLMModelConfig[];
+}
+ 
+/**
+ * LLM rate limiting configuration
+ */
+export interface LLMRateLimitConfig {
+  /** Requests per minute */
+  requests_per_minute?: number;
+  /** Tokens per minute */
+  tokens_per_minute?: number;
+}
+ 
+/**
+ * LLM retry configuration
+ */
+export interface LLMRetryConfig {
+  /** Maximum retry attempts */
+  max_retries?: number;
+  /** Delay between retries */
+  retry_delay?: string;
+}
+ 
+/**
+ * LLM configuration
+ */
+export interface LLMConfig {
+  /** Default provider name */
+  default_provider: string;
+  /** Default model name */
+  default_model: string;
+  /** Rate limiting settings */
+  requests_per_minute?: number;
+  tokens_per_minute?: number;
+  /** Retry settings */
+  max_retries?: number;
+  retry_delay?: string;
+  /** Model aliases */
+  aliases?: Record<string, string>;
+  /** Provider configurations */
+  providers?: LLMProviderConfig[];
+}
+ 
+// ============================================================
+// Security Configuration
+// ============================================================
+ 
+/**
+ * Authentication configuration
+ */
+export interface SecurityAuthConfig {
+  /** JWT token expiration */
+  token_expiration?: string;
+  /** Ed25519 key rotation interval */
+  key_rotation_interval?: string;
+}
+ 
+/**
+ * RBAC configuration
+ */
+export interface SecurityRBACConfig {
+  /** Enable RBAC */
+  enabled?: boolean;
+  /** Default role for new users */
+  default_role?: string;
+}
+ 
+/**
+ * Rate limiting configuration
+ */
+export interface SecurityRateLimitConfig {
+  /** Enable rate limiting */
+  enabled?: boolean;
+  /** Requests per second */
+  requests_per_second?: number;
+  /** Burst size */
+  burst_size?: number;
+}
+ 
+/**
+ * Audit logging configuration
+ */
+export interface SecurityAuditConfig {
+  /** Enable audit logging */
+  enabled?: boolean;
+  /** Log file path */
+  log_path?: string;
+  /** Log format */
+  log_format?: 'json' | 'text';
+}
+ 
+/**
+ * Security configuration
+ */
+export interface SecurityConfig {
+  /** Enable all security layers */
+  enabled?: boolean;
+  /** Authentication settings */
+  auth?: SecurityAuthConfig;
+  /** RBAC settings */
+  rbac?: SecurityRBACConfig;
+  /** Rate limiting settings */
+  rate_limit?: SecurityRateLimitConfig;
+  /** Audit logging settings */
+  audit?: SecurityAuditConfig;
+}
+ 
+// ============================================================
+// Logging Configuration
+// ============================================================
+ 
+/**
+ * File logging configuration
+ */
+export interface LogFileConfig {
+  /** Enable file logging */
+  enabled?: boolean;
+  /** Log file path */
+  path?: string;
+  /** Maximum file size */
+  max_size?: string;
+  /** Maximum number of files */
+  max_files?: number;
+  /** Compress old files */
+  compress?: boolean;
+}
+ 
+/**
+ * Console logging configuration
+ */
+export interface LogConsoleConfig {
+  /** Enable console logging */
+  enabled?: boolean;
+  /** Colorize output */
+  colorize?: boolean;
+}
+ 
+/**
+ * Logging configuration
+ */
+export interface LoggingConfig {
+  /** Log level */
+  level?: 'trace' | 'debug' | 'info' | 'warn' | 'error';
+  /** Log format */
+  format?: 'json' | 'pretty' | 'compact';
+  /** File logging settings */
+  file?: LogFileConfig;
+  /** Console logging settings */
+  console?: LogConsoleConfig;
+}
+ 
+// ============================================================
+// Channels (Integrations) Configuration
+// ============================================================
+ 
+/**
+ * Feishu channel configuration
+ */
+export interface FeishuChannelConfig {
+  /** Enable Feishu integration */
+  enabled?: boolean;
+  /** Default settings */
+  default?: {
+    app_id?: string;
+    app_secret?: string;
+    enabled?: boolean;
+  };
+}
+ 
+/**
+ * Channels configuration
+ */
+export interface ChannelsConfig {
+  /** Feishu integration */
+  feishu?: FeishuChannelConfig;
+}
+ 
+// ============================================================
+// Tools Configuration
+// ============================================================
+ 
+/**
+ * Shell execution tool configuration
+ */
+export interface ToolExecConfig {
+  /** Enable shell execution */
+  shell_enabled?: boolean;
+  /** Execution timeout */
+  timeout?: string;
+}
+ 
+/**
+ * Web search tool configuration
+ */
+export interface ToolWebSearchConfig {
+  /** Enable web search */
+  enabled?: boolean;
+  /** Default search engine */
+  default_engine?: string;
+  /** Maximum results */
+  max_results?: number;
+}
+ 
+/**
+ * Web tools configuration
+ */
+export interface ToolWebConfig {
+  /** Web search settings */
+  search?: ToolWebSearchConfig;
+}
+ 
+/**
+ * File system tool configuration
+ */
+export interface ToolFsConfig {
+  /** Allowed paths */
+  allowed_paths?: string[];
+  /** Maximum file size */
+  max_file_size?: string;
+}
+ 
+/**
+ * Tools configuration
+ */
+export interface ToolsConfig {
+  /** Shell execution tool */
+  exec?: ToolExecConfig;
+  /** Web tools */
+  web?: ToolWebConfig;
+  /** File system tool */
+  fs?: ToolFsConfig;
+}
+ 
+// ============================================================
+// Workflow Configuration
+// ============================================================
+ 
+/**
+ * Workflow trigger configuration
+ */
+export interface WorkflowTriggersConfig {
+  /** Enable triggers */
+  enabled?: boolean;
+  /** Maximum scheduled triggers */
+  max_scheduled?: number;
+}
+ 
+/**
+ * Workflow configuration
+ */
+export interface WorkflowConfig {
+  /** Workflow storage path */
+  storage_path?: string;
+  /** Maximum steps per workflow */
+  max_steps?: number;
+  /** Step timeout */
+  step_timeout?: string;
+  /** Trigger settings */
+  triggers?: WorkflowTriggersConfig;
+}
+ 
+// ============================================================
+// Desktop Client Configuration
+// ============================================================
+ 
+/**
+ * Desktop UI configuration
+ */
+export interface DesktopUIConfig {
+  /** Default theme */
+  default_theme?: 'light' | 'dark' | 'system';
+  /** Theme transition duration in ms */
+  theme_transition_ms?: number;
+  /** Enable animations */
+  animations_enabled?: boolean;
+  /** Animation duration in ms */
+  animation_duration_ms?: number;
+}
+ 
+/**
+ * Desktop connection configuration
+ */
+export interface DesktopConnectionConfig {
+  /** Auto reconnect on disconnect */
+  auto_reconnect?: boolean;
+  /** Reconnect delay in ms */
+  reconnect_delay_ms?: number;
+  /** Maximum reconnect attempts */
+  max_reconnect_attempts?: number;
+  /** Connection timeout in ms */
+  connection_timeout_ms?: number;
+  /** Request timeout in ms */
+  request_timeout_ms?: number;
+}
+ 
+/**
+ * Desktop client configuration
+ */
+export interface DesktopConfig {
+  /** UI settings */
+  ui?: DesktopUIConfig;
+  /** Connection settings */
+  connection?: DesktopConnectionConfig;
+}
+ 
+// ============================================================
+// Development Configuration
+// ============================================================
+ 
+/**
+ * Development/debug configuration
+ */
+export interface DevelopmentConfig {
+  /** Enable debug mode */
+  debug?: boolean;
+  /** Verbose logging */
+  verbose?: boolean;
+  /** Mock LLM for testing */
+  mock_llm?: boolean;
+  /** Enable profiling */
+  profiling_enabled?: boolean;
+  /** Profiling port */
+  profiling_port?: number;
+}
+ 
+// ============================================================
+// Root Configuration
+// ============================================================
+ 
+/**
+ * Complete OpenFang configuration
+ */
+export interface OpenFangConfig {
+  /** Server settings */
+  server: ServerConfig;
+  /** Agent settings */
+  agent: AgentSectionConfig;
+  /** Skills settings */
+  skills?: SkillsConfig;
+  /** Hands settings */
+  hands?: HandsConfig;
+  /** LLM settings */
+  llm: LLMConfig;
+  /** Security settings */
+  security?: SecurityConfig;
+  /** Logging settings */
+  logging?: LoggingConfig;
+  /** Channels/integrations settings */
+  channels?: ChannelsConfig;
+  /** Tools settings */
+  tools?: ToolsConfig;
+  /** Workflow settings */
+  workflow?: WorkflowConfig;
+  /** Desktop client settings */
+  desktop?: DesktopConfig;
+  /** Development settings */
+  development?: DevelopmentConfig;
+}
+ 
+/**
+ * Configuration validation result
+ */
+export interface ConfigValidationResult {
+  /** Whether the configuration is valid */
+  valid: boolean;
+  /** Validation errors */
+  errors: ConfigValidationError[];
+  /** Validation warnings */
+  warnings: ConfigValidationWarning[];
+}
+ 
+/**
+ * Configuration validation error
+ */
+export interface ConfigValidationError {
+  /** Field path (dot-notation) */
+  path: string;
+  /** Error message */
+  message: string;
+  /** Error severity */
+  severity: 'error';
+}
+ 
+/**
+ * Configuration validation warning
+ */
+export interface ConfigValidationWarning {
+  /** Field path (dot-notation) */
+  path: string;
+  /** Warning message */
+  message: string;
+  /** Warning severity */
+  severity: 'warning';
+}
+ 
+/**
+ * Configuration file metadata
+ */
+export interface ConfigFileMetadata {
+  /** File path */
+  path: string;
+  /** File name */
+  name: string;
+  /** Last modified timestamp */
+  modified?: number;
+  /** Environment variables found in the file */
+  envVars?: string[];
+  /** Whether the file has unresolved env vars */
+  hasUnresolvedEnvVars?: boolean;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/errors.ts.html b/desktop/coverage/src/types/errors.ts.html new file mode 100644 index 0000000..7189259 --- /dev/null +++ b/desktop/coverage/src/types/errors.ts.html @@ -0,0 +1,2602 @@ + + + + + + Code coverage report for src/types/errors.ts + + + + + + + + + +
+
+

All files / src/types errors.ts

+
+ +
+ 0% + Statements + 0/552 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/552 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Error Type Hierarchy for OpenFang/ZCLAW
+ *
+ * Comprehensive error types for type-safe error handling across
+ * the OpenFang desktop client application.
+ *
+ * @module types/errors
+ */
+ 
+/**
+ * Error codes enum for standardized error identification
+ */
+export enum ErrorCode {
+  // Network errors
+  NETWORK_ERROR = 'NETWORK_ERROR',
+  CONNECTION_TIMEOUT = 'CONNECTION_TIMEOUT',
+  CONNECTION_REFUSED = 'CONNECTION_REFUSED',
+ 
+  // Authentication errors
+  AUTH_FAILED = 'AUTH_FAILED',
+  AUTH_TOKEN_EXPIRED = 'AUTH_TOKEN_EXPIRED',
+  AUTH_INVALID_CREDENTIALS = 'AUTH_INVALID_CREDENTIALS',
+  AUTH_DEVICE_NOT_PAIRED = 'AUTH_DEVICE_NOT_PAIRED',
+ 
+  // Authorization errors
+  FORBIDDEN = 'FORBIDDEN',
+  RBAC_PERMISSION_DENIED = 'RBAC_PERMISSION_DENIED',
+ 
+  // Validation errors
+  VALIDATION_ERROR = 'VALIDATION_ERROR',
+  INVALID_INPUT = 'INVALID_INPUT',
+  INVALID_JSON = 'INVALID_JSON',
+  INVALID_TOML = 'INVALID_TOML',
+ 
+  // Resource errors
+  NOT_FOUND = 'NOT_FOUND',
+  ALREADY_EXISTS = 'ALREADY_EXISTS',
+  RESOURCE_EXHAUSTED = 'RESOURCE_EXHAUSTED',
+ 
+  // Rate limiting
+  RATE_LIMITED = 'RATE_LIMITED',
+ 
+  // Server errors
+  INTERNAL_ERROR = 'INTERNAL_ERROR',
+  SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',
+ 
+  // WebSocket errors
+  WS_CONNECTION_ERROR = 'WS_CONNECTION_ERROR',
+  WS_MESSAGE_ERROR = 'WS_MESSAGE_ERROR',
+ 
+  // Storage errors
+  STORAGE_ERROR = 'STORAGE_ERROR',
+  STORAGE_KEYRING_UNAVAILABLE = 'STORAGE_KEYRING_UNAVAILABLE',
+ 
+  // Hand/Workflow errors
+  HAND_EXECUTION_ERROR = 'HAND_EXECUTION_ERROR',
+  HAND_APPROVAL_REQUIRED = 'HAND_APPROVAL_REQUIRED',
+  WORKFLOW_ERROR = 'WORKFLOW_ERROR',
+}
+ 
+/**
+ * Base application error class
+ *
+ * All custom errors in the application should extend this class
+ * to ensure consistent error handling and serialization.
+ */
+export class AppError extends Error {
+  constructor(
+    public readonly code: ErrorCode,
+    message: string,
+    public readonly details?: Record<string, unknown>,
+    public readonly cause?: Error
+  ) {
+    super(message);
+    this.name = 'AppError';
+ 
+    // Maintains proper stack trace for where our error was thrown (only available on V8)
+    if (Error.captureStackTrace) {
+      Error.captureStackTrace(this, AppError);
+    }
+  }
+ 
+  /**
+   * Serialize error to JSON for logging and transmission
+   */
+  toJSON(): Record<string, unknown> {
+    return {
+      name: this.name,
+      code: this.code,
+      message: this.message,
+      details: this.details,
+      cause: this.cause?.message,
+    };
+  }
+ 
+  /**
+   * Create a string representation of the error
+   */
+  override toString(): string {
+    return `${this.name} [${this.code}]: ${this.message}`;
+  }
+}
+ 
+/**
+ * Network-related errors
+ *
+ * Used for connection failures, timeouts, and other network-level issues.
+ */
+export class NetworkError extends AppError {
+  constructor(message: string, details?: Record<string, unknown>, cause?: Error) {
+    super(ErrorCode.NETWORK_ERROR, message, details, cause);
+    this.name = 'NetworkError';
+  }
+}
+ 
+/**
+ * Connection timeout error
+ */
+export class ConnectionTimeoutError extends AppError {
+  constructor(
+    public readonly endpoint: string,
+    public readonly timeoutMs: number,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.CONNECTION_TIMEOUT,
+      `Connection to ${endpoint} timed out after ${timeoutMs}ms`,
+      { endpoint, timeoutMs },
+      cause
+    );
+    this.name = 'ConnectionTimeoutError';
+  }
+}
+ 
+/**
+ * Connection refused error
+ */
+export class ConnectionRefusedError extends AppError {
+  constructor(
+    public readonly host: string,
+    public readonly port: number,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.CONNECTION_REFUSED,
+      `Connection refused to ${host}:${port}`,
+      { host, port },
+      cause
+    );
+    this.name = 'ConnectionRefusedError';
+  }
+}
+ 
+/**
+ * Authentication-related errors
+ *
+ * Used for authentication failures, expired tokens, and invalid credentials.
+ */
+export class AuthError extends AppError {
+  constructor(
+    code:
+      | ErrorCode.AUTH_FAILED
+      | ErrorCode.AUTH_TOKEN_EXPIRED
+      | ErrorCode.AUTH_INVALID_CREDENTIALS
+      | ErrorCode.AUTH_DEVICE_NOT_PAIRED,
+    message: string,
+    details?: Record<string, unknown>,
+    cause?: Error
+  ) {
+    super(code, message, details, cause);
+    this.name = 'AuthError';
+  }
+}
+ 
+/**
+ * Authorization/Permission errors
+ *
+ * Used when a user lacks permission to perform an action.
+ */
+export class ForbiddenError extends AppError {
+  constructor(
+    message: string,
+    public readonly resource?: string,
+    public readonly action?: string,
+    details?: Record<string, unknown>,
+    cause?: Error
+  ) {
+    super(ErrorCode.FORBIDDEN, message, { resource, action, ...details }, cause);
+    this.name = 'ForbiddenError';
+  }
+}
+ 
+/**
+ * RBAC Permission denied error
+ *
+ * Specific to OpenFang's role-based access control system.
+ */
+export class RBACPermissionDeniedError extends AppError {
+  constructor(
+    public readonly capability: string,
+    public readonly requiredRole?: string,
+    public readonly currentRole?: string,
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.RBAC_PERMISSION_DENIED,
+      `Permission denied for capability '${capability}'`,
+      { capability, requiredRole, currentRole, ...details }
+    );
+    this.name = 'RBACPermissionDeniedError';
+  }
+}
+ 
+/**
+ * Validation errors
+ *
+ * Used for input validation failures with field-level detail.
+ */
+export class ValidationError extends AppError {
+  constructor(
+    message: string,
+    public readonly fields?: Record<string, string[]>,
+    details?: Record<string, unknown>
+  ) {
+    super(ErrorCode.VALIDATION_ERROR, message, { fields, ...details });
+    this.name = 'ValidationError';
+  }
+ 
+  /**
+   * Get all field errors as a flat array
+   */
+  getAllFieldErrors(): string[] {
+    if (!this.fields) return [];
+    return Object.values(this.fields).flat();
+  }
+ 
+  /**
+   * Get errors for a specific field
+   */
+  getFieldErrors(fieldName: string): string[] {
+    return this.fields?.[fieldName] ?? [];
+  }
+}
+ 
+/**
+ * Invalid input error
+ *
+ * General-purpose input validation error.
+ */
+export class InvalidInputError extends AppError {
+  constructor(
+    public readonly field: string,
+    public readonly value: unknown,
+    reason: string,
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.INVALID_INPUT,
+      `Invalid input for field '${field}': ${reason}`,
+      { field, value: String(value), reason, ...details }
+    );
+    this.name = 'InvalidInputError';
+  }
+}
+ 
+/**
+ * JSON parsing errors
+ */
+export class JsonParseError extends AppError {
+  constructor(
+    message: string,
+    public readonly raw?: string,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.INVALID_JSON,
+      message,
+      { raw: raw?.substring(0, 100) },
+      cause
+    );
+    this.name = 'JsonParseError';
+  }
+}
+ 
+/**
+ * TOML parsing errors
+ *
+ * Specific to OpenFang's TOML configuration format.
+ */
+export class TomlParseError extends AppError {
+  constructor(
+    message: string,
+    public readonly raw?: string,
+    public readonly line?: number,
+    public readonly column?: number,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.INVALID_TOML,
+      message,
+      { raw: raw?.substring(0, 100), line, column },
+      cause
+    );
+    this.name = 'TomlParseError';
+  }
+}
+ 
+/**
+ * Resource not found errors
+ */
+export class NotFoundError extends AppError {
+  constructor(
+    public readonly resource: string,
+    public readonly identifier?: string,
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.NOT_FOUND,
+      `${resource}${identifier ? ` '${identifier}'` : ''} not found`,
+      { resource, identifier, ...details }
+    );
+    this.name = 'NotFoundError';
+  }
+}
+ 
+/**
+ * Resource already exists error
+ */
+export class AlreadyExistsError extends AppError {
+  constructor(
+    public readonly resource: string,
+    public readonly identifier?: string,
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.ALREADY_EXISTS,
+      `${resource}${identifier ? ` '${identifier}'` : ''} already exists`,
+      { resource, identifier, ...details }
+    );
+    this.name = 'AlreadyExistsError';
+  }
+}
+ 
+/**
+ * Resource exhausted error
+ *
+ * Used when quotas or limits are reached.
+ */
+export class ResourceExhaustedError extends AppError {
+  constructor(
+    public readonly resource: string,
+    public readonly limit?: number,
+    public readonly current?: number,
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.RESOURCE_EXHAUSTED,
+      `${resource} exhausted${limit !== undefined ? ` (limit: ${limit})` : ''}`,
+      { resource, limit, current, ...details }
+    );
+    this.name = 'ResourceExhaustedError';
+  }
+}
+ 
+/**
+ * Rate limiting errors
+ */
+export class RateLimitError extends AppError {
+  constructor(
+    message: string,
+    public readonly retryAfter?: number,
+    public readonly limit?: number,
+    details?: Record<string, unknown>
+  ) {
+    super(ErrorCode.RATE_LIMITED, message, { retryAfter, limit, ...details });
+    this.name = 'RateLimitError';
+  }
+ 
+  /**
+   * Check if retry is possible
+   */
+  canRetry(): boolean {
+    return this.retryAfter !== undefined && this.retryAfter > 0;
+  }
+ 
+  /**
+   * Get human-readable retry message
+   */
+  getRetryMessage(): string | null {
+    if (!this.canRetry()) return null;
+    const seconds = Math.ceil(this.retryAfter! / 1000);
+    return `Please try again in ${seconds} second${seconds !== 1 ? 's' : ''}`;
+  }
+}
+ 
+/**
+ * Internal server error
+ */
+export class InternalError extends AppError {
+  constructor(message: string, details?: Record<string, unknown>, cause?: Error) {
+    super(ErrorCode.INTERNAL_ERROR, message, details, cause);
+    this.name = 'InternalError';
+  }
+}
+ 
+/**
+ * Service unavailable error
+ */
+export class ServiceUnavailableError extends AppError {
+  constructor(
+    public readonly serviceName: string,
+    public readonly reason?: string,
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.SERVICE_UNAVAILABLE,
+      `${serviceName} is unavailable${reason ? `: ${reason}` : ''}`,
+      { serviceName, reason, ...details }
+    );
+    this.name = 'ServiceUnavailableError';
+  }
+}
+ 
+/**
+ * WebSocket-related errors
+ */
+export class WebSocketError extends AppError {
+  constructor(
+    code: ErrorCode.WS_CONNECTION_ERROR | ErrorCode.WS_MESSAGE_ERROR,
+    message: string,
+    public readonly readyState?: number,
+    details?: Record<string, unknown>,
+    cause?: Error
+  ) {
+    super(code, message, { readyState, ...details }, cause);
+    this.name = 'WebSocketError';
+  }
+}
+ 
+/**
+ * WebSocket connection error
+ */
+export class WebSocketConnectionError extends WebSocketError {
+  constructor(
+    public readonly url: string,
+    public readonly readyState?: number,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.WS_CONNECTION_ERROR,
+      `WebSocket connection failed to ${url}`,
+      readyState,
+      { url },
+      cause
+    );
+    this.name = 'WebSocketConnectionError';
+  }
+}
+ 
+/**
+ * WebSocket message error
+ */
+export class WebSocketMessageError extends WebSocketError {
+  constructor(
+    message: string,
+    public readonly messageType?: string,
+    public readonly rawData?: unknown,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.WS_MESSAGE_ERROR,
+      message,
+      undefined,
+      { messageType, rawData: String(rawData)?.substring(0, 100) },
+      cause
+    );
+    this.name = 'WebSocketMessageError';
+  }
+}
+ 
+/**
+ * Storage-related errors
+ */
+export class StorageError extends AppError {
+  constructor(
+    code: ErrorCode.STORAGE_ERROR | ErrorCode.STORAGE_KEYRING_UNAVAILABLE,
+    message: string,
+    public readonly key?: string,
+    details?: Record<string, unknown>,
+    cause?: Error
+  ) {
+    super(code, message, { key, ...details }, cause);
+    this.name = 'StorageError';
+  }
+}
+ 
+/**
+ * Keyring unavailable error
+ *
+ * Specific to Tauri's secure storage on systems without a keyring.
+ */
+export class KeyringUnavailableError extends StorageError {
+  constructor(
+    public readonly platform: string,
+    cause?: Error
+  ) {
+    super(
+      ErrorCode.STORAGE_KEYRING_UNAVAILABLE,
+      `Secure storage (keyring) unavailable on ${platform}`,
+      undefined,
+      { platform },
+      cause
+    );
+    this.name = 'KeyringUnavailableError';
+  }
+}
+ 
+/**
+ * Hand execution errors
+ *
+ * Specific to OpenFang's Hands system for autonomous capabilities.
+ */
+export class HandExecutionError extends AppError {
+  public readonly handId: string;
+  public readonly handName?: string;
+  public readonly phase?: 'init' | 'execute' | 'validate' | 'cleanup';
+ 
+  constructor(
+    handId: string,
+    message: string,
+    options?: {
+      handName?: string;
+      phase?: 'init' | 'execute' | 'validate' | 'cleanup';
+      details?: Record<string, unknown>;
+      cause?: Error;
+    }
+  ) {
+    super(
+      ErrorCode.HAND_EXECUTION_ERROR,
+      `Hand '${handId}'${options?.handName ? ` (${options.handName})` : ''} execution failed: ${message}`,
+      { handId, handName: options?.handName, phase: options?.phase, ...options?.details },
+      options?.cause
+    );
+    this.name = 'HandExecutionError';
+    this.handId = handId;
+    this.handName = options?.handName;
+    this.phase = options?.phase;
+  }
+}
+ 
+/**
+ * Hand approval required error
+ *
+ * Thrown when a Hand requires user approval before execution.
+ */
+export class HandApprovalRequiredError extends AppError {
+  constructor(
+    public readonly handId: string,
+    public readonly handName?: string,
+    public readonly approvalReason?: string,
+    public readonly riskLevel?: 'low' | 'medium' | 'high',
+    details?: Record<string, unknown>
+  ) {
+    super(
+      ErrorCode.HAND_APPROVAL_REQUIRED,
+      `Hand '${handId}' requires approval${approvalReason ? `: ${approvalReason}` : ''}`,
+      { handId, handName, approvalReason, riskLevel, ...details }
+    );
+    this.name = 'HandApprovalRequiredError';
+  }
+}
+ 
+/**
+ * Workflow execution errors
+ */
+export class WorkflowError extends AppError {
+  public readonly workflowId: string;
+  public readonly workflowName?: string;
+  public readonly stepId?: string;
+  public readonly stepIndex?: number;
+ 
+  constructor(
+    workflowId: string,
+    message: string,
+    options?: {
+      workflowName?: string;
+      stepId?: string;
+      stepIndex?: number;
+      details?: Record<string, unknown>;
+      cause?: Error;
+    }
+  ) {
+    super(
+      ErrorCode.WORKFLOW_ERROR,
+      `Workflow '${workflowId}'${options?.workflowName ? ` (${options.workflowName})` : ''} error: ${message}`,
+      {
+        workflowId,
+        workflowName: options?.workflowName,
+        stepId: options?.stepId,
+        stepIndex: options?.stepIndex,
+        ...options?.details,
+      },
+      options?.cause
+    );
+    this.name = 'WorkflowError';
+    this.workflowId = workflowId;
+    this.workflowName = options?.workflowName;
+    this.stepId = options?.stepId;
+    this.stepIndex = options?.stepIndex;
+  }
+}
+ 
+// ============ Type Guards ============
+ 
+/**
+ * Check if an error is an AppError
+ */
+export function isAppError(error: unknown): error is AppError {
+  return error instanceof AppError;
+}
+ 
+/**
+ * Check if an error is a NetworkError
+ */
+export function isNetworkError(error: unknown): error is NetworkError {
+  return error instanceof NetworkError;
+}
+ 
+/**
+ * Check if an error is an AuthError
+ */
+export function isAuthError(error: unknown): error is AuthError {
+  return error instanceof AuthError;
+}
+ 
+/**
+ * Check if an error is a ForbiddenError
+ */
+export function isForbiddenError(error: unknown): error is ForbiddenError {
+  return error instanceof ForbiddenError;
+}
+ 
+/**
+ * Check if an error is a ValidationError
+ */
+export function isValidationError(error: unknown): error is ValidationError {
+  return error instanceof ValidationError;
+}
+ 
+/**
+ * Check if an error is a NotFoundError
+ */
+export function isNotFoundError(error: unknown): error is NotFoundError {
+  return error instanceof NotFoundError;
+}
+ 
+/**
+ * Check if an error is a RateLimitError
+ */
+export function isRateLimitError(error: unknown): error is RateLimitError {
+  return error instanceof RateLimitError;
+}
+ 
+/**
+ * Check if an error is a WebSocketError
+ */
+export function isWebSocketError(error: unknown): error is WebSocketError {
+  return error instanceof WebSocketError;
+}
+ 
+/**
+ * Check if an error is a StorageError
+ */
+export function isStorageError(error: unknown): error is StorageError {
+  return error instanceof StorageError;
+}
+ 
+/**
+ * Check if an error is a HandExecutionError
+ */
+export function isHandExecutionError(error: unknown): error is HandExecutionError {
+  return error instanceof HandExecutionError;
+}
+ 
+/**
+ * Check if an error is a WorkflowError
+ */
+export function isWorkflowError(error: unknown): error is WorkflowError {
+  return error instanceof WorkflowError;
+}
+ 
+/**
+ * Check if an error has a specific error code
+ */
+export function hasErrorCode(error: unknown, code: ErrorCode): error is AppError {
+  return isAppError(error) && error.code === code;
+}
+ 
+/**
+ * Check if an error is retryable
+ */
+export function isRetryableError(error: unknown): boolean {
+  if (!isAppError(error)) return false;
+ 
+  const retryableCodes: ErrorCode[] = [
+    ErrorCode.NETWORK_ERROR,
+    ErrorCode.CONNECTION_TIMEOUT,
+    ErrorCode.CONNECTION_REFUSED,
+    ErrorCode.SERVICE_UNAVAILABLE,
+    ErrorCode.RATE_LIMITED,
+    ErrorCode.WS_CONNECTION_ERROR,
+  ];
+ 
+  return retryableCodes.includes(error.code);
+}
+ 
+// ============ Helper Functions ============
+ 
+/**
+ * Convert unknown error to AppError
+ *
+ * Useful for catch blocks where the error type is unknown.
+ */
+export function toAppError(error: unknown): AppError {
+  if (isAppError(error)) return error;
+ 
+  if (error instanceof Error) {
+    return new AppError(ErrorCode.INTERNAL_ERROR, error.message, undefined, error);
+  }
+ 
+  if (typeof error === 'string') {
+    return new AppError(ErrorCode.INTERNAL_ERROR, error);
+  }
+ 
+  return new AppError(ErrorCode.INTERNAL_ERROR, String(error));
+}
+ 
+/**
+ * Extract error message from unknown error
+ */
+export function getErrorMessage(error: unknown): string {
+  if (isAppError(error)) return error.message;
+  if (error instanceof Error) return error.message;
+  if (typeof error === 'string') return error;
+  return String(error);
+}
+ 
+/**
+ * Create an error from an HTTP response
+ */
+export async function createErrorFromResponse(
+  response: Response,
+  defaultMessage: string = 'Request failed'
+): Promise<AppError> {
+  const statusCode = response.status;
+ 
+  // Try to parse error details from response body
+  let errorDetails: Record<string, unknown> | undefined;
+  let errorMessage = defaultMessage;
+ 
+  try {
+    const body = await response.text();
+    if (body) {
+      try {
+        const parsed = JSON.parse(body);
+        errorMessage = parsed.message || parsed.error || defaultMessage;
+        errorDetails = parsed.details || { response: parsed };
+      } catch {
+        errorDetails = { responseBody: body.substring(0, 200) };
+      }
+    }
+  } catch {
+    // Ignore body parsing errors
+  }
+ 
+  // Map status codes to error types
+  switch (statusCode) {
+    case 400:
+      return new ValidationError(errorMessage, undefined, errorDetails);
+    case 401:
+      return new AuthError(ErrorCode.AUTH_FAILED, errorMessage, errorDetails);
+    case 403:
+      return new ForbiddenError(errorMessage, undefined, undefined, errorDetails);
+    case 404:
+      return new NotFoundError('Resource', undefined, errorDetails);
+    case 409:
+      return new AlreadyExistsError('Resource', undefined, errorDetails);
+    case 429: {
+      const retryAfter = response.headers.get('Retry-After');
+      return new RateLimitError(
+        errorMessage,
+        retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined,
+        undefined,
+        errorDetails
+      );
+    }
+    case 500:
+      return new InternalError(errorMessage, errorDetails);
+    case 503:
+      return new ServiceUnavailableError('Service', errorMessage, errorDetails);
+    default:
+      return new AppError(ErrorCode.INTERNAL_ERROR, errorMessage, {
+        statusCode,
+        ...errorDetails,
+      });
+  }
+}
+ 
+/**
+ * Create an error from a WebSocket close event
+ */
+export function createErrorFromCloseEvent(event: CloseEvent, url?: string): WebSocketConnectionError {
+  const closeCodeMap: Record<number, string> = {
+    1000: 'Normal closure',
+    1001: 'Going away',
+    1002: 'Protocol error',
+    1003: 'Unsupported data',
+    1005: 'No status received',
+    1006: 'Abnormal closure',
+    1007: 'Invalid frame payload data',
+    1008: 'Policy violation',
+    1009: 'Message too big',
+    1010: 'Mandatory extension missing',
+    1011: 'Internal server error',
+    1012: 'Service restart',
+    1013: 'Try again later',
+    1014: 'Bad gateway',
+    1015: 'TLS handshake failure',
+  };
+ 
+  const reason = event.reason || closeCodeMap[event.code] || 'Unknown reason';
+  const readyState = (event.target as WebSocket | null)?.readyState;
+ 
+  return new WebSocketConnectionError(
+    url || 'unknown',
+    readyState,
+    new Error(`WebSocket closed: ${event.code} - ${reason}`)
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/hands.ts.html b/desktop/coverage/src/types/hands.ts.html new file mode 100644 index 0000000..b733fa3 --- /dev/null +++ b/desktop/coverage/src/types/hands.ts.html @@ -0,0 +1,796 @@ + + + + + + Code coverage report for src/types/hands.ts + + + + + + + + + +
+
+

All files / src/types hands.ts

+
+ +
+ 0% + Statements + 0/139 +
+ + +
+ 100% + Branches + 1/1 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/139 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * OpenFang Hands and Workflow Types
+ *
+ * ZCLAW 提供 8 个自主能力包 (Hands):
+ * - Clip: 视频处理
+ * - Lead: 销售线索管理
+ * - Collector: 数据收集
+ * - Predictor: 预测分析
+ * - Researcher: 深度研究
+ * - Twitter: Twitter 自动化
+ * - Browser: 浏览器自动化
+ * - Trader: 交易分析
+ */
+ 
+export type HandStatus = 'idle' | 'running' | 'needs_approval' | 'error' | 'unavailable' | 'setup_needed';
+ 
+export type HandId = 'clip' | 'lead' | 'collector' | 'predictor' | 'researcher' | 'twitter' | 'browser' | 'trader';
+ 
+export type HandParameterType = 'text' | 'number' | 'select' | 'textarea' | 'boolean' | 'array' | 'object' | 'file';
+ 
+export interface HandParameter {
+  name: string;
+  label: string;
+  type: HandParameterType;
+  required: boolean;
+  placeholder?: string;
+  options?: Array<{ value: string; label: string }>;
+  defaultValue?: string | number | boolean | string[] | Record<string, unknown>;
+  description?: string;
+  min?: number;
+  max?: number;
+  pattern?: string;
+  accept?: string; // For file type - MIME types
+  itemType?: HandParameterType; // For array type - item type
+  properties?: Array<Omit<HandParameter, 'required'>>; // For object type - nested properties
+}
+ 
+export interface Hand {
+  id: string;  // Can be HandId or any string from backend
+  name: string;
+  description: string;
+  icon?: string;  // Optional, as backend may not provide it
+  status: HandStatus;
+  parameters?: HandParameter[];
+  lastRun?: string;
+  lastResult?: string;
+  error?: string;
+}
+ 
+export interface HandExecutionResult {
+  handId: HandId;
+  runId: string;
+  status: 'success' | 'error' | 'needs_approval';
+  output?: Record<string, unknown>;
+  error?: string;
+  completedAt: string;
+}
+ 
+export interface WorkflowStep {
+  handId: HandId;
+  name: string;
+  parameters?: Record<string, unknown>;
+  condition?: string;
+}
+ 
+export type WorkflowStatus = 'idle' | 'running' | 'completed' | 'error' | 'paused';
+ 
+export interface Workflow {
+  id: string;
+  name: string;
+  description: string;
+  steps: WorkflowStep[];
+  status: WorkflowStatus;
+  currentStep?: number;
+  lastRun?: string;
+  lastResult?: string;
+  error?: string;
+  createdAt: string;
+  updatedAt: string;
+}
+ 
+export interface WorkflowExecutionResult {
+  workflowId: string;
+  runId: string;
+  status: 'success' | 'error' | 'partial';
+  stepResults: Array<{
+    stepIndex: number;
+    handId: HandId;
+    status: 'success' | 'error' | 'skipped';
+    output?: Record<string, unknown>;
+    error?: string;
+  }>;
+  completedAt: string;
+}
+ 
+// Hand definitions with metadata (中文化)
+export const HAND_DEFINITIONS: Array<Omit<Hand, 'status' | 'lastRun' | 'lastResult' | 'error'>> = [
+  {
+    id: 'clip',
+    name: 'Clip 视频处理',
+    description: '将长视频转换为短视频片段,自动生成字幕和封面',
+    icon: 'Video',
+    parameters: [
+      { name: 'inputPath', label: '输入路径', type: 'text', required: true, placeholder: '视频文件或链接' },
+      { name: 'outputFormat', label: '输出格式', type: 'select', required: false, options: [
+        { value: 'mp4', label: 'MP4' },
+        { value: 'webm', label: 'WebM' },
+        { value: 'gif', label: 'GIF' },
+      ], defaultValue: 'mp4' },
+      { name: 'trimStart', label: '开始时间', type: 'number', required: false, placeholder: '秒' },
+      { name: 'trimEnd', label: '结束时间', type: 'number', required: false, placeholder: '秒' },
+    ],
+  },
+  {
+    id: 'lead',
+    name: 'Lead 线索发现',
+    description: '自动发现、丰富和交付合格的销售线索',
+    icon: 'UserPlus',
+    parameters: [
+      { name: 'source', label: '数据来源', type: 'select', required: true, options: [
+        { value: 'linkedin', label: 'LinkedIn' },
+        { value: 'crunchbase', label: 'Crunchbase' },
+        { value: 'custom', label: '自定义列表' },
+      ] },
+      { name: 'query', label: '搜索条件', type: 'textarea', required: true, placeholder: '输入搜索条件' },
+      { name: 'maxResults', label: '最大结果数', type: 'number', required: false, defaultValue: 50 },
+    ],
+  },
+  {
+    id: 'collector',
+    name: 'Collector 数据采集',
+    description: '自动收集和聚合数据,支持变更检测和知识图谱',
+    icon: 'Database',
+    parameters: [
+      { name: 'targetUrl', label: '目标网址', type: 'text', required: true, placeholder: '要采集的网址' },
+      { name: 'selector', label: 'CSS 选择器', type: 'text', required: false, placeholder: '要提取的元素' },
+      { name: 'outputFormat', label: '输出格式', type: 'select', required: false, options: [
+        { value: 'json', label: 'JSON' },
+        { value: 'csv', label: 'CSV' },
+        { value: 'xlsx', label: 'Excel' },
+      ], defaultValue: 'json' },
+      { name: 'pagination', label: '跟踪分页', type: 'boolean', required: false, defaultValue: false },
+    ],
+  },
+  {
+    id: 'predictor',
+    name: 'Predictor 预测分析',
+    description: '收集信号、构建推理链、进行校准预测并跟踪准确性',
+    icon: 'TrendingUp',
+    parameters: [
+      { name: 'dataSource', label: '数据源', type: 'text', required: true, placeholder: '数据文件路径或链接' },
+      { name: 'model', label: '模型类型', type: 'select', required: true, options: [
+        { value: 'regression', label: '回归分析' },
+        { value: 'classification', label: '分类预测' },
+        { value: 'timeseries', label: '时间序列' },
+      ] },
+      { name: 'targetColumn', label: '目标列', type: 'text', required: true },
+    ],
+  },
+  {
+    id: 'researcher',
+    name: 'Researcher 深度研究',
+    description: '进行详尽调查、交叉验证、事实核查和结构化报告',
+    icon: 'Search',
+    parameters: [
+      { name: 'topic', label: '研究主题', type: 'textarea', required: true, placeholder: '输入研究主题' },
+      { name: 'depth', label: '研究深度', type: 'select', required: false, options: [
+        { value: 'shallow', label: '快速概览' },
+        { value: 'medium', label: '标准研究' },
+        { value: 'deep', label: '深度分析' },
+      ], defaultValue: 'medium' },
+      { name: 'sources', label: '最大来源数', type: 'number', required: false, defaultValue: 10 },
+    ],
+  },
+  {
+    id: 'twitter',
+    name: 'Twitter 自动化',
+    description: 'Twitter/X 内容创作、定时发布、互动和效果跟踪',
+    icon: 'Twitter',
+    parameters: [
+      { name: 'action', label: '操作类型', type: 'select', required: true, options: [
+        { value: 'post', label: '发布推文' },
+        { value: 'search', label: '搜索推文' },
+        { value: 'analyze', label: '分析趋势' },
+        { value: 'engage', label: '互动 (点赞/回复)' },
+      ] },
+      { name: 'content', label: '内容', type: 'textarea', required: false, placeholder: '推文内容或搜索关键词' },
+      { name: 'schedule', label: '定时发布', type: 'text', required: false, placeholder: '时间或 "now"' },
+    ],
+  },
+  {
+    id: 'browser',
+    name: 'Browser 浏览器自动化',
+    description: '自动浏览网站、填写表单、点击按钮,完成多步骤网页任务',
+    icon: 'Globe',
+    parameters: [
+      { name: 'url', label: '起始网址', type: 'text', required: true, placeholder: 'https://example.com' },
+      { name: 'actions', label: '操作步骤', type: 'textarea', required: true, placeholder: '要执行的操作列表' },
+      { name: 'headless', label: '无头模式', type: 'boolean', required: false, defaultValue: true },
+      { name: 'timeout', label: '超时时间 (秒)', type: 'number', required: false, defaultValue: 30 },
+    ],
+  },
+  {
+    id: 'trader',
+    name: 'Trader 交易分析',
+    description: '多信号分析、多空推理、校准置信度评分、严格风险管理和投资组合分析',
+    icon: 'TrendingUp',
+    parameters: [
+      { name: 'symbol', label: '交易标的', type: 'text', required: true, placeholder: '股票代码或加密货币' },
+      { name: 'analysisType', label: '分析类型', type: 'select', required: false, options: [
+        { value: 'technical', label: '技术分析' },
+        { value: 'fundamental', label: '基本面分析' },
+        { value: 'sentiment', label: '情绪分析' },
+      ], defaultValue: 'technical' },
+      { name: 'timeframe', label: '时间周期', type: 'select', required: false, options: [
+        { value: '1h', label: '1小时' },
+        { value: '4h', label: '4小时' },
+        { value: '1d', label: '1天' },
+        { value: '1w', label: '1周' },
+      ], defaultValue: '1d' },
+    ],
+  },
+];
+ 
+// Helper function to get icon component name
+export function getHandIconComponent(iconName: string): string {
+  const iconMap: Record<string, string> = {
+    Video: 'Video',
+    UserPlus: 'UserPlus',
+    Database: 'Database',
+    TrendingUp: 'TrendingUp',
+    Search: 'Search',
+    Twitter: 'Twitter',
+    Globe: 'Globe',
+  };
+  return iconMap[iconName] || 'Box';
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/index.html b/desktop/coverage/src/types/index.html new file mode 100644 index 0000000..0858742 --- /dev/null +++ b/desktop/coverage/src/types/index.html @@ -0,0 +1,296 @@ + + + + + + Code coverage report for src/types + + + + + + + + + +
+
+

All files src/types

+
+ +
+ 0% + Statements + 0/903 +
+ + +
+ 84.61% + Branches + 11/13 +
+ + +
+ 84.61% + Functions + 11/13 +
+ + +
+ 0% + Lines + 0/903 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
active-learning.ts +
+
0%0/6100%1/1100%1/10%0/6
agent.ts +
+
0%0/00%1/10%1/10%0/0
api-responses.ts +
+
0%0/26100%1/1100%1/10%0/26
automation.ts +
+
0%0/1790%0/10%0/10%0/179
config.ts +
+
0%0/00%1/10%1/10%0/0
errors.ts +
+
0%0/552100%1/1100%1/10%0/552
hands.ts +
+
0%0/139100%1/1100%1/10%0/139
index.ts +
+
0%0/10%0/10%0/10%0/1
session.ts +
+
0%0/00%1/10%1/10%0/0
settings.ts +
+
0%0/00%1/10%1/10%0/0
skill-market.ts +
+
0%0/00%1/10%1/10%0/0
team.ts +
+
0%0/00%1/10%1/10%0/0
workflow.ts +
+
0%0/00%1/10%1/10%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/index.ts.html b/desktop/coverage/src/types/index.ts.html new file mode 100644 index 0000000..e0e79fd --- /dev/null +++ b/desktop/coverage/src/types/index.ts.html @@ -0,0 +1,622 @@ + + + + + + Code coverage report for src/types/index.ts + + + + + + + + + +
+
+

All files / src/types index.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/1 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * OpenFang Type Definitions
+ *
+ * This module exports all TypeScript type definitions for the
+ * OpenFang desktop client application.
+ *
+ * @module types
+ */
+ 
+// Agent Types
+export type {
+  Agent,
+  AgentConfig,
+  AgentStatus,
+  AgentListResponse,
+  AgentResponse,
+} from './agent';
+ 
+// Session Types
+export type {
+  Session,
+  SessionConfig,
+  SessionMessage,
+  MessageRole,
+  MessageMetadata,
+  SessionListResponse,
+  SessionMessagesResponse,
+  MessageStreamChunk,
+} from './session';
+ 
+// Settings Types
+export type {
+  QuickConfig,
+  MCPService,
+  ThemeMode,
+  AppSettings,
+  SettingsValidationResult,
+  SettingsValidationError,
+  SettingsResponse,
+} from './settings';
+ 
+// Workflow Types
+export type {
+  WorkflowStepType,
+  WorkflowStep,
+  Workflow,
+  WorkflowRunStatus,
+  WorkflowRun,
+  CreateWorkflowRequest,
+  UpdateWorkflowRequest,
+  WorkflowListResponse,
+  WorkflowResponse,
+  WorkflowRunListResponse,
+  TriggerWorkflowRequest,
+  TriggerWorkflowResponse,
+  WorkflowControlRequest,
+  WorkflowControlResponse,
+} from './workflow';
+ 
+// Team Collaboration Types
+export type {
+  TeamMemberRole,
+  TeamTaskStatus,
+  TaskPriority,
+  TeamMember,
+  TeamTask,
+  TaskDeliverable,
+  ReviewFeedback,
+  ReviewIssue,
+  DevQALoopState,
+  DevQALoop,
+  CollaborationPattern,
+  Team,
+  CollaborationEvent,
+  TeamMetrics,
+  CreateTeamRequest,
+  AddTeamTaskRequest,
+  TeamResponse,
+} from './team';
+ 
+// Error Types
+export {
+  // Error Code Enum
+  ErrorCode,
+  // Error Classes
+  AppError,
+  NetworkError,
+  ConnectionTimeoutError,
+  ConnectionRefusedError,
+  AuthError,
+  ForbiddenError,
+  RBACPermissionDeniedError,
+  ValidationError,
+  InvalidInputError,
+  JsonParseError,
+  TomlParseError,
+  NotFoundError,
+  AlreadyExistsError,
+  ResourceExhaustedError,
+  RateLimitError,
+  InternalError,
+  ServiceUnavailableError,
+  WebSocketError,
+  WebSocketConnectionError,
+  WebSocketMessageError,
+  StorageError,
+  KeyringUnavailableError,
+  HandExecutionError,
+  HandApprovalRequiredError,
+  WorkflowError,
+  // Type Guards
+  isAppError,
+  isNetworkError,
+  isAuthError,
+  isForbiddenError,
+  isValidationError,
+  isNotFoundError,
+  isRateLimitError,
+  isWebSocketError,
+  isStorageError,
+  isHandExecutionError,
+  isWorkflowError,
+  hasErrorCode,
+  isRetryableError,
+  // Helper Functions
+  toAppError,
+  getErrorMessage,
+  createErrorFromResponse,
+  createErrorFromCloseEvent,
+} from './errors';
+ 
+// API Response Types
+export type {
+  ApiResponse,
+  ApiError,
+  ResponseMetadata,
+  PaginatedResponse,
+  CreateResponse,
+  UpdateResponse,
+  DeleteResponse,
+  BulkResponse,
+  WebSocketMessage,
+  StreamChunk,
+} from './api-responses';
+ 
+// API Response Factory Functions
+export {
+  createSuccessResponse,
+  createErrorResponse,
+  createPaginatedResponse,
+} from './api-responses';
+ 
+// Automation Types
+export type {
+  CategoryType,
+  CategoryConfig,
+  CategoryStats,
+  AutomationStatus,
+  AutomationType,
+  RunInfo,
+  ScheduleInfo,
+  AutomationItem,
+} from './automation';
+ 
+// Automation Constants and Functions
+export {
+  HAND_CATEGORY_MAP,
+  CATEGORY_CONFIGS,
+  handStatusToAutomationStatus,
+  workflowStatusToAutomationStatus,
+  handToAutomationItem,
+  workflowToAutomationItem,
+  adaptToAutomationItems,
+  calculateCategoryStats,
+  filterByCategory,
+  filterByType,
+  filterByStatus,
+  searchAutomationItems,
+} from './automation';
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/session.ts.html b/desktop/coverage/src/types/session.ts.html new file mode 100644 index 0000000..ef42478 --- /dev/null +++ b/desktop/coverage/src/types/session.ts.html @@ -0,0 +1,406 @@ + + + + + + Code coverage report for src/types/session.ts + + + + + + + + + +
+
+

All files / src/types session.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Session Type Definitions for OpenFang
+ *
+ * These types define the Session and message structures
+ * for conversation management in the OpenFang desktop client.
+ */
+ 
+/**
+ * Represents a conversation session with an Agent
+ */
+export interface Session {
+  /** Unique identifier for the session */
+  id: string;
+  /** ID of the agent this session belongs to */
+  agentId: string;
+  /** ISO timestamp of session creation */
+  createdAt: string;
+  /** ISO timestamp of last session update */
+  updatedAt?: string;
+  /** Total number of messages in this session */
+  messageCount: number;
+}
+ 
+/**
+ * Configuration object for creating a new session
+ */
+export interface SessionConfig {
+  /** ID of the agent to associate with this session */
+  agentId: string;
+  /** Optional initial context or metadata */
+  context?: Record<string, unknown>;
+}
+ 
+/**
+ * Represents a single message within a session
+ */
+export interface SessionMessage {
+  /** Unique identifier for the message */
+  id: string;
+  /** ID of the session this message belongs to */
+  sessionId: string;
+  /** Role of the message sender */
+  role: MessageRole;
+  /** Text content of the message */
+  content: string;
+  /** ISO timestamp of message creation */
+  timestamp: string;
+  /** Optional metadata (tokens, model info, etc.) */
+  metadata?: MessageMetadata;
+}
+ 
+/**
+ * Possible roles for a message sender
+ *
+ * - user: Message from the human user
+ * - assistant: Message from the AI agent
+ * - system: System-level instruction or notification
+ */
+export type MessageRole = 'user' | 'assistant' | 'system';
+ 
+/**
+ * Metadata associated with a message
+ */
+export interface MessageMetadata {
+  /** Number of tokens used (if applicable) */
+  tokens?: number;
+  /** Model used to generate the response */
+  model?: string;
+  /** Whether this message was a tool call */
+  isToolCall?: boolean;
+  /** Tool call details if applicable */
+  toolCall?: {
+    name: string;
+    arguments: Record<string, unknown>;
+    result?: unknown;
+  };
+  /** Additional arbitrary metadata */
+  [key: string]: unknown;
+}
+ 
+/**
+ * Response structure for session list API
+ */
+export interface SessionListResponse {
+  sessions: Session[];
+  total: number;
+}
+ 
+/**
+ * Response structure for session messages API
+ */
+export interface SessionMessagesResponse {
+  messages: SessionMessage[];
+  sessionId: string;
+  hasMore: boolean;
+}
+ 
+/**
+ * Streaming message chunk for real-time updates
+ */
+export interface MessageStreamChunk {
+  sessionId: string;
+  messageId: string;
+  delta: string;
+  done: boolean;
+  metadata?: MessageMetadata;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/settings.ts.html b/desktop/coverage/src/types/settings.ts.html new file mode 100644 index 0000000..ced0c4e --- /dev/null +++ b/desktop/coverage/src/types/settings.ts.html @@ -0,0 +1,472 @@ + + + + + + Code coverage report for src/types/settings.ts + + + + + + + + + +
+
+

All files / src/types settings.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Settings Type Definitions for OpenFang
+ *
+ * These types define the configuration and settings structures
+ * for the OpenFang desktop client.
+ */
+ 
+/**
+ * Quick configuration settings for the application
+ *
+ * This interface represents user-configurable options that
+ * affect application behavior and appearance.
+ */
+export interface QuickConfig {
+  // Agent Configuration
+  /** Display name for the agent */
+  agentName?: string;
+  /** Role or persona description for the agent */
+  agentRole?: string;
+  /** Display name for the user */
+  userName?: string;
+  /** Role description for the user */
+  userRole?: string;
+  /** Short nickname for the agent */
+  agentNickname?: string;
+ 
+  // Scenario Configuration
+  /** List of scenario identifiers to enable */
+  scenarios?: string[];
+ 
+  // Workspace Configuration
+  /** Path to the workspace directory */
+  workspaceDir?: string;
+ 
+  // Gateway Configuration
+  /** URL for the OpenFang gateway server */
+  gatewayUrl?: string;
+  /** Authentication token for gateway */
+  gatewayToken?: string;
+ 
+  // Skills Configuration
+  /** Additional directories to scan for skills */
+  skillsExtraDirs?: string[];
+ 
+  // MCP Services
+  /** List of MCP (Model Context Protocol) services */
+  mcpServices?: MCPService[];
+ 
+  // UI Preferences
+  /** Application color theme */
+  theme?: ThemeMode;
+  /** Whether to start agent automatically on launch */
+  autoStart?: boolean;
+  /** Whether to display tool call information in chat */
+  showToolCalls?: boolean;
+ 
+  // Security Settings
+  /** Whether to restrict file system access */
+  restrictFiles?: boolean;
+  /** Whether to automatically save context */
+  autoSaveContext?: boolean;
+  /** Whether to enable file watching */
+  fileWatching?: boolean;
+ 
+  // Privacy
+  /** Opt-in for telemetry/analytics */
+  privacyOptIn?: boolean;
+}
+ 
+/**
+ * MCP (Model Context Protocol) Service configuration
+ */
+export interface MCPService {
+  /** Unique identifier for the service */
+  id: string;
+  /** Display name of the service */
+  name: string;
+  /** Whether the service is currently enabled */
+  enabled: boolean;
+  /** Optional connection URL or endpoint */
+  endpoint?: string;
+  /** Optional API key or credentials */
+  apiKey?: string;
+}
+ 
+/**
+ * Application theme modes
+ *
+ * - light: Light color scheme
+ * - dark: Dark color scheme
+ */
+export type ThemeMode = 'light' | 'dark';
+ 
+/**
+ * Full application settings including internal state
+ */
+export interface AppSettings extends QuickConfig {
+  /** Settings schema version for migration support */
+  version: string;
+  /** ISO timestamp of last settings modification */
+  lastModified: string;
+}
+ 
+/**
+ * Settings validation result
+ */
+export interface SettingsValidationResult {
+  valid: boolean;
+  errors: SettingsValidationError[];
+  warnings?: string[];
+}
+ 
+/**
+ * Individual settings validation error
+ */
+export interface SettingsValidationError {
+  field: string;
+  message: string;
+  value?: unknown;
+}
+ 
+/**
+ * Response structure for settings API
+ */
+export interface SettingsResponse {
+  settings: QuickConfig;
+  success: boolean;
+  error?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/skill-market.ts.html b/desktop/coverage/src/types/skill-market.ts.html new file mode 100644 index 0000000..da468f4 --- /dev/null +++ b/desktop/coverage/src/types/skill-market.ts.html @@ -0,0 +1,304 @@ + + + + + + Code coverage report for src/types/skill-market.ts + + + + + + + + + +
+
+

All files / src/types skill-market.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * * 技能市场类型定义
+ *
+ * * 用于管理技能浏览、搜索、安装/卸载等功能
+ */
+ 
+// 技能信息
+export interface Skill {
+  /** 唯一标识 */
+  id: string;
+  /** 技能名称 */
+  name: string;
+  /** 技能描述 */
+  description: string;
+  /** 触发词列表 */
+  triggers: string[];
+  /** 能力列表 */
+  capabilities: string[];
+  /** 工具依赖 */
+  toolDeps?: string[];
+  /** 分类 */
+  category: string;
+  /** 作者 */
+  author?: string;
+  /** 版本 */
+  version?: string;
+  /** 标签 */
+  tags?: string[];
+  /** 安装状态 */
+  installed: boolean;
+  /** 评分 (1-5) */
+  rating?: number;
+  /** 评论数 */
+  reviewCount?: number;
+  /** 安装时间 */
+  installedAt?: string;
+}
+ 
+// 技能评论
+export interface SkillReview {
+  /** 评论ID */
+  id: string;
+  /** 技能ID */
+  skillId: string;
+  /** 用户名 */
+  userName: string;
+  /** 评分 (1-5) */
+  rating: number;
+  /** 评论内容 */
+  comment: string;
+  /** 评论时间 */
+  createdAt: string;
+}
+ 
+// 技能市场状态
+export interface SkillMarketState {
+  /** 所有技能 */
+  skills: Skill[];
+  /** 已安装技能 */
+  installedSkills: string[];
+  /** 搜索结果 */
+  searchResults: Skill[];
+  /** 当前选中的技能 */
+  selectedSkill: Skill | null;
+  /** 搜索关键词 */
+  searchQuery: string;
+  /** 分类过滤 */
+  categoryFilter: string;
+  /** 是否正在加载 */
+  isLoading: boolean;
+  /** 错误信息 */
+  error: string | null;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/team.ts.html b/desktop/coverage/src/types/team.ts.html new file mode 100644 index 0000000..46d983e --- /dev/null +++ b/desktop/coverage/src/types/team.ts.html @@ -0,0 +1,973 @@ + + + + + + Code coverage report for src/types/team.ts + + + + + + + + + +
+
+

All files / src/types team.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Multi-Agent Team Collaboration Types for OpenFang
+ *
+ * This module defines types for multi-agent team orchestration,
+ * collaboration workflows, and Dev↔QA loops.
+ *
+ * @module types/team
+ */
+ 
+import type { AgentStatus } from './agent';
+ 
+// === Team Definition ===
+ 
+/**
+ * Role of an agent within a team
+ */
+export type TeamMemberRole =
+  | 'orchestrator'   // Team coordinator - assigns tasks, manages flow
+  | 'developer'      // Primary implementation agent
+  | 'reviewer'       // Code review and quality assurance
+  | 'tester'         // Testing and validation
+  | 'architect'      // System design and architecture
+  | 'specialist';    // Domain-specific expertise
+ 
+/**
+ * Possible states for a team task
+ */
+export type TeamTaskStatus =
+  | 'pending'        // Waiting to be assigned
+  | 'assigned'       // Assigned to an agent but not started
+  | 'in_progress'    // Currently being worked on
+  | 'review'         // Under review by another agent
+  | 'blocked'        // Blocked by dependency or issue
+  | 'completed'      // Successfully completed
+  | 'failed';        // Failed with error
+ 
+/**
+ * Priority levels for team tasks
+ */
+export type TaskPriority = 'critical' | 'high' | 'medium' | 'low';
+ 
+/**
+ * A member of a team (an agent with a specific role)
+ */
+export interface TeamMember {
+  /** Unique identifier for this team member */
+  id: string;
+  /** ID of the underlying agent */
+  agentId: string;
+  /** Agent display name */
+  name: string;
+  /** Role within the team */
+  role: TeamMemberRole;
+  /** Skills this member contributes */
+  skills: string[];
+  /** Current workload (0-100%) */
+  workload: number;
+  /** Current status */
+  status: AgentStatus;
+  /** Maximum concurrent tasks */
+  maxConcurrentTasks: number;
+  /** Current assigned task IDs */
+  currentTasks: string[];
+}
+ 
+/**
+ * A task that can be assigned to team members
+ */
+export interface TeamTask {
+  /** Unique task identifier */
+  id: string;
+  /** Task title */
+  title: string;
+  /** Detailed task description */
+  description?: string;
+  /** Current status */
+  status: TeamTaskStatus;
+  /** Priority level */
+  priority: TaskPriority;
+  /** ID of assigned team member */
+  assigneeId?: string;
+  /** IDs of tasks this depends on */
+  dependencies: string[];
+  /** Task type classification */
+  type: 'implementation' | 'review' | 'testing' | 'design' | 'deployment';
+  /** Estimated effort (story points or hours) */
+  estimate?: number;
+  /** ISO timestamp of creation */
+  createdAt: string;
+  /** ISO timestamp of last update */
+  updatedAt?: string;
+  /** ISO timestamp when work started */
+  startedAt?: string;
+  /** ISO timestamp of completion */
+  completedAt?: string;
+  /** Result or deliverable */
+  deliverable?: TaskDeliverable;
+  /** Review feedback if in review */
+  reviewFeedback?: ReviewFeedback;
+}
+ 
+/**
+ * Deliverable produced by a task
+ */
+export interface TaskDeliverable {
+  /** Type of deliverable */
+  type: 'code' | 'document' | 'test' | 'config' | 'report';
+  /** Description of what was produced */
+  description: string;
+  /** File paths modified/created */
+  files?: string[];
+  /** Key metrics or outcomes */
+  metrics?: Record<string, number | string>;
+}
+ 
+/**
+ * Feedback from a review
+ */
+export interface ReviewFeedback {
+  /** Review verdict */
+  verdict: 'approved' | 'needs_work' | 'rejected';
+  /** Detailed feedback */
+  comments: string[];
+  /** Issues found */
+  issues: ReviewIssue[];
+  /** ISO timestamp of review */
+  reviewedAt: string;
+  /** ID of reviewer */
+  reviewerId: string;
+}
+ 
+/**
+ * An issue found during review
+ */
+export interface ReviewIssue {
+  /** Issue severity */
+  severity: 'critical' | 'major' | 'minor' | 'suggestion';
+  /** Issue description */
+  description: string;
+  /** File location if applicable */
+  file?: string;
+  /** Line number if applicable */
+  line?: number;
+  /** Suggested fix */
+  suggestion?: string;
+}
+ 
+// === Dev↔QA Loop ===
+ 
+/**
+ * States in the Dev↔QA loop
+ */
+export type DevQALoopState =
+  | 'idle'           // No active loop
+  | 'developing'     // Developer is implementing
+  | 'reviewing'      // QA is reviewing
+  | 'revising'       // Developer is fixing issues
+  | 'approved'       // QA approved the work
+  | 'escalated';     // Too many retries, needs human intervention
+ 
+/**
+ * A Dev↔QA loop instance
+ */
+export interface DevQALoop {
+  /** Unique loop identifier */
+  id: string;
+  /** ID of the developer agent */
+  developerId: string;
+  /** ID of the QA/reviewer agent */
+  reviewerId: string;
+  /** Task being worked on */
+  taskId: string;
+  /** Current state */
+  state: DevQALoopState;
+  /** Number of revision cycles */
+  iterationCount: number;
+  /** Maximum iterations before escalation */
+  maxIterations: number;
+  /** All feedback history */
+  feedbackHistory: ReviewFeedback[];
+  /** ISO timestamp of loop start */
+  startedAt: string;
+  /** ISO timestamp of last state change */
+  lastUpdatedAt: string;
+}
+ 
+// === Team Collaboration ===
+ 
+/**
+ * Possible collaboration patterns
+ */
+export type CollaborationPattern =
+  | 'sequential'     // Tasks completed one after another
+  | 'parallel'       // Tasks completed simultaneously
+  | 'pipeline'       // Output of one feeds into next
+  | 'review_loop';   // Dev↔QA iteration pattern
+ 
+/**
+ * A team collaboration session
+ */
+export interface Team {
+  /** Unique team identifier */
+  id: string;
+  /** Team name */
+  name: string;
+  /** Team description */
+  description?: string;
+  /** Team members */
+  members: TeamMember[];
+  /** Active tasks */
+  tasks: TeamTask[];
+  /** Collaboration pattern */
+  pattern: CollaborationPattern;
+  /** Active Dev↔QA loops */
+  activeLoops: DevQALoop[];
+  /** Team status */
+  status: 'active' | 'paused' | 'completed' | 'error';
+  /** ISO timestamp of creation */
+  createdAt: string;
+  /** ISO timestamp of last activity */
+  updatedAt?: string;
+}
+ 
+/**
+ * Real-time collaboration event
+ */
+export interface CollaborationEvent {
+  /** Event type */
+  type: 'task_assigned' | 'task_started' | 'task_completed' |
+        'review_requested' | 'review_submitted' |
+        'loop_state_change' | 'member_status_change';
+  /** ID of the team */
+  teamId: string;
+  /** ID of the source agent */
+  sourceAgentId: string;
+  /** Event payload */
+  payload: Record<string, unknown>;
+  /** ISO timestamp */
+  timestamp: string;
+}
+ 
+/**
+ * Team performance metrics
+ */
+export interface TeamMetrics {
+  /** Total tasks completed */
+  tasksCompleted: number;
+  /** Average task completion time (ms) */
+  avgCompletionTime: number;
+  /** Review pass rate (0-100) */
+  passRate: number;
+  /** Average iterations per task */
+  avgIterations: number;
+  /** Escalation count */
+  escalations: number;
+  /** Team efficiency score (0-100) */
+  efficiency: number;
+}
+ 
+// === API Types ===
+ 
+/**
+ * Request to create a new team
+ */
+export interface CreateTeamRequest {
+  name: string;
+  description?: string;
+  memberAgents: Array<{
+    agentId: string;
+    role: TeamMemberRole;
+  }>;
+  pattern: CollaborationPattern;
+}
+ 
+/**
+ * Request to add a task to a team
+ */
+export interface AddTeamTaskRequest {
+  teamId: string;
+  title: string;
+  description?: string;
+  priority: TaskPriority;
+  type: TeamTask['type'];
+  assigneeId?: string;
+  dependencies?: string[];
+  estimate?: number;
+}
+ 
+/**
+ * Response for team operations
+ */
+export interface TeamResponse {
+  team: Team;
+  success: boolean;
+  error?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/coverage/src/types/workflow.ts.html b/desktop/coverage/src/types/workflow.ts.html new file mode 100644 index 0000000..cf86713 --- /dev/null +++ b/desktop/coverage/src/types/workflow.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for src/types/workflow.ts + + + + + + + + + +
+
+

All files / src/types workflow.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 1/1 +
+ + +
+ 0% + Functions + 1/1 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Workflow Type Definitions for OpenFang
+ *
+ * This module defines all TypeScript types related to workflow
+ * management, execution, and monitoring in the OpenFang system.
+ *
+ * @module types/workflow
+ */
+ 
+/**
+ * Types of workflow steps available in OpenFang
+ */
+export type WorkflowStepType =
+  | 'hand'      // Execute a Hand (autonomous capability)
+  | 'skill'     // Execute a Skill
+  | 'agent'     // Delegate to an Agent
+  | 'condition' // Conditional branching
+  | 'parallel'  // Parallel execution of sub-steps
+  | 'delay';    // Time-based delay
+ 
+/**
+ * Represents a single step in a workflow
+ */
+export interface WorkflowStep {
+  /** Unique identifier for this step */
+  id: string;
+  /** Optional display name for the step */
+  name?: string;
+  /** Type of the workflow step */
+  type: WorkflowStepType;
+  /** Name of the Hand to execute (when type='hand') */
+  handName?: string;
+  /** Name of the Skill to execute (when type='skill') */
+  skillName?: string;
+  /** ID of the Agent to delegate to (when type='agent') */
+  agentId?: string;
+  /** Condition expression to evaluate (when type='condition') */
+  condition?: string;
+  /** Parameters to pass to the step execution */
+  params?: Record<string, unknown>;
+  /** Timeout duration in seconds */
+  timeout?: number;
+  /** Number of retry attempts on failure */
+  retryCount?: number;
+  /** Error handling strategy */
+  onError?: 'continue' | 'stop' | 'retry';
+}
+ 
+/**
+ * Complete workflow definition
+ */
+export interface Workflow {
+  /** Unique identifier for the workflow */
+  id: string;
+  /** Display name of the workflow */
+  name: string;
+  /** Optional description of what the workflow does */
+  description?: string;
+  /** Ordered list of steps to execute */
+  steps: WorkflowStep[];
+  /** Workflow version for tracking changes */
+  version?: string;
+  /** ISO timestamp of workflow creation */
+  createdAt?: string;
+  /** ISO timestamp of last update */
+  updatedAt?: string;
+  /** Current lifecycle status of the workflow */
+  status?: 'draft' | 'active' | 'archived';
+}
+ 
+/**
+ * Possible states of a workflow run
+ */
+export type WorkflowRunStatus =
+  | 'pending'    // Waiting to start
+  | 'running'    // Currently executing
+  | 'completed'  // Finished successfully
+  | 'failed'     // Terminated with error
+  | 'cancelled'  // Manually stopped
+  | 'paused';    // Temporarily suspended
+ 
+/**
+ * Represents a single execution instance of a workflow
+ */
+export interface WorkflowRun {
+  /** Unique identifier for this run instance */
+  runId: string;
+  /** ID of the workflow being executed */
+  workflowId: string;
+  /** Current execution status */
+  status: WorkflowRunStatus;
+  /** ID of the currently executing step */
+  step?: string;
+  /** Index of current step (0-based) */
+  currentStepIndex?: number;
+  /** Total number of steps in workflow */
+  totalSteps?: number;
+  /** ISO timestamp when run started */
+  startedAt?: string;
+  /** ISO timestamp when run completed */
+  completedAt?: string;
+  /** Result data from successful execution */
+  result?: unknown;
+  /** Error message if run failed */
+  error?: string;
+  /** Additional metadata about the run */
+  metadata?: Record<string, unknown>;
+}
+ 
+/**
+ * Request payload for creating a new workflow
+ */
+export interface CreateWorkflowRequest {
+  /** Display name for the new workflow */
+  name: string;
+  /** Optional description */
+  description?: string;
+  /** Steps to include in the workflow (IDs will be auto-generated) */
+  steps: Omit<WorkflowStep, 'id'>[];
+}
+ 
+/**
+ * Request payload for updating an existing workflow
+ */
+export interface UpdateWorkflowRequest {
+  /** New display name */
+  name?: string;
+  /** New description */
+  description?: string;
+  /** Updated step definitions */
+  steps?: WorkflowStep[];
+  /** New lifecycle status */
+  status?: 'draft' | 'active' | 'archived';
+}
+ 
+/**
+ * API response for listing workflows
+ */
+export interface WorkflowListResponse {
+  /** Array of workflow definitions */
+  workflows: Workflow[];
+  /** Total count of workflows */
+  total: number;
+}
+ 
+/**
+ * API response for single workflow operations
+ */
+export interface WorkflowResponse {
+  /** The workflow data */
+  workflow: Workflow;
+  /** Whether the operation succeeded */
+  success: boolean;
+  /** Error message if operation failed */
+  error?: string;
+}
+ 
+/**
+ * API response for listing workflow runs
+ */
+export interface WorkflowRunListResponse {
+  /** Array of workflow run instances */
+  runs: WorkflowRun[];
+  /** Total count of runs */
+  total: number;
+}
+ 
+/**
+ * Request to trigger a workflow execution
+ */
+export interface TriggerWorkflowRequest {
+  /** ID of the workflow to execute */
+  workflowId: string;
+  /** Optional parameters to pass to the workflow */
+  params?: Record<string, unknown>;
+  /** Whether to run asynchronously (default: true) */
+  async?: boolean;
+}
+ 
+/**
+ * API response for workflow trigger operations
+ */
+export interface TriggerWorkflowResponse {
+  /** ID of the started run */
+  runId: string;
+  /** Whether the trigger was successful */
+  success: boolean;
+  /** Error message if trigger failed */
+  error?: string;
+}
+ 
+/**
+ * Request to control a running workflow
+ */
+export interface WorkflowControlRequest {
+  /** ID of the run to control */
+  runId: string;
+  /** Control action to perform */
+  action: 'pause' | 'resume' | 'cancel';
+}
+ 
+/**
+ * API response for workflow control operations
+ */
+export interface WorkflowControlResponse {
+  /** Whether the control action succeeded */
+  success: boolean;
+  /** New status after control action */
+  newStatus?: WorkflowRunStatus;
+  /** Error message if action failed */
+  error?: string;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/desktop/eslint.config.js b/desktop/eslint.config.js new file mode 100644 index 0000000..7be3263 --- /dev/null +++ b/desktop/eslint.config.js @@ -0,0 +1,61 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; + +export default [ + js.configs.recommended, + ...tseslint.configs.recommended, + { + files: ['**/*.{ts,tsx}'], + plugins: { + react: reactPlugin, + 'react-hooks': reactHooksPlugin, + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + rules: { + // TypeScript 规则 + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'warn', + + // React 规则 + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + 'react/jsx-uses-react': 'off', + 'react/jsx-uses-vars': 'error', + + // React Hooks 规则 + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + + // 通用规则 + 'no-console': ['warn', { allow: ['warn', 'error'] }], + 'prefer-const': 'error', + 'no-var': 'error', + eqeqeq: ['error', 'always'], + }, + settings: { + react: { version: 'detect' }, + }, + }, + { + ignores: [ + 'dist/', + 'node_modules/', + 'coverage/', + 'src-tauri/', + '*.config.js', + '*.config.ts', + 'tests/e2e/', + ], + }, +]; diff --git a/desktop/package.json b/desktop/package.json index f1e67fe..f38a88b 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -28,7 +28,11 @@ "test:e2e:headed": "playwright test --project chromium-headed --headed", "test:tauri": "playwright test --config=tests/e2e/playwright.tauri.config.ts", "test:tauri:headed": "playwright test --config=tests/e2e/playwright.tauri.config.ts --headed", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint src/", + "lint:fix": "eslint src/ --fix", + "format": "prettier --write \"src/**/*.{ts,tsx,css}\"", + "format:check": "prettier --check \"src/**/*.{ts,tsx,css}\"" }, "dependencies": { "@dagrejs/dagre": "^3.0.0", @@ -53,6 +57,7 @@ "zustand": "^5.0.11" }, "devDependencies": { + "@eslint/js": "^10.0.1", "@playwright/test": "^1.58.2", "@tailwindcss/vite": "^4.2.1", "@tauri-apps/cli": "^2", @@ -66,11 +71,17 @@ "@vitejs/plugin-react": "^4.6.0", "@vitest/coverage-v8": "2.1.8", "autoprefixer": "^10.4.27", + "eslint": "^10.1.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", "jsdom": "25.0.1", "playwright": "^1.58.2", "postcss": "^8.5.8", + "prettier": "^3.8.1", + "prettier-plugin-tailwindcss": "^0.7.2", "tailwindcss": "^4.2.1", "typescript": "~5.8.3", + "typescript-eslint": "^8.57.2", "vite": "^7.0.4", "vitest": "2.1.8" } diff --git a/desktop/pnpm-lock.yaml b/desktop/pnpm-lock.yaml index 08f174d..fdc303a 100644 --- a/desktop/pnpm-lock.yaml +++ b/desktop/pnpm-lock.yaml @@ -69,6 +69,9 @@ importers: specifier: ^5.0.11 version: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) devDependencies: + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.1.0(jiti@2.6.1)) '@playwright/test': specifier: ^1.58.2 version: 1.58.2 @@ -108,6 +111,15 @@ importers: autoprefixer: specifier: ^10.4.27 version: 10.4.27(postcss@8.5.8) + eslint: + specifier: ^10.1.0 + version: 10.1.0(jiti@2.6.1) + eslint-plugin-react: + specifier: ^7.37.5 + version: 7.37.5(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-react-hooks: + specifier: ^7.0.1 + version: 7.0.1(eslint@10.1.0(jiti@2.6.1)) jsdom: specifier: 25.0.1 version: 25.0.1 @@ -117,12 +129,21 @@ importers: postcss: specifier: ^8.5.8 version: 8.5.8 + prettier: + specifier: ^3.8.1 + version: 3.8.1 + prettier-plugin-tailwindcss: + specifier: ^0.7.2 + version: 0.7.2(prettier@3.8.1) tailwindcss: specifier: ^4.2.1 version: 4.2.1 typescript: specifier: ~5.8.3 version: 5.8.3 + typescript-eslint: + specifier: ^8.57.2 + version: 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) vite: specifier: ^7.0.4 version: 7.3.1(jiti@2.6.1)(lightningcss@1.31.1) @@ -560,6 +581,61 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.3': + resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.5.3': + resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.1.1': + resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.3': + resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.6.1': + resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -966,12 +1042,18 @@ packages: '@types/d3-zoom@3.0.8': resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -987,6 +1069,65 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@typescript-eslint/eslint-plugin@8.57.2': + resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.57.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.57.2': + resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.57.2': + resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.57.2': + resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.57.2': + resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.57.2': + resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.57.2': + resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.57.2': + resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.57.2': + resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.57.2': + resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1052,10 +1193,23 @@ packages: '@xyflow/system@0.0.75': resolution: {integrity: sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1083,10 +1237,42 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1097,6 +1283,10 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1109,6 +1299,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -1129,6 +1322,14 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + caniuse-lite@1.0.30001777: resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} @@ -1162,6 +1363,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1224,6 +1428,18 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -1243,6 +1459,17 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1255,6 +1482,10 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1285,6 +1516,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1293,6 +1528,10 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-iterator-helpers@1.3.1: + resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1304,6 +1543,14 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1318,13 +1565,80 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1334,6 +1648,25 @@ packages: picomatch: optional: true + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1372,6 +1705,17 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1384,11 +1728,23 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1399,10 +1755,21 @@ packages: graphlib@2.1.8: resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1415,6 +1782,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -1434,17 +1807,132 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1464,6 +1952,10 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1488,11 +1980,31 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.31.1: resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} engines: {node: '>= 12.0.0'} @@ -1567,9 +2079,17 @@ packages: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -1618,6 +2138,9 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -1640,22 +2163,80 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + node-releases@2.0.36: resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -1684,6 +2265,10 @@ packages: engines: {node: '>=18'} hasBin: true + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -1691,10 +2276,77 @@ packages: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-tailwindcss@0.7.2: + resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==} + engines: {node: '>=20.19'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proxy-compare@3.0.1: resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} @@ -1707,6 +2359,9 @@ packages: peerDependencies: react: ^19.2.4 + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -1728,6 +2383,19 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + rollup@4.59.0: resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1739,6 +2407,18 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -1758,6 +2438,18 @@ packages: engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1766,6 +2458,22 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1787,6 +2495,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1795,6 +2507,25 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1811,6 +2542,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -1865,23 +2600,63 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.57.2: + resolution: {integrity: sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-isomorphic-layout-effect@1.2.1: resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} peerDependencies: @@ -2034,6 +2809,22 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2044,6 +2835,10 @@ packages: engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2077,6 +2872,19 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zustand@4.5.7: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} engines: {node: '>=12.7.0'} @@ -2416,6 +3224,51 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))': + dependencies: + eslint: 10.1.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.3': + dependencies: + '@eslint/object-schema': 3.0.3 + debug: 4.4.3 + minimatch: 10.2.4 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.3': + dependencies: + '@eslint/core': 1.1.1 + + '@eslint/core@1.1.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.1.0(jiti@2.6.1))': + optionalDependencies: + eslint: 10.1.0(jiti@2.6.1) + + '@eslint/object-schema@3.0.3': {} + + '@eslint/plugin-kit@0.6.1': + dependencies: + '@eslint/core': 1.1.1 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -2726,10 +3579,14 @@ snapshots: '@types/d3-interpolate': 3.0.4 '@types/d3-selection': 3.0.11 + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/js-yaml@4.0.9': {} + '@types/json-schema@7.0.15': {} + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 @@ -2747,6 +3604,97 @@ snapshots: '@types/uuid@10.0.0': {} + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/type-utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.57.2 + eslint: 10.1.0(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.57.2 + debug: 4.4.3 + eslint: 10.1.0(jiti@2.6.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.57.2(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.8.3) + '@typescript-eslint/types': 8.57.2 + debug: 4.4.3 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.57.2': + dependencies: + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 + + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.8.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + debug: 4.4.3 + eslint: 10.1.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.57.2': {} + + '@typescript-eslint/typescript-estree@8.57.2(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.57.2(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.8.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.8.3) + eslint: 10.1.0(jiti@2.6.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.57.2': + dependencies: + '@typescript-eslint/types': 8.57.2 + eslint-visitor-keys: 5.0.1 + '@vitejs/plugin-react@4.7.0(vite@7.3.1(jiti@2.6.1)(lightningcss@1.31.1))': dependencies: '@babel/core': 7.29.0 @@ -2854,8 +3802,21 @@ snapshots: d3-selection: 3.0.0 d3-zoom: 3.0.0 + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + agent-base@7.1.4: {} + ajv@6.14.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -2874,8 +3835,67 @@ snapshots: aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + assertion-error@2.0.1: {} + async-function@1.0.0: {} + asynckit@0.4.0: {} autoprefixer@10.4.27(postcss@8.5.8): @@ -2887,12 +3907,21 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + balanced-match@1.0.2: {} balanced-match@4.0.4: {} baseline-browser-mapping@2.10.0: {} + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -2916,6 +3945,18 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + caniuse-lite@1.0.30001777: {} chai@5.3.3: @@ -2947,6 +3988,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + concat-map@0.0.1: {} + convert-source-map@2.0.0: {} cross-spawn@7.0.6: @@ -3010,6 +4053,24 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + date-fns@4.1.0: {} debug@4.4.3: @@ -3020,12 +4081,30 @@ snapshots: deep-eql@5.0.2: {} + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + delayed-stream@1.0.0: {} dequal@2.0.3: {} detect-libc@2.1.2: {} + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -3051,10 +4130,87 @@ snapshots: entities@6.0.1: {} + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + es-define-property@1.0.1: {} es-errors@1.3.0: {} + es-iterator-helpers@1.3.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + safe-array-concat: 1.1.3 + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: @@ -3068,6 +4224,16 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -3125,16 +4291,143 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@7.0.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 + eslint: 10.1.0(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.3.6 + zod-validation-error: 4.0.2(zod@4.3.6) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react@7.37.5(eslint@10.1.0(jiti@2.6.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.3.1 + eslint: 10.1.0(jiti@2.6.1) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.6 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.1.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.3 + '@eslint/config-helpers': 0.5.3 + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.4 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + esutils@2.0.3: {} + expect-type@1.3.0: {} + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -3167,6 +4460,19 @@ snapshots: function-bind@1.1.2: {} + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-intrinsic@1.3.0: @@ -3187,6 +4493,16 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@10.5.0: dependencies: foreground-child: 3.3.1 @@ -3196,6 +4512,11 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -3204,8 +4525,18 @@ snapshots: dependencies: lodash: 4.17.23 + has-bigints@1.1.0: {} + has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -3216,6 +4547,12 @@ snapshots: dependencies: function-bind: 1.1.2 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -3240,12 +4577,132 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-potential-custom-element-name@1.0.1: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -3269,6 +4726,15 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -3309,8 +4775,30 @@ snapshots: jsesc@3.1.0: {} + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lightningcss-android-arm64@1.31.1: optional: true @@ -3360,8 +4848,16 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash@4.17.23: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} @@ -3404,6 +4900,10 @@ snapshots: dependencies: brace-expansion: 5.0.4 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.9: dependencies: brace-expansion: 2.0.2 @@ -3420,18 +4920,90 @@ snapshots: nanoid@3.3.11: {} + natural-compare@1.4.0: {} + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + node-releases@2.0.36: {} nwsapi@2.2.23: {} + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + package-json-from-dist@1.0.1: {} parse5@7.3.0: dependencies: entities: 6.0.1 + path-exists@4.0.0: {} + path-key@3.1.1: {} + path-parse@1.0.7: {} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -3453,6 +5025,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} + postcss-value-parser@4.2.0: {} postcss@8.5.8: @@ -3461,12 +5035,26 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + + prettier-plugin-tailwindcss@0.7.2(prettier@3.8.1): + dependencies: + prettier: 3.8.1 + + prettier@3.8.1: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + proxy-compare@3.0.1: {} punycode@2.3.1: {} @@ -3476,6 +5064,8 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 + react-is@16.13.1: {} + react-is@17.0.2: {} react-refresh@0.17.0: {} @@ -3492,6 +5082,35 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + resolve@2.0.0-next.6: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 @@ -3527,6 +5146,25 @@ snapshots: rrweb-cssom@0.8.0: {} + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} saxes@6.0.0: @@ -3539,12 +5177,62 @@ snapshots: semver@7.7.4: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -3557,6 +5245,11 @@ snapshots: std-env@3.10.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3569,6 +5262,50 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3585,6 +5322,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} tailwind-merge@3.5.0: {} @@ -3628,18 +5367,81 @@ snapshots: dependencies: punycode: 2.3.1 + ts-api-utils@2.5.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + tslib@2.8.1: {} tweetnacl@1.0.3: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.8.3) + '@typescript-eslint/utils': 8.57.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.8.3) + eslint: 10.1.0(jiti@2.6.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + typescript@5.8.3: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.14)(react@19.2.4): dependencies: react: 19.2.4 @@ -3751,6 +5553,47 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -3760,6 +5603,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3782,6 +5627,14 @@ snapshots: yallist@3.1.1: {} + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.3.6): + dependencies: + zod: 4.3.6 + + zod@4.3.6: {} + zustand@4.5.7(@types/react@19.2.14)(react@19.2.4): dependencies: use-sync-external-store: 1.6.0(react@19.2.4) diff --git a/desktop/prettier.config.js b/desktop/prettier.config.js new file mode 100644 index 0000000..45e4eeb --- /dev/null +++ b/desktop/prettier.config.js @@ -0,0 +1,15 @@ +/** @type {import('prettier').Config} */ +export default { + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'es5', + printWidth: 100, + bracketSpacing: true, + jsxSingleQuote: false, + arrowParens: 'always', + endOfLine: 'lf', + plugins: ['prettier-plugin-tailwindcss'], + tailwindConfig: './tailwind.config.js', + tailwindFunctions: ['clsx', 'cn', 'cva'], +}; diff --git a/desktop/src-tauri/src/pipeline_commands.rs b/desktop/src-tauri/src/pipeline_commands.rs index c9d7ae9..43e27e1 100644 --- a/desktop/src-tauri/src/pipeline_commands.rs +++ b/desktop/src-tauri/src/pipeline_commands.rs @@ -138,28 +138,35 @@ pub async fn pipeline_list( // Get pipelines directory let pipelines_dir = get_pipelines_directory()?; - // Scan for pipeline files (synchronous scan) - let mut pipelines = Vec::new(); + tracing::info!("[pipeline_list] Scanning directory: {:?}", pipelines_dir); + + // Scan for pipeline files (returns both info and paths) + let mut pipelines_with_paths: Vec<(PipelineInfo, PathBuf)> = Vec::new(); if pipelines_dir.exists() { - scan_pipelines_sync(&pipelines_dir, category.as_deref(), &mut pipelines)?; + scan_pipelines_with_paths(&pipelines_dir, category.as_deref(), &mut pipelines_with_paths)?; + } else { + tracing::warn!("[pipeline_list] Pipelines directory does not exist: {:?}", pipelines_dir); } + tracing::info!("[pipeline_list] Found {} pipelines", pipelines_with_paths.len()); + // Update state let mut state_pipelines = state.pipelines.write().await; - let state_paths = state.pipeline_paths.write().await; + let mut state_paths = state.pipeline_paths.write().await; - for info in &pipelines { - if let Some(path) = state_paths.get(&info.id) { - // Load full pipeline into state - if let Ok(content) = std::fs::read_to_string(path) { - if let Ok(pipeline) = parse_pipeline_yaml(&content) { - state_pipelines.insert(info.id.clone(), pipeline); - } + let mut result = Vec::new(); + for (info, path) in &pipelines_with_paths { + // Load full pipeline into state + if let Ok(content) = std::fs::read_to_string(path) { + if let Ok(pipeline) = parse_pipeline_yaml(&content) { + state_pipelines.insert(info.id.clone(), pipeline); + state_paths.insert(info.id.clone(), path.clone()); } } + result.push(info.clone()); } - Ok(pipelines) + Ok(result) } /// Get pipeline details @@ -379,10 +386,11 @@ fn get_pipelines_directory() -> Result { Err("Could not determine pipelines directory".to_string()) } -fn scan_pipelines_sync( +/// Scan pipelines with paths (returns both info and file paths) +fn scan_pipelines_with_paths( dir: &PathBuf, category_filter: Option<&str>, - pipelines: &mut Vec, + pipelines: &mut Vec<(PipelineInfo, PathBuf)>, ) -> Result<(), String> { let entries = std::fs::read_dir(dir) .map_err(|e| format!("Failed to read pipelines directory: {}", e))?; @@ -393,19 +401,25 @@ fn scan_pipelines_sync( if path.is_dir() { // Recursively scan subdirectory - scan_pipelines_sync(&path, category_filter, pipelines)?; + scan_pipelines_with_paths(&path, category_filter, pipelines)?; } else if path.extension().map(|e| e == "yaml" || e == "yml").unwrap_or(false) { // Try to parse pipeline file if let Ok(content) = std::fs::read_to_string(&path) { - if let Ok(pipeline) = parse_pipeline_yaml(&content) { - // Apply category filter - if let Some(filter) = category_filter { - if pipeline.metadata.category.as_deref() != Some(filter) { - continue; + match parse_pipeline_yaml(&content) { + Ok(pipeline) => { + // Apply category filter + if let Some(filter) = category_filter { + if pipeline.metadata.category.as_deref() != Some(filter) { + continue; + } } - } - pipelines.push(pipeline_to_info(&pipeline)); + tracing::debug!("[scan] Found pipeline: {} at {:?}", pipeline.metadata.name, path); + pipelines.push((pipeline_to_info(&pipeline), path)); + } + Err(e) => { + tracing::warn!("[scan] Failed to parse pipeline at {:?}: {}", path, e); + } } } } diff --git a/desktop/src/components/Automation/AutomationPanel.tsx b/desktop/src/components/Automation/AutomationPanel.tsx index ea406ef..1993aa6 100644 --- a/desktop/src/components/Automation/AutomationPanel.tsx +++ b/desktop/src/components/Automation/AutomationPanel.tsx @@ -1,7 +1,7 @@ /** * AutomationPanel - Unified Automation Entry Point * - * Combines Hands and Workflows into a single unified view, + * Combines Pipelines, Hands and Workflows into a single unified view, * with category filtering, batch operations, and scheduling. * * @module components/Automation/AutomationPanel @@ -22,6 +22,8 @@ import { import { AutomationCard } from './AutomationCard'; import { AutomationFilters } from './AutomationFilters'; import { BatchActionBar } from './BatchActionBar'; +import { ScheduleEditor } from './ScheduleEditor'; +import { PipelinesPanel } from '../PipelinesPanel'; import { Zap, RefreshCw, @@ -29,25 +31,45 @@ import { Calendar, Search, X, + Package, + Bot, + Workflow, + Trash2, + Clock, } from 'lucide-react'; import { useToast } from '../ui/Toast'; +import type { ScheduleInfo } from '../../types/automation'; // === View Mode === type ViewMode = 'grid' | 'list'; +// === Tab Type === + +type AutomationTab = 'pipelines' | 'hands' | 'workflows'; + // === Component Props === interface AutomationPanelProps { initialCategory?: CategoryType; + initialTab?: AutomationTab; onSelect?: (item: AutomationItem) => void; showBatchActions?: boolean; } +// === Tab Configuration === + +const TAB_CONFIG: { key: AutomationTab; label: string; icon: React.ComponentType<{ className?: string }> }[] = [ + { key: 'pipelines', label: 'Pipelines', icon: Package }, + { key: 'hands', label: 'Hands', icon: Bot }, + { key: 'workflows', label: 'Workflows', icon: Workflow }, +]; + // === Main Component === export function AutomationPanel({ initialCategory = 'all', + initialTab = 'pipelines', onSelect, showBatchActions = true, }: AutomationPanelProps) { @@ -63,6 +85,7 @@ export function AutomationPanel({ const triggerWorkflow = useWorkflowStore((s) => s.triggerWorkflow); // UI state + const [activeTab, setActiveTab] = useState(initialTab); const [selectedCategory, setSelectedCategory] = useState(initialCategory); const [searchQuery, setSearchQuery] = useState(''); const [viewMode, setViewMode] = useState('grid'); @@ -70,6 +93,11 @@ export function AutomationPanel({ const [executingIds, setExecutingIds] = useState>(new Set()); const [showWorkflowDialog, setShowWorkflowDialog] = useState(false); const [showSchedulerDialog, setShowSchedulerDialog] = useState(false); + const [showBatchScheduleDialog, setShowBatchScheduleDialog] = useState(false); + const [workflowName, setWorkflowName] = useState(''); + const [workflowDescription, setWorkflowDescription] = useState(''); + const [isCreating, setIsCreating] = useState(false); + const [schedules, setSchedules] = useState>({}); const { toast } = useToast(); @@ -95,8 +123,14 @@ export function AutomationPanel({ if (searchQuery.trim()) { items = searchAutomationItems(items, searchQuery); } + // Filter by tab + if (activeTab === 'hands') { + items = items.filter(item => item.type === 'hand'); + } else if (activeTab === 'workflows') { + items = items.filter(item => item.type === 'workflow'); + } return items; - }, [automationItems, selectedCategory, searchQuery]); + }, [automationItems, selectedCategory, searchQuery, activeTab]); // Selection handlers const handleSelect = useCallback((id: string, selected: boolean) => { @@ -122,12 +156,95 @@ export function AutomationPanel({ // Workflow dialog handlers const handleCreateWorkflow = useCallback(() => { setShowWorkflowDialog(true); + setWorkflowName(''); + setWorkflowDescription(''); }, []); const handleSchedulerManage = useCallback(() => { setShowSchedulerDialog(true); }, []); + // Create workflow handler + const handleWorkflowCreate = useCallback(async () => { + if (!workflowName.trim()) { + toast('请输入工作流名称', 'error'); + return; + } + + setIsCreating(true); + try { + const createWorkflow = useWorkflowStore.getState().createWorkflow; + const result = await createWorkflow({ + name: workflowName.trim(), + description: workflowDescription.trim() || undefined, + steps: [], // Empty workflow, user will add steps later + }); + + if (result) { + toast(`工作流 "${result.name}" 创建成功`, 'success'); + setShowWorkflowDialog(false); + setWorkflowName(''); + setWorkflowDescription(''); + // Reload workflows + await loadWorkflows(); + } + } catch (err) { + const errorMsg = err instanceof Error ? err.message : '创建工作流失败'; + toast(errorMsg, 'error'); + } finally { + setIsCreating(false); + } + }, [workflowName, workflowDescription, toast, loadWorkflows]); + + // Batch schedule handler + const handleBatchSchedule = useCallback(() => { + if (selectedIds.size === 0) { + toast('请先选择要调度的项目', 'info'); + return; + } + setShowBatchScheduleDialog(true); + }, [selectedIds.size, toast]); + + // Save batch schedule + const handleSaveBatchSchedule = useCallback((schedule: ScheduleInfo) => { + // Save schedule for all selected items + const newSchedules: Record = {}; + selectedIds.forEach(id => { + newSchedules[id] = schedule; + }); + + setSchedules(prev => ({ ...prev, ...newSchedules })); + setShowBatchScheduleDialog(false); + setSelectedIds(new Set()); + + const frequencyLabels = { + once: '一次性', + daily: '每天', + weekly: '每周', + monthly: '每月', + custom: '自定义', + }; + + toast(`已为 ${Object.keys(newSchedules).length} 个项目设置${frequencyLabels[schedule.frequency]}调度`, 'success'); + }, [selectedIds, toast]); + + // Delete schedule + const handleDeleteSchedule = useCallback((itemId: string) => { + setSchedules(prev => { + const { [itemId]: _, ...rest } = prev; + return rest; + }); + toast('调度已删除', 'success'); + }, [toast]); + + // Toggle schedule enabled + const handleToggleScheduleEnabled = useCallback((itemId: string, enabled: boolean) => { + setSchedules(prev => ({ + ...prev, + [itemId]: { ...prev[itemId], enabled }, + })); + }, []); + // Execute handler const handleExecute = useCallback(async (item: AutomationItem, params?: Record) => { setExecutingIds(prev => new Set(prev).add(item.id)); @@ -186,6 +303,46 @@ export function AutomationPanel({ toast('数据已刷新', 'success'); }, [loadHands, loadWorkflows, toast]); + // If Pipelines tab is active, show PipelinesPanel directly + if (activeTab === 'pipelines') { + return ( +
+ {/* Header with Tabs */} +
+
+ +

+ 自动化 +

+
+ {/* Tab Switcher */} +
+ {TAB_CONFIG.map(({ key, label, icon: Icon }) => ( + + ))} +
+
+ + {/* Pipelines Panel */} +
+ +
+
+ ); + } + + // Hands and Workflows tabs return (
{/* Header */} @@ -200,6 +357,23 @@ export function AutomationPanel({
+ {/* Tab Switcher */} +
+ {TAB_CONFIG.map(({ key, label, icon: Icon }) => ( + + ))} +